Осваиваем техническое зрение на примере Bioloid STEM и HaViMo2.0

imageДобрый день, уважаемые читатели Хабра! Данной статьей я открываю серию публикаций по робототехнике. Основными направлениями тематики статей будут являться описание практических реализаций различных задач — от простейшего программирования роботов, до реализации навигации и автономного поведения робота в различных условиях. Основная цель данных статей — показать и научить как просто решить ту или иную прикладную задачу, либо как быстро адаптировать свой робототехнический набор под конкретные условия. Я постараюсь использовать доступные и распространенные на рынке наборы, чтобы многие из вас смогли использовать мои решения и доработать их для своих целей. Надеемся, что данные статьи будут полезны как студентам различных учебных заведений, так и преподавателям робототехники.Вместо предисловия

Работа современных мобильных роботов зачастую сопряжена с постоянным и активным перемещением в динамическом (подверженном изменениям) окружении. В настоящее время в связи с интенсивной роботизацией обслуживающей сферы, к примеру, внедрения робокаров на производстве, сервисных роботов для контакта с людьми, возникла серьезная необходимость создания таких роботов, которые могли бы не только уметь двигаться по заранее определенным маршрутам и обнаруживать препятствия, но и классифицировать их, чтобы при необходимости гибко подстроиться под изменяющееся окружение. Данную задачу можно и нужно решать с использованием технического зрения. В данной работе я предлагаю разобраться с основными моментами при реализации технического зрения на примере использования машинки из робототехнического набора Bioloid STEM и камеры HaViMo2.0.

В настоящее время широко распространён такой вид движения роботов, как езда по линии. Это широко используется как на заводах в AGV (Automatic Guided Vehicle) — роботы перемещаются по заранее нарисованным линиям, так и при организации робототехнических соревнований — зачастую можно встретить задания, так или иначе связанные с ориентированием по линиям. Основными датчиками, с помощью которых робот получает данные, являются инфракрасные датчики, которые определяют разницу в контрасте линии и окружающего фона, и магнитные датчики, которые используются в случае применения магнитных линий. Приведенные выше примеры решений требуют как тщательного техобслуживания в процессе эксплуатации, так и определенной чистоты среды: например, на грязном складе линии могут запачкаться и перестать распознаваться ИК-датчиками, а, например, в металлообработке магнитные линии могут забиваться железной стружкой. Помимо всего этого предполагается, что робот перемещается по заранее определенным маршрутам, на которых не должно быть препятствий ни в виде людей, которых он может покалечить, ни в виде каких-либо других объектов. Однако, как правило, всегда на производстве существует множество перемещающихся объектов, которые потенциально могут стать препятствием для робота, поэтому робот всегда должен не только получать информацию о своем маршруте и перемещающихся объектах, но также должен анализировать окружение, чтобы в случае необходимости иметь возможность грамотно отреагировать на возникшую ситуацию.

imageРисунок 1. Складские роботы, двигающиеся по линиямПри разработке мобильных роботов нужно учитывать, какие задачи поставлены перед мобильным роботом, чтобы подобрать необходимые сенсорные устройства для их решения. Так, например, для решения задачи перемещения внутри рабочей зоны робот может быть оснащен дорогими лазерными сканирующими дальномерами и GPS-устройствами для определения собственного положения, тогда как для решения задачи локальной навигации мобильный робот может быть оснащен простыми ультразвуковыми или инфракрасными датчиками по периметру. Однако, все вышеперечисленные средства не могут дать роботу полной картины происходящего вокруг него, так как использование различных датчиков определения расстояния позволяют роботу определять расстояние до объектов и их габариты, но не позволяют определять другие их свойства — форму, цвет, положение в пространстве, что приводит к невозможности классифицировать такие объекты по каким–либо критериям.

image Для решения обозначенной выше проблемы на помощь приходят системы технического зрения, позволяющие роботу получать максимально полную информацию о состоянии окружения вокруг него. По сути — система технического зрения является «глазами» робота, способными с помощью камеры оцифровывать окружающую область и предоставлять информацию о физических характеристиках объектов, находящихся в ней в виде данных о— размерах— расположении в пространстве— внешнем виде (цвет, состояние поверхности и т.п.)— маркировке (распознавание логотипов, штрих-кодов и т.п.).

Получаемые данные могут быть использованы для идентификации объектов, измерения их каких-либо характеристик, а также управления ими.

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

