ДО курс по робототехнике

3 апреля 2013 г.

NXT-G: опрос сенсора расстояния (UltraSonic)

В стандартной поставке Lego Mindstorms NXT есть четыре сенсора:
* касания (Touch)
* звука (Sound)
* световой (Ligth)
* расстояния (Ultrasonic)

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

С сенсором расстояния дела обстоят немного сложнее. По своему физическому устройству его можно представить как передатчик и приемник: передатчик испускает волну в ультразвуковом диапазоне, волна отраженная от удаленной поверхности улавливается приемником. 



При написании программ для NXT это означает, что передатчик испускает звуковую волну после того как, программа обратиться к сенсору расстояния. 

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

Давайте рассчитаем теоретический предел задержки.

Стандартный ультразвуковой сенсор, поставляемый с набором Mindstorms, позволяет определять расстояние до 2,5 метров (или 100 дюймов). Т.е. зная скорость звука (пусть будет 330 м/c) можно рассчитать, что максимальное время ожидания вернувшейся волны.

Еще одна особенность в том, что работа с сенсором устроена таким образом, что он всегда ждет максимальное время. Т.е. даже если препятствие находится на расстоянии 10 см., то результат программе вернется все равно не раньше, чем через 1/66 секунды.

Простейшая программа позволит проверить так ли на самом деле и не расходятся ли теоретические выкладки с реальным использованием:

Как показывает эксперимент, реальная задержка - это примерно 1/17 секунды (0,058 секунды). Видимо, это связано с внутренней реализацией NXT-G функции опрашивающей сенсор - дополнительные проверки, инициализации, возможно защита для многопотокового использования и т.п.
Следует отметить, что для других языков программирования задержка будет меньше. Например, при аналогичной программе на NXC, он будет примерно 1/34 секунды.

Так что же дает нам это знание?
Чтобы лучше понять это, рассмотрим несколько примеров.

Пример 1.

Необходимо сделать робот-радар. Т.е. датчик установлен на двигателе двигатель вращается так, что робот должен обозревать пространство с углом обзора в 180 градусов. Как результат, отсканированное пространство будет отображено на экране NXT блока. 
Предположим, что время, за которое двигатель делает оборот в 180 градусов - 0,5 секунды. Это значит, что, если программа в цикле опрашивает сенсор расстояния в течении этого поворота, то цикл выполниться 8-9 раз. Иными словами, радар будет "выстреливать" волну каждые 20 градусов.

Очевидно, что такой радар не годиться, поскольку он не обнаружит большинство объектов.
Таким образом, необходимо рассчитать скорость вращения двигателя, так чтобы сенсор расстояния опрашивался как можно чаще в течении поворота. Например, если желательное разрешение радара - 2 градуса, то за один оборот радара сенсор должен опроситься 90 раз, что займет 90/17 = 5,3 секунды. Т.е. двигатель должен двигаться в 10 раз медленнее. Чтобы достичь этого скорее всего придется использовать шестерную передачу.

Пример 2.
Допустим, составлена программа для движения робота вдоль стены на расстоянии 10 см., так что робот находится в трех состояниях: выполнять поворот к стене, выполнять поворот от стены, не выполнять никакого поворота. Условия смены состояний следующие:
- если расстояние до стены больше 12 см., выполняем поворот к стене
- если расстояние до стены меньше 8 см., выполняем поворот от стены
- если расстояние больше 8 см., но меньше 12 см., не выполнять никакого поворота

Имея два вложенных опроса сенсора, общая задержка выяснения расстояния для того, чтобы среагировать на поворот от стены является 0,117 секунды. При достаточно большой скорости робота, может получиться так, что за это время он может уже доехать до стены и, врезавшись в нее, перевернуться.
Следовательно, при опросе сенсора расстояния в цикле необходимо минимизировать количество обращений к нему.
Например, можно опросить сенсор один раз, занести результат опроса в переменную, а, затем, уже извлекать данные из нее. Для алгоритма описанного выше, это позволит ускорить реакцию на приближающуюся стену почти в два раза:

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

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