ДО курс по робототехнике

Показаны сообщения с ярлыком черно-белое движение. Показать все сообщения
Показаны сообщения с ярлыком черно-белое движение. Показать все сообщения

4 апреля 2013 г.

Алгоритмы: черно-белое движение. Часть XI

(С)NiNoXT

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



Не смотря на то, что картинка выше приведена для релейного регулятора, общий принцип движения пропорционального (П-регулятора) будет такой-же.

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

Для того, чтобы позволить роботу на некоторых участках двигаться вперед, в диапазоне значений выдаваемых датчиком освещенности выделялся узкий участок, который условно можно было назвать "датчик находится на границе линии".

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


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


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


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


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

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

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

На схеме выше сразу же показано, как конкретно в программе должно меняться поведение моторов.

Теперь, написание программы не должно составить большого труда.

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


Это действие еще не позволяет сказать в какую сторону роботу надо ехать. Но оно разделит состояния, перечисленные выше, на две группы: (I, II) для верхней ветви и (III, IV) для нижней. В каждой из групп теперь по два состояния, поэтому необходимо выбрать какое-то из них. Если внимательно посмотреть на первые два состояния I и II, то они отличаются положением правого датчика - в одном случае он над светлой поверхностью, в другом - над темной. Именно это и определит выбор, какое действие предпринять:


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


Нижняя ветка основного условия отвечает за другую группу состояний III и IV. Эти два состояния также отличаются друг от друга уровнем освещенности, который улавливает правый датчик. Значит, он будет определять выбор каждого из них:


Получившиеся две ветви наполняются блоками движения. Верхняя ветвь отвечает за за состояние "левый на темном, правый на светлом", а нижняя - за "оба датчика на темном".


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


Такая довольно простая программа будет обеспечивать довольно высокую скорость передвижения робота вдоль линии без вылета за ее пределы, если правильным образом настроить максимальную скорость при движении в состояниях I и IV, а также задать оптимальный способ торможения в состояниях II и III - чем круче повороты на трассе, тем "жестче" должно быть торможение - скорость должна сбрасываться быстрее, и наоборот - при плавных поворотах вполне можно применять торможение через выключение энергии или даже вообще через незначительный сброс скорости.

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

Не-алгоритмы: черно-белое движение. Часть X

(С)NiNoXT
Продолжение рассуждения о конструкции роботов, решающих задачу движения вдоль линии.

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


В зависимости от расположения датчика вид треугольника может изменяться. 


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

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


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


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


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

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

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


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

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

Не-алгоритмы: черно-белое движение. Часть IX

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

Пусть сначала правое колесо стоит, а левое вращается. Тогда траектория (синяя пунктирная линия) тележки будет окружность с центром в точке соприкосновения правого колеса с полем.


Если теперь правое колесо начнет двигаться, то траектория измениться, но все также останется окружностью - только большего радиуса.


Движение в левую сторону даст аналогичные окружности:


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


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

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


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


Тогда первое следствие, какое можно выделить после данных рассуждений, что дуга минимального радиуса, описываемая датчиком освещенности, будет при одном неподвижном колесе (движение одним колесом в обратном направлении не рассматривается пока).

Также можно утверждать, что дуга меньшего радиуса будет у робота с более узкой колесной базой.


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

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


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


Сформулируем первое правило конструкции робота-тележки при движении вдоль линии: чем круче повороты на трассе, тем меньше должен быть радиус поворота механизма, тем уже должна быть колесная база робота.

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

Алгоритмы: черно-белое движение. Часть VIII

(С)NiNoXT
Как и обещано ранее, настало время рассмотреть от чего же еще зависит коэффициент пропорциональности линейного регулятора при движении вдоль линии.

В предыдущих заметках было выведено, что он однозначно зависит от освещенности трассы и яркости элементов на ней:

Где, Lmax - значения сенсора освещенности на самом светлом участке поля, аLmin - значение сенсора на самом темном участке.

Данный коэффициент использовался в формуле, которая определяла мощность подаваемую на каждый мотор при том или ином значении освещенности во время движения.
Значения мощностей, получаемых этими формулами можно отобразить на графике
Иными словами, в заметке #5 было показано, что посредством введения коэффициента пропорциональности, для каждого значения освещенности отLmin до Lmax сопоставились значения мощности в диапазоне от 0 до 100%.

Из графика и из формулы выше видно, что мощность колеблется вокруг некоторого среднего значения - 50%. Что по сути обозначает мощность, при которой оба мотора двигаются в одном направлении с одинаковой скоростью, т.е. робот едет прямо, в случае, когда текущее показание освещенности (показание на границе линии) равно LA. Такую мощность мы назвали средней мощностью.

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

