Предыдущий цикл статей, в котором давались советы относительно того как выходить из лабиринта не закончился самым главным - там было объяснено правило правой руки, давался обзор тактик решения задачи для средней категории World Robot Olympiad 2011, советы по тому, какими датчиками и как пользоваться, но так и не было рассмотрено, как написать самую простую программу. Настало время наверстать этот момент. |
- Движение прямо с опросом датчиков, обнаруживающих проход справа, и датчиков, обнаруживающих столкновение с преградой
- Поворот направо, в случае обнаружения прохода
- Поворот налево, в случае обнаружения препятствия
В общем случае обычное движение прямо - не самый сложный элемент в программе. Теми нюансами, которые появляются в ходе такого движения, на первых порах можно пренебречь, сфокусировавшись на других основных элементах алгоритма - выполнении поворотов.
Здесь следует ненадолго остановиться и опять вернуться к рассмотрению конструкции робота.
Первый случай - поворот направо. Подразумевается, что он происходит после срабатывания датчика смотрящего в сторону.
После такой остановки, робот может выполнить два возможных поворота: либо поворот одним колесом, либо поворот вокруг своей оси.
Видно, что после такого поворота, дальнейшее движение робота прямо приведет к столкновению со стеной. Эту проблему можно решить двумя способами:
- сдвинув датчик назад
- или просто переместив робота после обнаружения прохода, но до выполнения поворота чуть-чуть вперед.
Теперь следует рассмотреть с таких же позиций разворот налево.
Очевидно, что для выполнения поворота роботу нужно достаточно места. И тут опять несколько способов обеспечения этого:
- обнаруживать препятствие заранее
- или расположить ведущие колеса тележки так, чтобы они были самой крайней задней точкой робота. Тогда робот сможет сделать разворот назад вместо того, чтобы упираться в стену при повороте вперед.
Идеальной будет комбинация обеих вариантов - это позволит роботу двигаться достаточно близко к стене и иметь возможность заранее выполнять повороты в случае обнаружения препятствия.
Что ж, с конструкцией более-менее стало понятно, с тем как выполнять развороты тоже. В идеале, после таких экспериментов должны остаться два готовых набора блоков, которые можно будет впоследствии вставлять в основную программу. Имеет смысл занести эти куски программы в собственные блоки.
Структура основной программы однозначно диктуется правилом правой руки:
Алгоритм начинает свое выполнение с движение вперед. Как уже говорилось, в общем случае, это может быть обычное движение.
Затем, друг за другом идет проверка на обнаружение прохода в правой стене, либо на обнаружение столкновения с препятствием. И, в зависимости от того, какая проверка сработала, вызываются блоки поворотов. Если никакая проверка не сработала в этот момент времени, то в следующий момент времени нужно сделать еще одну проверку, а потом еще и еще.
Очевидно, что после выполнения поворотов нужно опять продолжить движение вперед, и опять перейти к проверкам на проход или препятствие.
Такой алгоритм обладает недостатком: его сложно реализовывать на языке NXT-G (да и на других языках тоже), поскольку он имеет две точки возврата после выполнения одних и тех же повторяющихся действий. К тому же, единожды включив двигатели на движение вперед после старта или после поворотов, этот алгоритм не подразумевает попытку подправить свое движение, если возникнет необходимость для перемещения ровно вдоль стены. Логично было бы все время выполнять периодическую корректировку или просто добиться упрощения алгоритма, принимая во внимание, что команды "включить мотор" не блокируют дальнейшую работу алгоритма, а передают управление следующим инструкциям.
В итоге, программа на языке NXT-G будет похожа на подобную конструкцию:
Как уже говорилось, блок движение вперед может быть замещено специальным блоком, который бы обеспечивал перемещение вдоль стены. Хотя во многих случаях эта проблема может быть решена чисто механически: у робота с нужно стороны устанавливаются ролики или направляющие, которые не позволяют ему слишком приблизиться к стене.
Примеры такого решения можно подсмотреть в роликах ниже:
При этом, чтобы не отъезжать далеко от стены, нужно двигаться чуть-чуть с заворотом (распределение нагрузки между моторами) в сторону стены.
Мы в свое время действовали чуть-чуть по-другому. Датчик расстояния на роботе крепился к мотору, и мог поворачиваться. Т.е. для проверки, где свободно, всему роботу необходимости поворачиваться нет.
ОтветитьУдалитьВ алгоритме выше, робот не проверяет, где свободно поворотом - он просто следует алгоритму движения вдоль правой стены. Причем описан простой алгоритм, без оптимизаций.
УдалитьА так, действительно, робот при заезде в тупик робот может сразу распознать это повернув датчик налево. И если он оказался в тупике, то разворачиваться не на 90 градусов, а на 180.
какая программа здесь стоит
ОтветитьУдалитькакая программа
ОтветитьУдалитьЧто делать если я делаю это на EV 3?
ОтветитьУдалитьЯЯЯЯЯЯЯ
Команды аналогичные, блоки по виду и цвету чуть различаются.
Удалитьтак точно
Удалитьно и программы различны
ОтветитьУдалитьNinoxt: Робот Для Состязаний: Выход Из Лабиринта. Часть V >>>>> Download Now
ОтветитьУдалить>>>>> Download Full
Ninoxt: Робот Для Состязаний: Выход Из Лабиринта. Часть V >>>>> Download LINK
>>>>> Download Now
Ninoxt: Робот Для Состязаний: Выход Из Лабиринта. Часть V >>>>> Download Full
>>>>> Download LINK