image Рисунок 2. Применение системы технического зрения для контроля дорожной обстановкиКак я уже упомянул ранее, наше решение будет основываться на популярном робототехническом конструкторе, производимом корейской фирмой Robotis, а именно конструкторе Bioloid STEM.

image Рисунок 3. Конструктор Bioloid STEMДанный конструктор содержит компоненты, позволяющие собрать одну из 7 базовых моделей роботов. Я позволю себе не останавливаться на подробном описании данного набора, поскольку в сети достаточно его обзоров разной степени полноты, например, Обзор конструктора Bioloid STEM. В качестве рабочей модели будем использовать стандартную конфигурацию набора — машинку Avoider.

image Рисунок 4. Avoider — одна из 7 ми стандартных конфигураций набора Bioloid STEMВ качестве основы системы технического зрения будем использовать модуль обработки изображений HaViMo2.0, построенный на основе цветной CMOS камеры. Данный модуль специально разработан для использования совместно с маломощными процессорами. Помимо камеры, данный модуль оснащен микроконтроллером, выполняющим обработку изображения, поэтому ресурсы контроллера на саму обработку изображения не тратятся. Вывод данных осуществляется через последовательный порт.

image Рисунок 5. Модуль обработки изображений HaViMo2.0Характеристики модуля • Встроенная цветная CMOS камера: o Разрешение: 160×120 пикселейo Глубина цвета: 12 бит YCrCbo Частота кадров: 19 кадров в секунду• Сохранение параметров обработки изображений в EEPROM, нет необходимости каждый раз настраивать камеру после включения питания.• Автоматическая / ручная экспозиция, усиление и баланс белого• Регулируемые Цветовой тон / Насыщенность• Обработка изображения на основе цвета• Встроенная справочная таблица цветов• Сохранение параметров калибровки во внутреннюю память, нет необходимости повторной калибровки после включения питания• Способен различать до 256 объектов• В состав сходят инструменты 3D просмотра и редактирования• Поддерживает возможность отображения результатов калибровки в режиме реального времени• Поддерживает реализацию алгоритма Region — Growing в режиме реального времени• Обнаруживает до 15 сопредельных областей в кадре• Определяет цвет, количество пикселей и границы областей• Определяет цвет и количества пикселей для каждой ячейки 5×5• Поддерживает вывод необработанного изображения в режиме калибровки• Частота кадров при чересстрочном выводе — 19 FPS• Частота полного обновления кадра — 0,5 FPS• Поддерживаемое оборудование:  CM5 CM510 USB2 Dynamixel Как вы могли заметить, официальной поддержки входящего в состав набора Bioloid STEM контроллера CM-530 у HaViMo2.0 нет. Тем не менее, существует возможность связать CM-530 и HaViMo2.0, но обо всем по порядку.Перво-наперво нам необходимо каким-то образом установить модуль обработки изображений на машинку. И первое, что приходит в голову — закрепить камеру так, как показано на моделях ниже. Кстати, данные модели были получены с помощью среды моделирования от Bioloid — R+Design. Данная среда «заточена» специально для моделирования роботов из компонентов, предлагаемых Bioloid. Что есть и хорошо, и плохо одновременно. Поскольку модуля изображений в коллекции частей R+Design нет, то при моделировании я его заменил похожей по размерам плашечкой. И обвел в рамочку: image Рисунок 6. Расположение модуля обработки изображений HaViMo2.0 на AvoiderЧто ж, выглядеть должно не плохо, но необходимо учесть еще один важный момент — углы обзора камеры модуля, т.к. от этого будет зависеть изображение, которое модуль будет обрабатывать. Поскольку производитель HaViMo2.0 не указал в спецификации углы обзора камеры, то мне пришлось определить их самому. Я не претендую на высокую точность определения, но результаты у меня получились следующие:

углы обзора HaViMo2.0: по горизонтали — 44° (нет, до 45° округлять не буду, так как до 44° я уже и так округлил)по вертикали — 30°

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

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

Я решил именно минимизировать область видимости по следующим причинам: — во-первых, на практике проверить, что из этого получится— во-вторых, облегчить себе последующую калибровку модуля (чем меньше различных объектов попадает в область видимости, тем проще откалибровать модуль)

Изобразим нашу задачу на плоскости (линейные размеры указаны в мм, угловые — в град.):

