воскресенье, 14 ноября 2010 г.

NXT-G: неочевидное поведение программы при работе с датчиком касания

Среда NXT-G при работе с датчиком касания предоставляет нам несколько событий, реакцию на которые можно обработать в программе.



Pressed - датчик касания зажат
Released - датчик касания отжат (не зажат)
Bumped - датчик касания нажат (зажат и отпущен)

Первая неочевидность возникает, когда мы знакомимся с с оффициальной документацией NXT-G. Она описывает действие Bumped как быстрое зажатие и отжатие в течении момента времени меньше, чем 0.5 секунды: Choose Bumped if you want the block to be triggered after a quick press and release of the touch sensor (less than 0.5 seconds in duration)

На самом деле простые тесты покажут, что Bumped обрабатывается как момент перехода между состоянием зажато в состояние отжато, причем неважно сколько при этом он был зажат.

Рассмотрим две программы:


- Первый звуковой сигнал будет, после зажатия на датчик касания
- После того, как датчик отпущен - ничего не происходит
- Нажмите на датчик еще раз, подержите его секунду-две, сразу после того как он отпущен, прозвучит еще один звуковой сигнал.


- Первый звуковой сигнал будет, после зажатия на датчик касания
- Второй сигнал - после отжатия датчика
- Если зажать датчик еще раз, подержать его секунду-две, то сразу после того как он отпущен, прозвучит третий звуковой сигнал.

Из того как обрабатывается событие Bumped: датчик отжат -> датчик нажат -> датчик нажат, вытекает еще одна особенность, которую необходимо предусматривать при программировании робота.
Например, робот должен стукнуть по мячу манипулятором с расположенным на нем датчиком касания. Если перед мячем нет никаких препятствий, то удар по мячу однозначно определиться датчиком касания - сначала мяч каснется датчика, потом отскочит от него, о чем датчик сообщит роботу и робот остановит манипулятор. Но если, скажем, мяч лежит у стенки, то мяч не отскочит от датчика, оставляя его зажатым, что приведет к тому, что блок Wait все еще будет в ожидании события и не остановит моторы.

Самая "странная" неочевидность возникает тогда, когда необходимо опрашивать состояния датчика Pressed и Bumped в ходе одной и той же программы с помощью блока опроса датчика (Sensor block) и блока Выбор (Switch).
Следующие программы иллюстрируют работу с датчиком через эти блоки:



Программы делают одно и тоже: после нескольких звуковых сигналов на дисплее отобразится был ли датчик нажат (Bumped) или нет.

Все становится гораздо сложнее, если необходимо написать программу для робота, например, работающего по следующему алгоритму: если датчик нажат (Bumped) - начать движение или остановится; если датчик зажат (Pressed) - ускоряться, если датчик отжат (Released) - замедляться.
Если описать это задание в виде блок-схемы:

То очевидная реализация его на NXT-G

не работает.
Первое условие никогда не распознает действие "нажато" (Bumped) и программа всегда идет по нижней ветке первого условия.

Эксперименты показывают, что как только помимо проверки на состояние Bumped в одной области видимости появляется проверка на состояние Pressed или Released, первая проверка перестает работать.
Так, например, если добавить еще одну проверку внутрь цикла в программу приведенную выше, то первая проверка игнорируется.


Но если одну из проверок вынести из цикла (т.е. сделать их в разных областях видимости), то Bumped состояние будет проверяться корректно:


Как вывод, можно сказать, что опрос Bumped и Pressed/Released состояний сенсора касания в рамках одной программы возможен, но, скорее всего, придется писать свою собственную реализацию механизма выявления состояния Bumped, который во многом зависит от того, как (по условиям задачи) нужно будет отличать Bumped от Released

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

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

Related Posts Plugin for WordPress, Blogger...