Соревновония Lego роботов 2.Соревновония Lego роботов 1.

Ожидание изменений показаний датчика

Аватар пользователя Овсянников Алексей Юрьевич

В одной из недавних статей Александра Колотова, преподавателя робототехники из Нижнего Новгорода, упоминалась новая функция среды программирования робота Lego Mindstorms EV3 - будут блоки, способные ожидать ИЗМЕНЕНИЕ показаний датчика. То есть, не каких-то определенных показаний, а любое их изменение. Вроде как сигнализация на движение: запустиил мы робота в пустой комнате, он смотрит вокруг датчиками расстояния и как только показания изменяются - значит в комнату кто-то зашел или в ней что-то движется.

На мой взгляд, не такая уж сложная задача сделать что-то подобное для NXT-робота на NXT-G, RoboLab или NXC. Проверим, так ли это?

Если логически "разбить" программу на действия, то получится примерно следующий алгоритм:

  1. запомнить показания датчика в момент начала ожидания;
  2. считать показания датчика;
  3. сравнить считанные показания с начальными - если есть разница, то ожидание окончено. Если разницы нет - то вернуться к пункту 2.

Уж не знаю, с какой точностью будут работать датчики в новом конструкторе Lego Mindstorms EV3, но в NXT они имеют небольшой "дрейф": один и тот же датчик может одну и ту же величину определять с небольшим отклонением. Так, датчик расстояния, направленный на неподвижную стену на расстоянии 50 сантиметров, может "увидеть" и 50, и 49, и 51 сантиметр. Значит даже если ничего вокруг робота не изменилось, датчики могут зафиксировать изменение. Поэтому в нашем алгоритме пункт 3 нужно изменить:

  • сравнить считанные показания с начальными - если разница больше допустимой, то ожидание окончено. Если разница меньше допустимой - то вернуться к пункту 2. 

Подобная программа на NXT-G будет выглядить следующим образом (подходит для всех датчиков, имеющих показания в виде числа):

Первый блок считывает первичные показания - некое число, с которым в дальнейшем будем все сравнивать. Дальше идет цикл, обеспечивающиц ожидание - он закончится только когда показания датчика изменятся. Для этого вторым блоком на каждом шагу считываем текущие показания датчика, и направляем их в третий блок - математическое действие. В этом блоке из текущих показаний вычитаем первичные. Вот в этом блоке и кроется вся "суть-соль": если показания датчиков одинаковые, то разница (результат вычитания) получится нулевой. Если показания немного отличаются, то разница будет небольшой. А если текущие показания намного больше начальных, то и разница будет значительной. Но следует помнить, что показания могут как увеличиться со временем, так и уменьшиться - в этом случае получим отрицательную разницу. Поэтому необходимо "отбросить" знак разницы, то есть взять ее модуль (абсолютное значение), что и делается в четвертом блоке. Ну и роль последнего блока очевидна - сравниваем получившееся абсолютное значение разницы с заранее заданным "порогом срабатывания". Если разница больше, чем порог, то блок вырабатывает на выходе сигнал "истина" и цикл завершается - программа может выполнять дальнейшие действия.

Подобная программа на RoboLab'е будет выглядеть уже так:

Кстати, если заранее известно, в какую сторону будут изменяться показания датчика звука или датчика света, то можно использовать стандартные блоки RoboLab "Ждать светлее/темнее на" и "Ждать тише/громче" на, установив для них порог срабатывания. К сожалению, стандартных блоков для остальных датчиков не предусмотрено.

Укажу несколько нюансов использования подобных программ:

  • датчик нажатия в NXT-G умеет выводить необработанные данные в форме числа, с которым можно работать как и со всеми остальными датчиками;
  • датчик цвета в NXT-G выводит цвета в форме чисел - каждое число обозначает свой цвет. В этом случае порог срабатывания должен быть нулевым;
  • RoboLab не умеет работать с датчиком цвета Lego, а датчик цвета HiTechnik, с которым он работает, выводит показания в форме числа. Порог срабатывания можно установить отличным от нуля, что позволит пропускать оттенки, а срабатывать только на изменение основного цвета.

Надеюсь, кому то эти знания пригодятся в будущем. А пока, для закрепления материала, предлагаю попытаться Вам написать подобные программы на языках NXC или RobotC, или любом другом, понравившемся Вам.