В ходе отладки программ для 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.
Комментариев нет:
Отправить комментарий