среда, 3 апреля 2013 г.

Робот для состязаний: выход из лабиринта. Часть V

Предыдущий цикл статей, в котором давались советы относительно того как выходить из лабиринта не закончился самым главным - там было объяснено правило правой руки, давался обзор тактик решения задачи для средней категории World Robot Olympiad 2011, советы по тому, какими датчиками и как пользоваться, но так и не было рассмотрено, как написать самую простую программу. Настало время наверстать этот момент.
Итак, сперва следует напомнить, какие же основные блоки определяют поведение робота в лабиринте:
  1. Движение прямо с опросом датчиков, обнаруживающих проход справа, и датчиков, обнаруживающих столкновение с преградой
  2. Поворот направо, в случае обнаружения прохода
  3. Поворот налево, в случае обнаружения препятствия


В общем случае обычное движение прямо - не самый сложный элемент в программе. Теми нюансами, которые появляются в ходе такого движения, на первых порах можно пренебречь, сфокусировавшись на других основных элементах алгоритма - выполнении поворотов.

Здесь следует ненадолго остановиться и опять вернуться к рассмотрению конструкции робота.

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


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


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


Теперь следует рассмотреть с таких же позиций разворот налево.


Очевидно, что для выполнения поворота роботу нужно достаточно места. И тут опять несколько способов обеспечения этого:
  • обнаруживать препятствие заранее
  • или расположить ведущие колеса тележки так, чтобы они были самой крайней задней точкой робота. Тогда робот сможет сделать разворот назад вместо того, чтобы упираться в стену при повороте вперед.
Из схемы становиться понятно, почему при таком способе расположения колес надо стараться минимизировать проекцию робота на пол: здесь следует рассматривать вертикальное расположение и блока и колес. Иначе после разворота датчик, отслеживающий проход будет располагаться слишком далеко от стены, что может приводить к ложным срабатываниям - он будет думать, что увидел проход.

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

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


Структура основной программы однозначно диктуется правилом правой руки:


Алгоритм начинает свое выполнение с движение вперед. Как уже говорилось, в общем случае, это может быть обычное движение.

Затем, друг за другом идет проверка на обнаружение прохода в правой стене, либо на обнаружение столкновения с препятствием. И, в зависимости от того, какая проверка сработала, вызываются блоки поворотов. Если никакая проверка не сработала в этот момент времени, то в следующий момент времени нужно сделать еще одну проверку, а потом еще и еще.

Очевидно, что после выполнения поворотов нужно опять продолжить движение вперед, и опять перейти к проверкам на проход или препятствие.


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


В итоге, программа на языке NXT-G будет похожа на подобную конструкцию:


Как уже говорилось, блок движение вперед может быть замещено специальным блоком, который бы обеспечивал перемещение вдоль стены. Хотя во многих случаях эта проблема может быть решена чисто механически: у робота с нужно стороны устанавливаются ролики или направляющие, которые не позволяют ему слишком приблизиться к стене.

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




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

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

  1. Мы в свое время действовали чуть-чуть по-другому. Датчик расстояния на роботе крепился к мотору, и мог поворачиваться. Т.е. для проверки, где свободно, всему роботу необходимости поворачиваться нет.

    ОтветитьУдалить
    Ответы
    1. В алгоритме выше, робот не проверяет, где свободно поворотом - он просто следует алгоритму движения вдоль правой стены. Причем описан простой алгоритм, без оптимизаций.
      А так, действительно, робот при заезде в тупик робот может сразу распознать это повернув датчик налево. И если он оказался в тупике, то разворачиваться не на 90 градусов, а на 180.

      Удалить
  2. Что делать если я делаю это на EV 3?

    ЯЯЯЯЯЯЯ

    ОтветитьУдалить
    Ответы
    1. Команды аналогичные, блоки по виду и цвету чуть различаются.

      Удалить

Related Posts Plugin for WordPress, Blogger...