Найти в Дзене
RCRoboLab

Память робота!

Важная информация!
Нет, речь не о EEPROM, ОЗУ и ПЗУ. Поговорим о ситуации когда робот теряет из виду линию! Эта статья является частью целого цикла посвященного роботу "по линии", и пишется в первую очередь для учеников, ибо чтобы не объяснять одно и то же каждому - мне проще отправить всех к этой статье.
Другие статьи ищите в оглавлении. Предполагается что ваш робот по линии готов! Он даже способен проехать простую кольцевую трассу - "Узкую линию", возможно вы даже уже успели поучаствовать в соревнованиях и победить/проиграть (нужное подчеркнуть =) А дальше что? дальше вам нужно пробовать себя в более сложных дисциплинах, и одной из таковых является "линия экстремал"! Если мы сравним два полигона, первый для просто "узкой" линии, а второй для "экстремал" то мы сразу поймем что нам туда нужно, и ровно после первой попытки мы также поймем, что наш робот не в состоянии её проехать! =) В отличие от простой "узкой линии", где нет резких поворотов с малыми радиусами кривизны, где нет повор

Важная информация!
Нет, речь не о
EEPROM, ОЗУ и ПЗУ. Поговорим о ситуации когда робот теряет из виду линию!

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

Предполагается что ваш робот по линии готов! Он даже способен проехать простую кольцевую трассу - "Узкую линию", возможно вы даже уже успели поучаствовать в соревнованиях и победить/проиграть (нужное подчеркнуть =) А дальше что? дальше вам нужно пробовать себя в более сложных дисциплинах, и одной из таковых является "линия экстремал"!

Если мы сравним два полигона, первый для просто "узкой" линии, а второй для "экстремал" то мы сразу поймем что нам туда нужно, и ровно после первой попытки мы также поймем, что наш робот не в состоянии её проехать! =)

В отличие от простой "узкой линии", где нет резких поворотов с малыми радиусами кривизны, где нет поворотов под 90 градусов, нет перекрестков, в "линит экстремал" это все есть и в изобилии, а с этого года на Робофинист еще и прерывистая линия. И, поверьте мне, если ваш робот не будет запоминать ГДЕ ОН В ПОСЛЕДНИЙ РАЗ ВИДЕЛ ЛИНИЮ - ему эту трассу не проехать. Я не буду тут выкладывать готовый код с памятью, нет, не из вредности, просто память пишется под каждого конкретного робота - так как у всех разные алгоритмы, и даже под каждую трассу. К примеру, память наших роботов с прошлого сезона совсем не подходит для трас этого сезона, ибо организатор добавил разрывы линии.

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

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

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

С философией покончено!

Я уверен что на этом моменте все поняли зачем нам нужно делать память роботу. Теперь немного примеров из кода, для учеников.

Примеры намеренно будут на основе кода нашего первого робота с двумя сенсорами линии.

Как мы запоминаем где в последний раз робот видел линию? Все просто, когда наш робот поворачивает направо, мы в глобальную переменную записываем (к примеру) 1 (один), а когда наш робот поворачивает налево записываем 2 (два).

рис. 2 Пример записи в память
рис. 2 Пример записи в память

Как и когда мы считываем данные из памяти? Тоже все просто! Когда наш робот перестал видеть линию - мы через ветвление (if) говорим ему куда ехать.

рис. 3 Пример использования памяти.
рис. 3 Пример использования памяти.

Ну и "весь" код целиком.

рис. 4 Код "целиком"
рис. 4 Код "целиком"

На этом все.
Другие материалы нашего клуба вы можете найти
тут!