Движение робота по черной ленте

Материал из MIK32 микроконтроллер
Версия от 13:53, 28 мая 2021; Leer.Meer (обсуждение | вклад) (Новая страница: «В этой статье мы рассмотрим вариант движение e-puck по маршруту, проложенному черной ленто...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

В этой статье мы рассмотрим вариант движение e-puck по маршруту, проложенному черной лентой. Аналогичное задание присутствует в рамках курса "Системы управления в робототехнике".

движение робота по черной линии

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

Реализуем данной движение в программной среде Webots.

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

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

E-puck Сенсор.png

Чтобы подключить ИК-Датчик к роботу, необходимо назначить его в соответствующий слот, в меню "GroundSensorsSlot", он находится в самом конце при нажатии в контекстом меню на e-puck. Нажимаем на "GroundSensorsSlot", а затем на значок "+" на панели инструментов сверху для добавления нового датчика.

Назначение ИК сканера.png

Здесь мы сталкиваемся с первой проблемой, а именно, мы не видим в списке ИК-датчик, не пугаемся этого и обращаем внимания на датчик расстояния. Именно он нам сейчас и нужен. добавляем "DistanceSensor". Теперь в Дереве элементов E-puck у нас появился пункт "DistanceSensor", переходим в него и ищем строку "type" и выбираем "infra-red".

Теперь чтобы получить адекватное движение робота, нам необходимо немного развернуть луч нашего ИК-Датчика влево, для этого переходим снова "DistanceSensor" и редактируем первую строку "translation", по умолчанию она имеет параметры x=0 y=0 z=0, меняем значение параметра "y" на y=-0.01.

Добавляем аналогичным способом второй ИК-Датчик и меняем у него параметр "translation" на x=0 y=0.02 z=0.

Далее необходимо создать или загрузить из интернета модель ленты.

Теперь нам необходимо сделать цвет поверхности арены белым, чтобы он сильно контрастировал с нашей лентой.

Переходим к написанию кода.

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

......

left_ir = robot.getDistanceSensor('имя сенсора 1')

left_ir.enable(time_step)

right_ir = robot.getDistanceSensor('имя сенсора 2')

right_ir.enable(time_step)

while robot.step(time_step) !=-1:

left_ir_value = left_ir.getValue()

right_ir_value = right_ir.getValue()

print('left: {} right: {}".format(left_ir_value, right_ir_value)"

......

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

И так у нас есть 2 сканера, которые распознают поверхность и в зависимости от ее цвета выводят различные значения. Зная диапазоны этих значений, мы можем задать нужную нам траекторию с помощью таких простых функций как if и else, для обнаружения линии и поворота. Если левый датчик замечает черную линию-робот должен повернуть налево. Если правый, то соответственно направо.

Реализация в коде:

if (left_ir_value > right_ir_value) and (6 < left_ir_value 15);

left_speed = -max_speed

elif (right_ir_value > left_ir_value) and (6 < right_ir_value 15);

right_speed = -max_speed


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