image Рисунок 7. Определение угла отклонения модуля от вертикалиМы знаем точку положения камеры ©, мы знаем размер передней части робота (А-В), и так же знаем угол обзора по вертикали (выделено красными линиями). Поскольку здесь нет ничего сложнее геометрии 7 го класса, то я позволю себе не приводить ход расчета (читай — выкладки) и сказать сразу ответ — между плоскостью камеры и вертикалью должен быть угол в 52° (спасибо САПР за точность). При расчете вручную я получил значение в 50°, так что будем считать результаты приемлемыми.Помимо угла, мы так же получили, что видимая область камеры по горизонтали составляет порядка 85 мм.

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

image Рисунок 8. Видимая область. Горизонтальная проекция.На этом чертеже мы опять же знаем точку расположения камеры ©, размер передней части робота (СО), угол обзора по горизонтали, и уже знаем длину видимой области, которую получили на предыдущем этапе. Здесь нас в первую очередь интересует длина отрезка А-В, который показывает предельную величину ширины объекта, которую камера может зафиксировать. В результате мы имеем — если робот будет ехать по линии, то при таком расположении камеры ширина линии не должна превышать 31 мм. Если линия будет шире, то мы не сможем точно отслеживать ее поведение.

Воспользовавшись транспортиром и подручными средствами, я попытался закрепить модуль камеры так, как было задумано и вот что из этого получилось:

image Рисунок 9. Суровая реальность — живое фото получившейся конструкцииПришло время приступить непосредственно к работе с модулем HaViMo2.0. Лично от себя хочу сказать — данный модуль очень капризный. Поэтому если у вас что-то не заработало, то повторите попытку еще раз. А лучше два.Очень важно! Подключение камеры необходимо выполнить к порту Dynamixel port находящемся на торце контроллера между разъемом для подключения батареи и Communication Jack.Для работы с камерой и последующего программирования робота нам понадобится следующий набор программного обеспечения: — RoboPlus версии 1.1.3.0 (скачать с сайта производителя)— HaViMoGUI версии 1.5 (скачать)— калибровочная прошивка для контроллера CM-530 (скачать)

Начнем с подготовки контроллера. Поскольку идущий в комплекте с робототехническим набором Bioloid STEM контроллер CM-530 официально не поддерживается модулем обработки изображения, то нам необходимо использовать кастомную прошивку для контроллера. Так что перепрошиваем контроллер. Подключаем контроллер к компьютеру, включаем его тумблером и выполним следующие действия:

1. Откроем RoboPlus2. Во вкладке Expert запустим RoboPlus Terminal3. Увидим сообщение об ошибке, не испугаемся и нажмем ОК. Обратим внимание, что в левом нижнем углу написано No recent file, а в правом нижнем — Disconnect:

