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

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 секунды. При достаточно большой скорости робота, может получиться так, что за это время он может уже доехать до стены и, врезавшись в нее, перевернуться.
Следовательно, при опросе сенсора расстояния в цикле необходимо минимизировать количество обращений к нему.
Например, можно опросить сенсор один раз, занести результат опроса в переменную, а, затем, уже извлекать данные из нее. Для алгоритма описанного выше, это позволит ускорить реакцию на приближающуюся стену почти в два раза:

13 комментариев:

  1. Скажите почему при загрузке программы на NXT он дает ответ, что файл поврежден и программа не ра ботает

    ОтветитьУдалить
  2. Любой программы или только определенной? А если на другой NXT блок?
    Чем компилируете и загружаете?

    ОтветитьУдалить
  3. При попытке загрузить с компьютера в NXT любую из трёх программ, взятых с сайта Лего для Alpha-rex (набор Mindstorms), появляетя ошибка: "There is data wire that is connected to a plug of the wrong type. Error code 5024". Как я понимаю, такую ошибку может вызвать компонент "data wire", но он присутствует только в двух из этих трёх программах, в "arex ultra" и "DanceMusic". В "arex welcome" нет "data wire". Более того, корректность "data wire" проверяется на стадии составления программы, и неправильные связи обозначаются серым пунктиром. В этих же программах связи сплошные и цветные. Никто не может подсказать, в чём дело?

    ОтветитьУдалить
  4. А какая версия NXT-G? и какая версия NXT?

    ОтветитьУдалить
  5. А ваши собственные программы нормально идут? Программы для Rex вы скачали для NXT2.0? У вас не отображаются блоки со знаком вопроса?

    ОтветитьУдалить
  6. Мои самодельные программы загружаются в NXT без ошибок. Готовые взял отсюда
    http://mindstorms.lego.com/en-us/support/buildinginstructions/8527%20-/Alpha%20Rex%20-%20program.aspx
    Там не уточняется, для какого именно NXT.
    Знака вопроса на блоках нет.
    Программа Spike.rbt, взятая отсюда
    http://mindstorms.lego.com/en-us/support/buildinginstructions/8527%20-/Spike%20-%20program.aspx
    загружается без ошибок.

    ОтветитьУдалить
  7. Только сейчас заметил, что у меня набор 8547, а на сайте программы для 8527. Но блоки то NXT у них одинаковые. Разные PC-оболочки (редакторы). Неужели программы составленные в предыдущей оболочке необязательно будут работать в современной?

    ОтветитьУдалить
  8. Скорее всего это и есть ответ.

    ОтветитьУдалить
  9. А почему t=V/S и 1/66 = 0,15?

    ОтветитьУдалить
    Ответы
    1. Ну да, конечно, ошибка! должно быть 0,015 с. Вы сразу видно - внимательный читатель! Побольше бы таких!

      Удалить
    2. Александр! У Вас ответ правильный (после исправления 0,015 с), а вот исходная формула неверна: надо t = 2 * L / Vsound

      Удалить

Related Posts Plugin for WordPress, Blogger...