(С)NiNoXT
До сих пор в статьях о алгоритмах, использующихся при движении вдоль линии, рассматривался такой способ, когда датчик освещенности как бы следил за левой или правой ее границей: чуть робот съедет на белую часть поля - регулятор возвращал робота на границу, начнет датчик перемещаться вглубь черной линии - регулятор выправлял его обратно.
Не смотря на то, что картинка выше приведена для релейного регулятора, общий принцип движения пропорционального (П-регулятора) будет такой-же.
Как уже говорилось, средняя скорость такого перемещения не очень высокая и было сделано несколько попыток увеличить ее за счет незначительного усложнения алгоритма: в одном случае использовалось "мягкое" торможение, вдругом, помимо поворотов, вводилось движение вперед.
Для того, чтобы позволить роботу на некоторых участках двигаться вперед, в диапазоне значений выдаваемых датчиком освещенности выделялся узкий участок, который условно можно было назвать "датчик находится на границе линии".
У данного подхода есть небольшой недостаток - если робот "следит" за левой границей линии, то на правых поворотах он как бы не сразу определяет искривления траектории и, как следствие, тратит большее время на поиск линии и поворот. Причем, можно с уверенностью сказать, что чем, круче поворот, тем дольше по времени происходит этот поиск.
На следующем рисунке видно, что если бы датчик находился не с левой стороны от границы, а с правой, то он уже обнаружил искривление траектории и начал бы совершать маневры по повороту.
Поэтому хорошей идеей является оснастить робота сразу двумя датчиками, которые располагались по разные стороны от линии и, соответственно, помогали бы роботу более оперативно реагировать на изменение направления движения.
Теперь необходимо определить, как такое изменение конструкции скажется на программе. Для простоты опять следует начать с простейшего релейного регулятора и поэтому, в первую очередь, интересуют возможные положения датчиков относительно линии:
На самом деле, можно выделить еще одно допустимое состояние - на сложных трассах это будет пересечение перекрестка или какого-то утолщения на пути.
Другие положения датчиков рассматриваться не будут, потому что либо являются производными от показанных выше, либо это такие положения робота, когда он сошел с линии и уже не сможет вернуть себя на нее используя информацию с датчиков.
В итоге, все перечисленные положения можно свести к следующей классификации:
Если в определенный момент времени программа на роботе обнаруживает одно и из этих положений, она должна будет среагировать соответствующим образом:
На схеме выше сразу же показано, как конкретно в программе должно меняться поведение моторов.
Теперь, написание программы не должно составить большого труда.
Начать стоит с того, чтобы выбрать какой датчик будет опрашиваться первым. Это не имеет большого значения, поэтому пусть будет левый. Необходимо определить, над светлой или над темной он поверхностью:
Это действие еще не позволяет сказать в какую сторону роботу надо ехать. Но оно разделит состояния, перечисленные выше, на две группы: (I, II) для верхней ветви и (III, IV) для нижней. В каждой из групп теперь по два состояния, поэтому необходимо выбрать какое-то из них. Если внимательно посмотреть на первые два состояния I и II, то они отличаются положением правого датчика - в одном случае он над светлой поверхностью, в другом - над темной. Именно это и определит выбор, какое действие предпринять:
Теперь можно вставить блоки, определяющие поведение моторов согласно таблицам выше: верхняя ветвь вложенного условия определяет комбинацию "оба датчика на светлом", верхняя - "левый на светлом, правый на темном":
Нижняя ветка основного условия отвечает за другую группу состояний III и IV. Эти два состояния также отличаются друг от друга уровнем освещенности, который улавливает правый датчик. Значит, он будет определять выбор каждого из них:
Получившиеся две ветви наполняются блоками движения. Верхняя ветвь отвечает за за состояние "левый на темном, правый на светлом", а нижняя - за "оба датчика на темном".
Следует отметить, что данная конструкция всего лишь определяет, как включить моторы в зависимости от показаний сенсоров в определенном месте поля, естественно через мгновение программа должна проверить не изменились ли показания, чтобы соответствующим образом подправить поведение моторов, а через мгновение еще раз, еще и т.д. Поэтому она должна быть помещена в цикл, который будет обеспечивать такую повторяющуюся проверку:
Такая довольно простая программа будет обеспечивать довольно высокую скорость передвижения робота вдоль линии без вылета за ее пределы, если правильным образом настроить максимальную скорость при движении в состояниях I и IV, а также задать оптимальный способ торможения в состояниях II и III - чем круче повороты на трассе, тем "жестче" должно быть торможение - скорость должна сбрасываться быстрее, и наоборот - при плавных поворотах вполне можно применять торможение через выключение энергии или даже вообще через незначительный сброс скорости.
По размещению датчиков на роботе тоже следует сказать несколько отдельных слов. Очевидно, что по расположению этих двух датчиков относительно колес будут действовать те же самые рекомендации, что и для одного датчика, перечисленные в предыдущих заметках (здесь и здесь), только за вершину треугольника при этом берется середина отрезка соединяющий два датчика. Само же расстояние между датчика тоже должно выбираться из характеристик трассы: чем ближе датчики будут расположены друг к другу, тем чаще робот будет выравниваться (выполнять относительно медленные развороты), но если разнести датчики достаточно широко, то есть риск вылета с трассы, поэтому придется выполнять более "жесткие" повороты и уменьшать скорость передвижения на прямых участках.
До сих пор в статьях о алгоритмах, использующихся при движении вдоль линии, рассматривался такой способ, когда датчик освещенности как бы следил за левой или правой ее границей: чуть робот съедет на белую часть поля - регулятор возвращал робота на границу, начнет датчик перемещаться вглубь черной линии - регулятор выправлял его обратно.
Не смотря на то, что картинка выше приведена для релейного регулятора, общий принцип движения пропорционального (П-регулятора) будет такой-же.
Как уже говорилось, средняя скорость такого перемещения не очень высокая и было сделано несколько попыток увеличить ее за счет незначительного усложнения алгоритма: в одном случае использовалось "мягкое" торможение, вдругом, помимо поворотов, вводилось движение вперед.
Для того, чтобы позволить роботу на некоторых участках двигаться вперед, в диапазоне значений выдаваемых датчиком освещенности выделялся узкий участок, который условно можно было назвать "датчик находится на границе линии".
На следующем рисунке видно, что если бы датчик находился не с левой стороны от границы, а с правой, то он уже обнаружил искривление траектории и начал бы совершать маневры по повороту.
Теперь необходимо определить, как такое изменение конструкции скажется на программе. Для простоты опять следует начать с простейшего релейного регулятора и поэтому, в первую очередь, интересуют возможные положения датчиков относительно линии:
На самом деле, можно выделить еще одно допустимое состояние - на сложных трассах это будет пересечение перекрестка или какого-то утолщения на пути.
Другие положения датчиков рассматриваться не будут, потому что либо являются производными от показанных выше, либо это такие положения робота, когда он сошел с линии и уже не сможет вернуть себя на нее используя информацию с датчиков.
В итоге, все перечисленные положения можно свести к следующей классификации:
- левый датчик, также как и правый - над светлой поверхностью
- левый датчик над светлой поверхностью, правый датчик над темной
- левый датчик над темной поверхностью, правый датчик над светлой
- оба датчика находятся над темной поверхностью
Если в определенный момент времени программа на роботе обнаруживает одно и из этих положений, она должна будет среагировать соответствующим образом:
- Если оба датчика над белой поверхностью, то это нормальная ситуация, в которой линия находится между датчиками, поэтому робот должен ехать прямо.
- Если левый датчик еще над светлой поверхностью, а правый датчик уже над темной, значит, робот заехал своей правой частью на линию, а значить ему нужно поворачивать направо, чтобы линия опять оказалась между датчиками.
- Если левый датчик оказался над темной поверхностью, а правый еще над светлой, то для выравнивания роботу нужно поворачивать налево.
- Если оба датчика над темной поверхностью, то в общем случае, робот опять продолжает двигаться прямо.
На схеме выше сразу же показано, как конкретно в программе должно меняться поведение моторов.
Теперь, написание программы не должно составить большого труда.
Начать стоит с того, чтобы выбрать какой датчик будет опрашиваться первым. Это не имеет большого значения, поэтому пусть будет левый. Необходимо определить, над светлой или над темной он поверхностью:
Это действие еще не позволяет сказать в какую сторону роботу надо ехать. Но оно разделит состояния, перечисленные выше, на две группы: (I, II) для верхней ветви и (III, IV) для нижней. В каждой из групп теперь по два состояния, поэтому необходимо выбрать какое-то из них. Если внимательно посмотреть на первые два состояния I и II, то они отличаются положением правого датчика - в одном случае он над светлой поверхностью, в другом - над темной. Именно это и определит выбор, какое действие предпринять:
Теперь можно вставить блоки, определяющие поведение моторов согласно таблицам выше: верхняя ветвь вложенного условия определяет комбинацию "оба датчика на светлом", верхняя - "левый на светлом, правый на темном":
Нижняя ветка основного условия отвечает за другую группу состояний III и IV. Эти два состояния также отличаются друг от друга уровнем освещенности, который улавливает правый датчик. Значит, он будет определять выбор каждого из них:
Получившиеся две ветви наполняются блоками движения. Верхняя ветвь отвечает за за состояние "левый на темном, правый на светлом", а нижняя - за "оба датчика на темном".
Следует отметить, что данная конструкция всего лишь определяет, как включить моторы в зависимости от показаний сенсоров в определенном месте поля, естественно через мгновение программа должна проверить не изменились ли показания, чтобы соответствующим образом подправить поведение моторов, а через мгновение еще раз, еще и т.д. Поэтому она должна быть помещена в цикл, который будет обеспечивать такую повторяющуюся проверку:
Такая довольно простая программа будет обеспечивать довольно высокую скорость передвижения робота вдоль линии без вылета за ее пределы, если правильным образом настроить максимальную скорость при движении в состояниях I и IV, а также задать оптимальный способ торможения в состояниях II и III - чем круче повороты на трассе, тем "жестче" должно быть торможение - скорость должна сбрасываться быстрее, и наоборот - при плавных поворотах вполне можно применять торможение через выключение энергии или даже вообще через незначительный сброс скорости.
По размещению датчиков на роботе тоже следует сказать несколько отдельных слов. Очевидно, что по расположению этих двух датчиков относительно колес будут действовать те же самые рекомендации, что и для одного датчика, перечисленные в предыдущих заметках (здесь и здесь), только за вершину треугольника при этом берется середина отрезка соединяющий два датчика. Само же расстояние между датчика тоже должно выбираться из характеристик трассы: чем ближе датчики будут расположены друг к другу, тем чаще робот будет выравниваться (выполнять относительно медленные развороты), но если разнести датчики достаточно широко, то есть риск вылета с трассы, поэтому придется выполнять более "жесткие" повороты и уменьшать скорость передвижения на прямых участках.
Комментариев нет:
Отправить комментарий