Например, если линия, вдоль которой происходит движение, практически не изменяет своего направления, средняя скорость может быть больше, потому что ситуации, когда робот выскочит за линию и начнет снова ее искать, очень редки.
Другой пример - очень извилистая линия. Здесь средняя скорость может быть наоборот очень низкая, чтобы избегать вылетания с трассы и потери времени на поиск границы линии.
Существуют и другие причины для выбора средней скорости отличной от 50%: при большом диаметре колеса она может быть меньше, чем при маленьком диаметре
при большой нагрузке на робота или при севших батарейках скорость придется увеличить, иначе робот будет двигаться слишком медленно и т.д.

Итак, для простоты объяснения рассмотрим оба варианта: один, когда средняя скорость меньше 50%, и второй, когда скорость больше 50%.

Первый вариант: PA (средняя скорость ) > 50%

Представим, что робот едет по границе линии, а затем съезжает с нее, т.е. сначала освещенность примерно равна LA, а а затем увеличивается до Lmax.

Одно из колес при этом должно полностью остановиться, чтобы движение второго вернуло робота на линию, т.е. мощность на этом колесе должна измениться со значения PA до 0.

В действительности, если продолжать рассчитывать коэффициент и мощность по старым формулам, то произойдет примерно следующее:

Пусть LA = 42, а Lmax = 60, а PA = 70, тогда KP = 2,78.
Из таблицы видно, что скорее всего колесо не остановится и будет медленно, но вращаться, что может привести к тому, что робот потеряет линию.

Следовательно, значения, использующиеся в формуле вычисления мощности должны быть изменены таким образом, чтобы обеспечить изменение мощности от PA до 0 при изменении освещенности от LA до Lmax. Иными словами, каждому значению из диапазона от LA до Lmax должно быть поставлено в соответствие значение мощности от PA до 0.
Используя свойства подобных треугольников, можно вывести формулу для коэффициента пропорциональности:
Теперь, если в формулу подставить значения приведенные выше, то KP станет равным:
А мощность при разных значениях L:
Следует заметить, что в таблице появляются мощности выше 100 - такие значения не требуют никакой специальной обработки - firmware на NXT блоке в таких случаях автоматически будет использовать максимальную возможную мощность - 100%.

Первый вариант: PA (средняя скорость ) < 50%

Робот сейчас и так едет достаточно медленно, но дело еще усугубляется тем, что при сильном съезде с границы линии робот не спешит возвращаться на нее - особенно это актуально для трассы с крутыми поворотами представленной на картинке выше.
Значения в таблице показывают, что на моторы при заезде на светлую часть трассы (или темную) никогда не будет подаваться максимум энергии.

Чтобы добиться подачи максимально возможной энергии на мотор нужно сопоставить каждому значению из диапазона LA .. Lmax значение мощности отPA до 100. Проделаем преобразования, аналогичные тем, что представлены выше:
Это приведет к следующим показаниям мощности.
Видно, что увеличение удалось добиться максимальной мощности в 100%. При этом также начали появляться отрицательные значения мощности. Что, без специальной обработки, может привести к неправильному поведению робота - само поведение и как избежать его описывалось в прошлой заметке.

В двух вариантах для вычисления коэффициента получились две разные формулы, которые отличаются лишь верхней частью делимого. Можно рассмотреть, есть ли какая-нибудь закономерность в этих частях, так чтобы все-таки свести их к единой формуле.
Если провести дальнейшую подстановку полученных разностей в формулы для вычисления коэффициента, то можно будет заметить, что "правильному" коэффициенту (тому, который приводит приближение мощности при крайних значениях освещенности к 100 или 0) соответствуют максимальные значения разности. Отсюда математическая запись формулы приходит к следующему виду:
Что по сути обозначает - для вычисления коэффициента пропорциональности линейного регулятора выберите наибольшую разность между максимальной желаемой мощностью и средней мощностью или между средней мощностью и минимальной желаемой мощностью.

В формуле умышленно брались Pmax и Pmin вместо 100 и 0, для того чтобы показать, что в определенных случая желаемые максимальные и минимальные мощности могут отличаться от предельно допустимых, если программист робота точно понимает какого результата он хочет добиться. Но в большинстве случаев, вместо Pmax следует использовать 100, а вместо Pmin - 0.

На языке NXT-G данное вычисление коэффициента пропорциональности линейного регулятора для движения робота-тележки вдоль границы черной линии может выглядеть следующим образом: