понедельник, 19 марта 2012 г.

Накопление данных с сенсоров, как средство отладки

В ходе отладки программ для Lego роботов, особенно когда идет интенсивная работа с сенсорами, возникает ситуация когда сенсор вопреки ожиданиям не срабатывает на какое-то значение. В таком случае используется обычно подход "попробуй и измени" (try and fix): сначала выставляется одно значение, если оно не работает, то выставляется другое и так может продолжаться очень долго.
Помимо временных затрат, данный метод не дает понимания почему одни значения не работают, а другие начинают работать.
Метод, который является более научным и дает мозгу пищи для размышлений, - метод сбора и анализа данных. Этот метод подразумевает, что в ходе запусков робота, используется такой инструмент, что все (или большинство значимых) данных с сенсоров где-то сохраняются, а потом, после прогона робота, анализируются для того, чтобы сделать выводы какие же именно пограничные значения должны быть выставлены для сенсоров в программе, чтобы она работала верно.

В образовательной (education) версии Lego Mindstorms NXT-G 2.0 такой режим включен в программу. В коробочных (retail) версиях данного продукта, эта функциональность отсутствует. Но это не должно мешать использовать предложенный метод, поскольку организовать накопление и запись данных можно самостоятельно.

Например, следующая программа выводит данные с звукового сенсора на экран в виде гистограммы. Каждый раз на экране отображаются данные за последние 2 секунды.



Когда недалеко от сенсора звука будет происходить разговор, на экране NXT блока отобразится информация подобная той, что на картинке ниже:


Горизонтальные линии на экране обозначают различный уровень выходного сигнала: самая нижняя линия - 25%, средняя - 50%, самая верхняя линия - 75%.

Как видно из диаграммы, полученной в ходе накопления и отображения информации, редко какое слово в разговоре по громкости звучит больше, чем 50%. Поэтому, если в программе, реагирующей на звук разговора, мы хотим указать наиболее подходящие значения срабатывания, то имеет смысл рассматривать значения в 30-35%.

Аналогичная программа на языке Not Exactly C (NXC), будет выглядеть следующим образом:
task main() {
    SetSensor(IN_4, SENSOR_SOUND);
    ClearScreen();

    Wait(500);

    int data=0;

    while(1) {
        for(int i=0; i<100; i++) {
            LineOut(i, 0, i, 63, DRAW_OPT_CLEAR_PIXELS);
            PointOut(i, 15);
            PointOut(i, 31);
            PointOut(i, 47);
            Wait(20);
            data=Sensor(IN_4);
            LineOut(i, 0, i, data*0.63);
        }
    }
}
Ограничения экрана не позволят нам увидеть очень много значений, когда данные должны быть накоплены в течении долгого промежутка времени. Например, в ходе пробной попытки состязаний роботов. В таком случае, выглядит логичным сохранять значения в файл. А потом на компьютере открывать этот файл для анализа.

В данной программе опять считываются данные с звукового сенсора и при этом записываются в файл. Обратите внимание на имя файла - с расширением ".csv" - нужно для того, чтобы потом этот файл можно было бы легко открыть в Excel. Также помимо показаний сенсора записывается время с начала запуска программы. Время и показания записываются через точку с запятой (;) - это также нужно для автоматического форматирования файла в Excel.
task main() {
    SetSensor(IN_4, SENSOR_SOUND);
    SetSensor(IN_1, SENSOR_TOUCH);

    Wait(500);

    int data=0;
    long t0, time;
    byte fh;
    short bw;
    string write, tmp;

    t0=CurrentTick();
    
    DeleteFile("data.csv");
    CreateFile("data.csv", 4096, fh);

    while(SENSOR_1 == 0) {
        data=Sensor(IN_4);
        time=CurrentTick()-t0;
        write=StrCat(NumToStr(time), ";", NumToStr(data));
        WriteLnString(fh, write, bw);
        Wait(20);
    }
    CloseFile(fh);
}
Теперь остается просто скачать получившийся файл в компьютер/ноутбук, открыть его в Excel (или любой другой программе для работы с электронными таблицами) и построить график по полученным данным:



Из графика видно, что начиная где-то с 3 секунды (ось X измеряется в миллисекундах) датчик начал воспринимать какие-то шумы, которые продолжались в течении 4,5 секунд. При этом шумы по своей громкости не достигали и 50%, а пики больше 40% были зафиксированы только дважды.

В NXT-G также можно записывать данные с сенсоров в файл, просто это не показывается в данном материале. Желающие могут обратиться к соответствующей статье, показывающей работу с файлами в NXT-G.

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...