Движение робота по черной ленте: различия между версиями
Leer.Meer (обсуждение | вклад) (Новая страница: «В этой статье мы рассмотрим вариант движение e-puck по маршруту, проложенному черной ленто...») |
Leer.Meer (обсуждение | вклад) Нет описания правки |
||
Строка 11: | Строка 11: | ||
Чтобы подключить ИК-Датчик к роботу, необходимо назначить его в соответствующий слот, в меню "GroundSensorsSlot", он находится в самом конце при нажатии в контекстом меню на e-puck. Нажимаем на "GroundSensorsSlot", а затем на значок "+" на панели инструментов сверху для добавления нового датчика. | Чтобы подключить ИК-Датчик к роботу, необходимо назначить его в соответствующий слот, в меню "GroundSensorsSlot", он находится в самом конце при нажатии в контекстом меню на e-puck. Нажимаем на "GroundSensorsSlot", а затем на значок "+" на панели инструментов сверху для добавления нового датчика. | ||
[[Файл:Назначение ИК сканера.png|мини]] | [[Файл:Назначение ИК сканера.png|мини]] | ||
Здесь мы сталкиваемся с первой проблемой, а именно, мы не видим в списке ИК-датчик, не пугаемся этого и обращаем внимания на датчик расстояния. Именно он нам сейчас и нужен. добавляем "DistanceSensor". Теперь в Дереве элементов E-puck у нас появился пункт "DistanceSensor", переходим в него и ищем строку "type" и выбираем "infra-red". | Здесь мы сталкиваемся с первой проблемой, а именно, мы не видим в списке [[Инфракрасный Датчик|ИК-датчик]], не пугаемся этого и обращаем внимания на датчик расстояния. Именно он нам сейчас и нужен. добавляем "DistanceSensor". Теперь в Дереве элементов E-puck у нас появился пункт "DistanceSensor", переходим в него и ищем строку "type" и выбираем "infra-red". | ||
Теперь чтобы получить адекватное движение робота, нам необходимо немного развернуть луч нашего ИК-Датчика влево, для этого переходим снова "DistanceSensor" и редактируем первую строку "translation", по умолчанию она имеет параметры x=0 y=0 z=0, меняем значение параметра "y" на y=-0.01. | Теперь чтобы получить адекватное движение робота, нам необходимо немного развернуть луч нашего [[Инфракрасный Датчик|ИК-Датчика]] влево, для этого переходим снова "DistanceSensor" и редактируем первую строку "translation", по умолчанию она имеет параметры x=0 y=0 z=0, меняем значение параметра "y" на y=-0.01. | ||
Добавляем аналогичным способом второй ИК-Датчик и меняем у него параметр "translation" на x=0 y=0.02 z=0. | Добавляем аналогичным способом второй [[Инфракрасный Датчик|ИК-Датчик]] и меняем у него параметр "translation" на x=0 y=0.02 z=0. | ||
Далее необходимо создать или загрузить из интернета модель ленты. | Далее необходимо создать или загрузить из интернета модель ленты. |
Текущая версия от 23:33, 28 мая 2021
В этой статье мы рассмотрим вариант движение e-puck по маршруту, проложенному черной лентой. Аналогичное задание присутствует в рамках курса "Системы управления в робототехнике".
К преимуществам данного алгоритма можно отнести его простоту. Этот способ не требует высоких навыков в программировании, и как следствие, прекрасно подойдет в качестве ознакомления для новичка.
Реализуем данной движение в программной среде Webots.
Прежде всего необходимо создать мир в симуляции и добавить в него робота e-puck, эти шаги подробно описаны в интернете, а так же в лабораторной работе №1 по курсу "Системы управления в робототехнике", поэтому данный момент мы опустим.
И так, после создания арены и добавления робота на нее, нам необходимо добавить сенсоры, с помощью которых он сможет видеть нашу черную линию. Это можно реализовать за счет инфракрасных датчиков или камеры.
Чтобы подключить ИК-Датчик к роботу, необходимо назначить его в соответствующий слот, в меню "GroundSensorsSlot", он находится в самом конце при нажатии в контекстом меню на e-puck. Нажимаем на "GroundSensorsSlot", а затем на значок "+" на панели инструментов сверху для добавления нового датчика.
Здесь мы сталкиваемся с первой проблемой, а именно, мы не видим в списке ИК-датчик, не пугаемся этого и обращаем внимания на датчик расстояния. Именно он нам сейчас и нужен. добавляем "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
И последняя проблема, с которой здесь можно столкнуться-это выезд робота за пределы линии. Чтобы решить данную проблему-следует замедлить нашего робота, чтобы он не поворачивался так быстро, а шел более плавно