image Рисунок 10. Подготовка контроллера. Шаги 1–34. Выберем в меню Setup пункт Connect. Появится окно с выбором порта и его настройкой. Выберете COM порт, к которому подключен контроллер. Укажите скорость — 57600. Нажмите Connect. Если соединение установлено успешно — в правом нижнем углу надпись Disconnect сменится на подобную: COM8–57600.5. Не отключая контроллер от компьютера, выключим его тумблером POWER. Затем убедимся, что у нас установлена английская раскладка клавиатуры, зажмем одновременно клавиши Shift и 3 (тройка со значком #) и, не отпуская кнопки, включим контроллер тумблером. Если все сделано правильно, в окне терминала появится системная информация. Нажмем на Enter один раз.

image Рисунок 11. Подготовка контроллера. Шаги 4–56. Убедимся, что у нас нигде не болтаются провода и кабель USB надежно подключен к компьютеру и контроллеру. Далее запрещено отключать контроллер от ПК и снимать с него питание. Введем в терминал команду l (английская маленькая L). Нажмем Enter.7. Выберем в меню Files пункт Transmit file. Выберем скачанную кастомную прошивку CM-530.hex и нажмем кнопку Открыть.

image Рисунок 12. Подготовка контроллера. Шаги 6–78. После завершения загрузки введем команду GO и нажмем Enter. Терминал можно закрыть, контроллер отключить от компьютера.

image Рисунок 13. Подготовка контроллера. Шаг 8Наш контроллер CM-530 готов к работе с модулем HaViMo2.0. Внешне он будет выглядеть не очень хорошо — будет гореть только один красный светодиод, и никаких других признаков жизни он подавать не будет. Не пугайтесь. Это нормально. Теперь приступим к калибровке нашего модуля обработки изображения. Открываем HaViMoGUI, причем запуск осуществляем от имени администратора. Увидим следующее окно:

image Рисунок 14. Лицевая панель HaViMoGUIВ пункте Connection Type выберем контроллер CM-510, в Connection Port — номер COM порта к которому подключен контроллер. Нажмем Connect. В случае успешного соединения увидим в левом нижнем углу окна надпись Port Opened. Теперь подключимся непосредственно к камере. Для этого нажмем Check Camera. Если подключение к камере выполнилось успешно, то в левом нижнем углу увидим надпись Check Camera: HaViMo2 Found. Если такой надписи не появилось, проверьте правильность подключения камеры к контроллеру и повторите действия, начиная с запуска HaViMoGUI.

image Рисунок 15. Подключение к камере выполнено успешноПодключившись к камере, следует зайти во вкладку Camera Settings и активировать Auto Update Settings, которые позволят камере автоматически выбирать яркость/контрастность (и другие настройки) изображения, в зависимости от освещенности объекта.

image Рисунок 16. Установка авто-настроекЗатем возвращаемся во вкладку Color Look Up Table и нажмем Sample Image для фиксации изображения с камеры. В результате получим изображение нашего объекта вверху окна в разделе Original Image. Во вкладке Color Look Up Table (справа) появились распознанные камерой оттенки в виде 3D-градиента. Камера распознает объект по его цвету. Одновременно можно запомнить 7 различных объектов (+фон). Для того, чтобы запомнить цвет, во вкладке Color Look Up Table выберем Color 1.

image Рисунок 17. Фиксация изображения с камерыОттенок цвета можно выбрать при помощи 3D-градиента (нажать на соответствующий квадратик) или нажав в определенную точку Original Image. В нашем случае мы выбираем белую линию, по которой наш робот будет ехать. Нажав на Region Growing, мы увидим область распознавания, которую распознал модуль. Простейшие настройки произведены. Для того, чтобы их запомнить, нажмем кнопку Flash LUT. Если в строке статуса написано LUT Written Successfully, значит сохранение настроек успешно. Также можно сохранить настройки в отдельный файл, нажав на кнопку Save LUT to File, чтобы затем прочитать их из файла без выбора нужных цветов сначала. Кнопка Read LUT позволит прочитать текущие настройки камеры.

image Рисунок 18. Сохранение настроек модуляНастройка модуля распознавания изображений решена. Можно вернуть контроллер в мир живых и рабочих контроллеров. Для этого запускаем RoboPlus, открываем RoboPlus Manager и в верхней строке выбираем пиктограмку Controller Firmware Manager. Нажимаем Next.

image Рисунок 19. Восстановление прошивки контроллераЗатем выполняем все, что нас просит утилита: в появившемся окне нажимаем Find, затем выключаем и включаем контроллер тумблером. Контроллер должен обнаружиться утилитой, после чего дважды нажимаем Next.

image Рисунок 20. Контроллер успешно обнаруженДожидаемся окончания установки прошивки, нажимаем Next, затем Finish. После чего с вероятностью 99% видим ошибку, на которую не обращаем внимание — просто закрываем окно. Эта ошибка возникает из-за некорректной идентификации модуля распознавания изображения, подключенного к контроллеру. Контроллер снова в мире живых — можно начинать его программировать для управления нашим роботом.

Разрабатывать прошивку будем в стандартной среде от Robotis — RoboPlus Task. Программирование в RoboPlus Task осуществляется с помощью специализированного языка, подобного языку программирования С. Для удобства пользователя в RoboPlus в виде графических блоков реализованы базовые возможности набора, такие так: таймеры, блоки обработки данных с датчиков, блоки передачи данных между устройствами и т.п. Я не буду подробно останавливаться на описании процесса программирования, так как среда достаточно интуитивно понятна и не вызывает сложностей. Однако, если остались какие-то вопросы, рекомендую поглядеть примеры разработки в разделе «Статьи» и «Уроки» на нашем сайте. Но прежде чем мы приступим к программированию, разберемся как же осуществляется обмен данными между контроллером и модулем HaViMo2.0.

Связь между модулем и контроллером реализована по тому же самому протоколу, по которому реализован обмен данными между контроллером и сервоприводами Dynamixel AX-12. Сам модуль построен вокруг DSP (Digital signal processor), настройка которого осуществляется через доступ к его регистрам, каждый из которых может быть считан или настроен с использованием калибровочного интерфейса. Подробное описание настройки DSP приводится в мануале по модулю HaViMo2.0. Там же приведен полный перечень регистров. Нам же для работы с модулем обработки изображений достаточно понять, как осуществляется вывод данных с модуля.

Следующий пример показывает вывод обработанного модулем изображения. Могут быть считаны до 15 областей с адресом 0×10 до 0xFF с использованием команды READ DATA (0×02). Каждая область состоит из 16 байт, которые состоят из следующих частей: — Region Index — Индекс области: содержит значение 0, если область не выделена— Region COLOR — Цвет области— Number of Pixels — Количество пикселей: число выявленных пикселей внутри области.— Sum of X Coordinates — Сумма Координаты X: Результат сложения Х координаты всех обнаруженных точек. Может быть поделено на количество пикселей, чтобы вычислить среднее X.— Sum of Y Coordinates — Сумма координат Y: результат сложения Y координаты всех обнаруженных точек. Может быть поделено на количество пикселей, чтобы вычислить среднее Y.— Max X: Ограничительная боковая линия справа.— Min X: Ограничительная боковая линия справа.— Max Y: Ограничительная линия снизу.— Min Y: Ограничительная линия сверху.

image Рисунок 21. Пример вывода изображения с модуля HaViMo2.0Этого примера достаточно для того, чтобы приступить к программированию робота. Напишем в среде RoboPlus Task функцию, которая будет отвечать за определение границ распознанной области. Поскольку данная среда не позволяет вывести код в удобоваримом текстовом виде, то придется размещать скриншоты. Назовем нашу функцию — Get_Bounding_Box. Алгоритм работы функции следующий: — последовательно опрашиваем области (Index) с 1 по 15 в цикле, на каждой итерации которого меняем значение адреса (Addr) в соответствии с правилом указанном выше.— в случае, если мы находим распознанную область (ее индекс не равен 0), то далее мы проверяем ее на соответствие заданному цвету (Color)— в случае, если ее цвет совпадает с заданным, мы фиксируем размер области (Size) и значения ограничительных линий нашей области (Maxx, Minx, Maxy, Miny)

image Рисунок 22. Код функции определения границ распознанной областиПолучив значения размера области и координаты ограничительных линий, можно переходить к программированию движения робота. Алгоритм движения робота достаточно прост — зная координаты ограничительных линий по X, мы находим среднее Х. При движении, если будет зафиксировано смещение среднего Х, робот будет доворачивать в нужную сторону, тем самым самопозиционируя себя на линии, по которой едет. Графически алгоритм определения движения робота представлен на следующем рисунке:

image Рисунок 23. Алгоритм определения движения роботаИ его текстово-блочная реализация:

image Рисунок 24. Код основной функции программыИтак, для этого при включении контроллера мы первым делом инициализируем наши переменные — скорости движения, время движения вперед, время, в течение которого робот будет выполнять поворот, и время на паузу. Далее в бесконечном цикле мы инициализируем подключение к камере (указываем номер порта, к которому она подключена — CamID) и цвет области, который мы будем детектировать. Как мы помним, при калибровке мы выбирали Color 1, поэтому теперь мы его и указываем, как интересующий нас. После этого мы обращаемся к камере и делаем паузу в 150 мс, поскольку после первого обращения камера не отвечает в течении не менее 128 мс. Я поместил функцию инициализации подключения камеры в основной цикл программы, так как камера очень капризная и ей может захотеться «отвалиться». Инициализируя ее на каждой итерации цикла, мы ее как бы «пингуем». Затем мы вызываем описанную выше функцию для определения координат ограничительных линий распознанной области и на основании полученных значений находим среднее (Схх). И затем мы сравниваем полученное значение на соответствие условиям — если полученное значение находится в определенном диапазоне, значит робот едет прямо, если сместилось вправо — робот доворачивает вправо, если влево — соответственно влево. Сами функции, отвечающие за движение представлены ниже:

image Рисунок 25. Примеры функций, отвечающих за движение вперед и за повороты влево — вправоКак видно из их реализации логика работы функций следующая — сначала активируются сервоприводы, которые работают в течение определенного времени, после чего останавливаются. За контроль времени работы и остановку отвечают 2 другие функции:

image Рисунок 26. Функции таймера и остановки сервоприводовВсе. На этом разработка управляющей роботом программы завершена. Можно загружать ее в контроллер и смотреть, что получилось. У меня получилось следующее:

[embedded content]

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

image Рисунок 27. Что реально видит камераОбработав это изображение, исходя из заданных нами настроек, происходит выделение интересующих оттенков выбранного нами цвета:

image Рисунок 28. Выделение оттенков цвета на изображенииИ последним, самым важным этапом, является выделение на этом изображении прямоугольника, параметры которого мы и используем при программировании:

image Рисунок 29. Определение распознанной области в виде прямоугольника.Применительно к нашей задаче этот прямоугольник обозначает следующее:

image Рисунок 30. Трактовка области распознавания, применительно к нашей задачеЧто ж, это все замечательно, однако камера не позволяет нам передавать видео поток в режиме реального времени, чтобы можно было зрительно пронаблюдать, что именно видит камера, и как она это распознает. Но мне очень захотелось отследить хотя бы схематически то, что распознает камера, и то, как ведет себя робот. Для этого я воспользовался средой LabView, с помощью которой организовал сбор данных с контроллера CM-530 и их обработку (Подробнее о том как собирать данные с контроллера CM-530 читайте в моей статье — «LabView в робототехнике — создание SCADA системы для управления роботом»). Не то, чтобы утилита получилась красивая, но, на мой взгляд, довольно полезная для анализа движения робота. Поскольку у меня не было под рукой никакого беспроводного адаптера — ни ZigBee, ни Bluetooth, пришлось данные гнать про USB проводу, что несколько стесняло мои действия. Интерфейс выглядит следующим образом:

image Рисунок 31. Интерфейс приложения для анализа движения роботаИ разметка области распознавания, с пояснениями, применительно к нашей задаче:

image Рисунок 32. Разметка окна распознавания, применительно к нашей задачеИнтерфейс состоит из следующих элементов: — верхнее левое окно: это область видимости камеры. Красными линиями показана наша трасса, зеленой пунктирной — середина линии. Синяя область — это область, которую распознал модуль распознавания изображений в текущий момент (та самая распознанная область из рисунка 29. Синяя пунктирная линия — середина данной области. При движении робота идет непрерывный анализ положения этой линии относительно красных — если синяя линия находится внутри области, ограничиваемой красными линиями, то робот движется прямо, если выходит за ее пределы — робот доворачивает в соответствующую сторону.— нижнее левое окно показывает положение робота относительно трассы в режиме реального времени. Красными линиями, опять же, обозначены границы нашей трассы, зеленой пунктирной — середина.— правое нижнее окно показывает реальное передвижение робота — съемка движения робота камерой мобильного телефона.— справа вверху находятся элементы настройки соединения и индикаторы для отображения данных, поступающих с робота, а также окно для вывода ошибки, в случае ее возникновения.Но смотреть на статичную картинку неинтересно, поэтому предлагаю Вам посмотреть видео, где наглядно виден весь процесс движения робота:

[embedded content]

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

— «лучше меньше, но больше» — чем меньше скорость передвижения и чем меньшее расстояние робот проезжает за единицу времени, тем лучше, т.к. тем меньше вероятности, что робот пропустит («не увидит») поворот, или сильно уйдет с маршрута; — вытекает из первой рекомендации — чем острее угол поворота, тем больше вероятности того, что робот его пропустит; — наш главный враг — покрытие пола. Тут уж сами думайте, что делать — лично я, для езды по линолеуму, на нижнюю часть робота прикрепил лист бумаги, т.к. сопротивление и скрип были ужасные; — закон Мерфи — если робот едет по светлой линии на темном фоне и в округе есть объект, который можно условно назвать светлым — знайте: для робота он окажется самым светлым, и он с радостью побежит к нему; — следствие из закона Мерфи — как бы вы не уменьшали область обзора камеры, робот всегда найдет такой светлый объект; — робот может испугаться собственной тени, поэтому всегда продумывайте, как будет падать свет, и обучайте модуль распознавания на работу при разном освещении; — будьте готовы к тому, что батарейки разрядятся в самый неподходящий момент, а внешне это будет выглядеть так, как будто у вас ошибки в управляющей программе, прошивке контроллера, самом контроллере и ДНК. Так что всегда контролируйте заряд батарей — для такого робота нормальным напряжением является 8–9В.

Ну и в заключении хотелось бы сказать, что совершенству нет предела — так что все в ваших руках. Вперед за приключениями в области робототехники!

ЗаключениеСегодня мы с Вами разобрались как реализовать техническое зрение на широко распространенных наборах Bioloid STEM с использованием модуля распознавания изображений — HaViMo2.0. Это был всего лишь первый шаг в направлении технического зрения в рамках наших публикаций. В следующей статье, посвященной техническому зрению, мы рассмотрим усложненную задачу — движение вдоль линии, имеющей разный тип разметки, с учетом распознавания находящихся вдоль нее некоторых знаков — аналогия движению автомобиля по трассе. Надеюсь, данная статья Вам оказалась полезной и интересной. До новых встреч!

© Habrahabr.ru