- Фильтрация данных позволяет упростить программирование движения робота вдоль стены
- пятница, 26 ноября 2010 г.
- Алгоритмы: движение вдоль стены
- Как построить робота – следование за стеной
- Обзор
- Следование за стенами
- Программирование
- robot_wall_follower.ino
- robot.h
- robot.ino
- Следование вдоль стен на моей кухне
- Заключение
- Циклы
- Простейшие виды циклов
- Движение робота по линии
- Цикл со счётчиком. Передача данных между блоками
Фильтрация данных позволяет упростить программирование движения робота вдоль стены
пятница, 26 ноября 2010 г.
Алгоритмы: движение вдоль стены
Не правда ли программа, заданная в качестве задачки на понимание NXT-G в этом посте, похожа на программы, поясняющие движение вдоль линии, в этом?
Разница между программами в том, что в одной используются сенсор расстояния, а в другой — сенсор овещенности. В остальном программы похожи: робот меняет направление поворота после того как значение на сенсоре измениться.
Если быть более точным, то в задаче робот поворачивает вправо, если расстояние на сенсоре меньше 14 см. и влево, если расстояние на сенсоре больше 16 см. Сложно представить, для чего может понадобиться такое движение, если сенсор смотрит вперед или назад. Но многое встает на свои места, если предположить, что сенсор установлен на одном из бортов робота и смотрит в сторону.
Если нарисовать схему такого движения, то становится видно, что по левому борту робота на протяжении всего движения, находится какое-то препятствие и робот пытается не подъезжать к нему слишком близко и не отъезжать слишком далеко. Если предположить, что препятствие это стена, то движение робота можно назвать движением вдоль стены. При некрутых заворотах стены, робот будет стараться держаться на определенном расстоянии, т.е. поворачивать вместе с заворотом стены.
Кстати, этот вариант ответа (движение вдоль стены) тоже был среди ответов, которые были присланы после публикации задачи.
Как и с предложенным алгоритмом движения вдоль линии, следует помнить, что данная реализация движения вдоль стены тоже является базовой для изучения. Т.е. при решениях реальных задач, алгоритм движения будет значительно сложнее, но принцип движения останется тот же.
Сейчас же хотелось бы обратить внимание на одну деталь, об которую довольно часто «спотыкаются» те, кто только начинает реализовывать дивжение вдоль стены.
В общем случае, движение робота параллельно стене и сенсор расстояния показывает вполне ожидаемые значение, на основе которых принимается решение в какую сторону поворачивать.
Но может возникнуть ситуация, когда робот в попытке вновь приблизиться к стене, значительно повернется к ней. Это приведет к тому, что сенсор начнет показывать очень большое расстояние — данные после отражения от стены не поступают в сенсор и он «думает», что препятствие еще слишком далеко.
В этом случае, робот будет стараться приблизиться к стене, увеличивая угол между сенсором и стеной, что только будет усугублять ситуацию.
Источник
Как построить робота – следование за стеной
Как построить робота (от Travis Fagerness)
Заставьте своего робота следовать за стеной!
Обзор
Это шестая часть из серии статей о моем опыте построения робота, который мог бы выполнять разные простые вещи. Я думал, что было бы замечательно создать робота, которого легко было бы собрать лишь с одним паяльником, и комплектующие к нему были бы доступны. Я составил следующий список требований к этому роботу:
- Многие наборы стоят дорого, поэтому он должен быть относительно недорог.
- Он должен быть простым в сборке, не требуя специального оборудования.
- Он должен быть простым в программировании, не требуя сложных IDE и программатора.
- Он должен быть мощным для расширяемости.
- Он должен запускаться от простого источника питания.
- Он должен быть способен следовать за линией или за стеной и избегать препятствий.
В данной статье я расскажу о том, как запрограммировать робота, чтобы тот следовал за стенами.
Следование за стенами
Чтобы следовать за стенами, вам нужно как минимум два датчика (2 бита информации) для обработки четырех потенциальных ситуаций, в которых робот может оказаться. Один датчик должен быть спереди, а второй слева или справа от робота. Чем больше датчиков вы используете, тем больше будет у вас информации, позволяющей лучше определить, что происходит. Для этого примера я использовал только два. Робот не может найти стену, поэтому вы должны поместить робота рядом с ней. Если вы поместите робота посередине робота, он будет просто кататься по кругу.
Передний датчик | Правый датчик | Ситуация | Действие |
---|---|---|---|
нет | нет | Робот удаляется от стены | Вернуться назад к стене, повернуть направо. |
да | нет | Робот далеко от стены, но направлен на стену или на препятствие. | Резко повернуть налево, чтобы встать параллельно со стеной. |
нет | да | Робот следует вдоль стены. | Двигаться вперед. |
да | да | Робот находится в углу. | Резко повернуть налево. |
Для правильной работы мне пришлось добавить код для резкого поворота налево. Резкий поворот налево просто означает, что я включаю только правое колесо, поэтому робот разворачивается практически на месте, а не продолжает при повороте двигаться вперед. Я не мог медленно поворачиваться, как в примере со следованием за линией, потому что мы не знаем, насколько близко робот находится от стены. Это ограничение датчика, который я выбрал, поскольку отраженный сигнал зависит от типа поверхности. Кроме того, используется только двоичная логика, поскольку нет способа определить расстояние на основе показаний выбранного датчика. Если бы мы знали расстояние, то могли бы добавить дополнительную логику, чтобы изменять скорость в зависимости от расстояний, чтобы робот быстрее перемещался по комнате. На самом деле я не смог получить от датчика показаний принятого сигнала, отраженного от полностью черной поверхности; поэтому на видео вы увидите, что перед посудомоечной машиной мне пришлось положить белую поверхность. У ультразвукового датчика такой проблемы не будет.
Программирование
Приведенный ниже скетч реализует следующую логику:
- Запускает драйвер робота и ждет 5 секунд. Это дает нам время поставить робота у стены, прежде чем он начнет движение.
- Прочитать показания датчиков.
- Определить состояние по таблице истинности, используя инструкции if .
- Каждый оператор выполняет действие, зависящее от состояния датчиков.
Примечание: в каталог со скетчем программы необходимо поместить файлы библиотеки Robot ( robot.ino и robot.h ), исходный текст которых приведен в третьей статье из данной серии.
robot_wall_follower.ino
Для резкого поворота налево необходимо внести некоторые изменения в файлы robot.h и robot.ino .
robot.h
Добавьте HARD_LEFT в перечисление направлений.
robot.ino
Добавьте case для HARD_LEFT в rbt_move() .
Следование вдоль стен на моей кухне
Заключение
В данной статье я показал, как вы можете использовать датчики приближения для следования вдоль стен, чтобы перемещаться по комнате. Это завершает серию статей по созданию робота. Теперь робот может автономно следовать за линией, вдоль стены и избегать препятствий. Можете объединить их в одном роботе, который мог бы делать всё это? Вы также можете добавить управление, добавив BLE модуль, и управлять модулем со своего телефона!
Источник
Циклы
При написании программ часто возникает необходимость в циклическом повторении группы команд. Для этого используется языковая конструкция цикл, которой в NXT-G соответствует блок Loop .
Внутрь цикла помещаются блоки, которые нужно выполнить многократно. Заметим, что следует с осторожностью (точнее, с пониманием) размещать в цикле блоки, которые сами в некотором роде обладают цикличностью, например Move , Sound и некоторые другие.
Программируя цикл, мы должны заранее знать в каком случае он прекратит свою работу. Завершение цикла (выход из цикла) может происходить по разным причинам. В NXT-G возможны следующие способы выхода из цикла, доступные в поле Control :
- Forever — бесконечно (по умолчанию);
- Sensor — по срабатыванию датчика;
- Time — через определённое время;
- Count — после выполнения цикла заданного количества раз;
- Logic — при выполнении некоторого логического условия, заданного программистом.
В процессе изучения языка NXT-G мы постепенно освоим все эти способы. Начнём с бесконечного цикла.
Простейшие виды циклов
Задание 4.1. Подготовьте робот с датчиком цвета в передней части; датчик должен быть направлен вниз и находиться на расстоянии около 1 см от стола. Расположите робот перед чёрным полем (или чёрной линией) на расстоянии от неё около 20 см.
Задание 4.2. Движение до линии. Используя датчик цвета в режиме измерения освещённости, напишите программу, позволяющую роботу доехать до чёрной полосы и остановиться (см. задание 3.3).
Задание 4.3. Движение до линии и обратно. Измените программу из задания 4.2 так, чтобы после достижения чёрной линии робот отъезжал на белое поле.
Задание 4.4. Бесконечное циклическое движение до линии и обратно. Измените программу из задания 4.3 так, чтобы робот выполнял движение до линии и обратно бесконечное количество раз. Для этого заключите предыдущую программу в бесконечный ( forever ) цикл.
Задание 4.5. Циклическое движение до линии и обратно по счётчику. Измените программу из задания 4.4 так, чтобы робот выполнял движение до линии и обратно три раза. Для этого измените настройки цикла следующим образом:
Движение робота по линии
Пример 4.1. Перейдём к классической задаче о движении робота вдоль линии. Полигон с такой линией имеется в каждом наборе.
Разберёмся, может ли робот двигаться по линии, то есть так, чтобы сенсор всегда находился на чёрном поле. Для этого представим себе, что через некоторое время после старта сенсор «уехал» с чёрного поля и оказался на белом. Мы понимаем, что в этом случае робот должен немного подрулить чтобы вернуться обратно на чёрную линию. Но куда именно подрулить: налево или направо? Дело в том, что белый цвет по обе стороны от чёрной линии одинаков. Поэтому, попав в такую ситуацию, робот не сможет принять однозначное правильное решение.
Выходом из такой ситуации будет небольшое изменение постановки задачи: робот должен двигаться не по линии, а по границе чёрного и белого.
Что при этом изменится? Робот и человек по-разному воспринимают границу линии.
Мы видим, что датчик цвета при своём движении влево или вправо не наблюдает резкой границы чёрного и белого. Это происходит из-за того, что при его перемещении, например, слева направо, количество света, попадающего в сенсор, постепенно увеличивается. Значит показания датчика также будут плавно возрастать.
Нас больше всего устраивает среднее положение датчика, то есть когда он находится прямо над границей. В этом случае датчик наблюдает не чёрный и не белый цвета, а некоторый «средний» — серый. Для определения показания датчика для серого цвета нужно найти среднее арифметическое между белым и чёрным.
При движении робота уход влево (в чёрную область) приведёт к уменьшению показаний датчика, а уход вправо (в белую область) — к увеличению. Таким образом мы всегда сможем отличить левое от правого.
Получим примерно такую программу для движения вдоль линии:
Обратите внимание на следующее: перед стартом робот ставится на поле так, чтобы датчик цвета «смотрел» на границу линии: чёрное — слева, белое — справа.
Задание 4.6. Найдите отличия между предложенным решением и программой из задания 4.4.
Задание 4.7. Запрограммируйте робот на движение вдоль чёрной линии, изменив код программы 4.4 и проверьте её работоспособность.
Задание 4.8. Требуется запустить робот по той же линии, но в обратную сторону. Как это сделать не изменяя программу?
Цикл со счётчиком. Передача данных между блоками
Разберём следующий пример.
Пример 4.2. Написать программу движения робота с ускорением.
Для начала напишем программу движения робота с постоянной скоростью:
В настройках блока Move отметьте Coast (без торможения в конце выполнения блока). В поле Duration оставим значение 1 Rotation .
Проверьте работу программы. Робот движется прямо с постоянной скоростью.
Для создания ускорения будем использовать передачу данных из цикла на блок движения. Очевидно, в нашем случае ускорение предполагает постепенное увеличение скорости робота, то есть увеличение мощности мотора.
В настройках блока Loop включите флажок Show Counter (Показать Счётчик). Обратите внимание на то, как изменился внешний вид цикла: появился разъём Loop Count
Откройте концентратор данных блока Move , щёлкнув на кнопке в левой нижней части блока:
В результате откроются входные (расположенные на левой стороне) и выходные (расположенные на правой стороне) разъёмы, к которым можно подключать шины данных от разъёмов других блоков 1 Щёлкнув по тому же месту блока можно закрыть выдвижную панель. (Рис. 4.8). Таким способом можно передавать данные внутри программы на NXT-G без фактического использования переменных.
Соедините шиной разъём счётчика цикла и разъём Power (Мощность) блока Move (при наведении указателя мыши на разъём появляется соответствующая всплывающая подсказка). Чтобы сделать соединение, щёлкните левой кнопкой мыши на начало, проведите мышь в конец пути и щёлкните ещё раз; можно делать дополнительные щелчки по ходу траектории в местах её желаемых сгибов. В поле Duration укажите Unlimited (без ограничения длительности). Сверните концентратор данных щёлкните по выпадающей панели блока так, как будто хотите её свернуть. Все разъёмы, к которым не подходят шины, исчезнут. Этот трюк может заметно уменьшить площадь, занимаемую программой.
В результате программа примет вид:
Проверьте её работу.
Для того чтобы ускорение было более наглядным, добавьте в цикл небольшую задержку:
Пример 4.3. Вывод информации на экран блока NXT.
Проверим, что на самом деле поступает из цикла на вход блока Move . Для этого разработаем упрощённую программу, в которой значение счётчика цикла выводится на экран блока NXT. Напомним, что для вывода используется блок Display из панели Common .
Мы собираемся выводить на экран числовую информацию, поэтому её нужно вначале преобразовать к текстовому типу. Делается это при помощи блока Number to Text панели Advanced .
Получаем следующую схему программы:
- в настройках блока Loop значение счётчика устанавливаем равное 10;
- значение счётчика цикла передаём на преобразователь «Число → Текст»;
- полученный текст подаём на вход блока Display ;
- делаем задержку, чтобы успеть рассмотреть значение на экране;
- после цикла ставим задержку до нажатия на кнопку Start , чтобы рассмотреть последнее выведенное на экран значение.
Пример программы приведен на Рис. 4.12.
Обратите внимание на то, что шины разных данных окрашены по-разному. Всего в NXT-G используются три типа данных, каждому из них соответствует своя окраска:
- числовой тип данных — жёлтый цвет;
- текстовый тип данных — красный цвет;
- логический тип данных — зелёный цвет.
На Рис. 4.13 приведены настройки последнего блока:
Источник