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

4 апреля 2013 г.

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

(С)NiNoXT

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

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

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

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

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


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

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

В итоге финальная часть графика вращения оси мотора будет выглядеть следующим образом


Видно, что после того, как мотор отдается команда моторы остановиться он фактически продолжает двигаться, но самое неудобное, что он периодически двигается в обратную сторону.

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

Есть два способа избавиться от этого недостатка:
  • Первый - не выключать мотор полностью, просто выставить на нем очень маленькую скорость
  • Второй - использовать Coast вместо Brake. Это приводит к отключению питания на моторе, а не выполнению торможения.

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


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

Комментариев нет:

Отправить комментарий