Как стать автором
Обновить
0
Golf Robotics
Производство роботов для сбора мячей для гольфа

Камеры машинного зрения для энтузиастов. Как использовать камеру для автономной навигации?

Время на прочтение6 мин
Количество просмотров9.7K

Мы сделали камеру для определения AprilTag и ArTag с mROS. Подключением по Uart или Ethernet.



Мы пробовали JeVois и OpenMV, оценили плюсы и минусы и собрали свою камеру.



Поиск визуальной метки и ориентация робота на основе полученных данных. Мы разрабатываем робота для сбора мячей для гольфа на driving range. Сейчас в мире только одна компания продает робота для решения этой задачи. Рынок очень перспективный, это сподвигло нас превратить проект из DIY в технологический стартап.

Используя GPS без RTK для навигации робота сложно добиться точности, необходимой для безошибочного поиска базы и парковки. Используя Real Time Kinematic, проблемы буду при подъезде к зданиям. Мы испробовали различные варианты и приняли решение сделать свою камеру для поиска визуальной метки при подъезде к базе.

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

В качестве цели были выбраны метки AprilTag, либо ArTag — в зависимости от того, как себя покажут в поле. Т.к. мы не страдаем NIH синдромом — начался поиск камер машинного зрения с поддержкой этих маркеров и с поддержкой скриптов прямо на камере.

Первый JeVois


Из того, что быстро нашлось — JeVois, разработка лаборатории University of Southern California. К сожалению, пришлось заказать в Россию через Амазон, внутренних реселлеров не было и судя по всему не будет — судя по всему маркетинг и продажи ведутся самими разработчиками (мы были был немало удивлены, когда для покупки камеры пришлось переходить с сайта Jevois на сайт Jevois inc, а потом поискав ссылку на каталог — выбрать именно камеру где-то посередине 10-12 позиций).



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

Указанные в рекламных материалах 60-90 FPS даны для разрешений 160x120 либо 320х240, что совсем не походит для парковки — захват все же желателен с расстояния хотя бы 5 метров. А чтобы в зерно 160х120 с 6-8 метров попал квадрат — надо делать его размером минимум полметра и приближении он сначала полностью закроет кадр, а потом перестанет детектится вовсе.

Потребление в 800мА, при этом питание только по USB кабелям с mini USB, которые могут выдержать такой ток без особого падения напряжения. Найти кабель длиной хотя бы полметра с такими особенностями оказалось весьма сложно — перебрано около 15 вариантов, и результат оказался не особо удовлетворителен все равно.

Камера либо слепа ночью, либо пересвечивает днем. Автобаланс работает за пределами добра и зла.

Камера охлаждается вентилятором. Вентилятор очень маленький, скорость высокая — высокочастотный шум или попросту визг.

Визжащий робот — это последнее что нам хотелось делать.

Написание же кода исполнения внутри камеры это отдельное развлечение — установка окружения достаточно путанное дело а сборка и заливка на SD карту занимает минимум 2-5 минуты. Да, флеша нет — все на SD карте.

Вывод: камера для поиграться энтузиастам внутри помещений и с хорошим освещением. При этом желательно что бы энтузиасты были из студентов — интерфейс, документация и способы работы с камерой мне живо напомнили студенческие лабораторные работы, где почти не уделяется внимания на удобство работы с системой и прочие излишества. Это про C++ модули, конечно. Python скрипты можно править через Jevois Inventor, но и FPS тогда существенно ниже. Вне помещений же камера не пережила даже двух дождей, а грязь на поле забила вентилятор с космической скоростью.

Итог — к применению на роботе не годна, однако доказана принципиальная возможность парковки.

OpenMV 3 и все его варианты




В момент первых поисков просто не был доступен — проходила кампания на Кикстартере.

После того как мы наигрались с JeVois и 100 баксов оказались выкинутыми в помойку — был найден продавец с запасами и куплено 2 штуки.

В целом впечатления крайне приятные — замечательно продуманный интерфейс в OpenMV IDE, прозрачная компиляция питона, удобно смотреть за работой алгоритма, отлаживать. Однако проблемы были и тут:

  • Разрешение могло быть любым, однако поиск AprilTag мог вестись только на участке не более чем 200x200 пикселей. Возвращаемся к проблеме зерна и т.д. Разработчик порекомендовал выдергивать сначала блобы, потом в них смотреть коды. Но на чем-то кроме однотонного фона (в идеале белой стены) это не работает, зеленая травка и яркое солнце на фоне все превращают в кашу. Плюс FPS падает до максимум 5.
  • Дешевый Omnivision сенсор + дешевая оптика = мыльная картинка. Визуально это не очень заметно при просмотре видео потока, но при просмотре отдельных кадров четко видно.
  • Нет ИК шторки, зато есть ИК подсветка. [WHAAAAT ?]
  • Нет защиты от внешней среды. Совсем нет.



На этой камере был отлажен скрипт, сделано несколько десятков прогонов парковки. Однако после того как робот скатался из Москвы в Питер и обратно камера перестала запускаться — выбило регулятор питания. Очевидным действием было корпусирование и стабилизация питания. И вот тут-то обнаружилось самое интересное — корпус с нужным IP под эту камеру просто не удалось найти, либо это были боксы с прозрачными крышками, без внутренних креплений и герметичных вводов-выводов кабелей. В результате поисков была найдена масса дешевых китайских камер видеонаблюдения с нужными корпусами. Камера была куплена и распотрошена, вместо платы встал второй экземпляр OpenMV, все заработало.
Но вечер-ночь стали почти непреодолимой преградой — нет ИК шторки.

Итоги: камера ОЧЕНЬ удобная для прототипирования, ресурсы ограничены, нет защиты от внешней среды совсем (вторая камера потом отправилась в промышленный морозильник и -30 не пережила). Не годится.

И тут нам стало очень интересно, что же за платы мы достали из китайских камер

HiSilicon клоны


При внимательном рассмотрении оказалось что на плате стоит 2-х ядерный ARM, DSP процессор, ИК шторка, ИК подсветка, приличный сенсор от Sony, плата покрыта защитным составом + корпус для улицы. Прямо то что надо — осталось собрать софт.

Внутри оказался вполне рабочий клон Линукса от HiSilicon + u-boot.
Пришлось выкачать SDK с китайских ресурсов и разбираться со сборками. В принципе ничего страшного по пути не обнаружилось, кроме того, что необходимо исправить несколько файлов внутри SDK — дистрибутив Линукса на котором SDK собирался достаточно старый, и некоторые заголовочные файлы с тех пор сменились. Ну и пришлось сменить шелл с zsh на bash. Подробности опущу, по хорошему это должна быть отдельная статья.

Помогли вот эти ресурсы :

Разбор, подключение к камере

Примерная схема по сборке софта

Дальше все пошло по известной схеме:



Основное время заняла работа по получению картинки с сенсора, остальное я дописал буквально за 4 часа, просто портировав отлаженный алгоритм с Python на C++.
Работа же с сенсором заняла около полутора недель. Разумеется никакого /dev/video0 в этих устройствах нет, практически голое железо с работой напрямую с памятью и портами.
Сразу скажем, что сэмплы из SDK работают без доработки только на отладочных платах под эти SDK, в остальном это требует массы мелких правок. Как ни смешно — основная проблема это определить какой точно сенсор стоит в камере, т.к. китайцы пишут в описании одно, на плате маркировано другое, в софте инициализируется третья модель. Как пример — камера имеет в описании сенсор IMX323, плата имеет маркировку SC2235, при старте в init скриптах запускается как AR130, а софт работы с камерой инициализирует ее как SC2235P.

Причины всего этого достаточно просты: для конечного невзыскательного потребителя что IMX323, что SC2235 — все едино, картинка весьма похожа. Ядро и rootfs с инит скриптами собрали из SDK с минимальными правками и не стали возиться с отдельным скриптом инициализации под каждую модель — правят только параметры запуска, а название оставили как было. В софте же работы с камерой уже запускается второй кусок инициализации работы DSP с сенсором и там уже критична точная модель камеры — поэтому в логах уже есть точная модель — SC2235P. Р — это важно, это другой по характеристикам сенсор, который даже работает на чуть другой частоте шины и другое разрешение по сравнению с SC2235.

Вторая часть квеста — это даташиты на сенсоры, которых по большому счету и нет. Поэтому пришлось пересобрать модуль hi_i2c с печатью в лог через printk и заменить в снятом дампе с камеры, написать дампер конфигурации DSP видеопроцессора и снимать конфиги с работающей камеры, плюс несколько раз просмотреть драйвера из проекта DafangSoftware. В деталях это тянет на 3-4 отдельные статьи, которые я намерен написать после НГ.

В итоге все получилось даже лучше, чем ожидалось — уверенная работа по захвату AprilTag с 6 метров даже в почти полной темноте, 25-12 fps, ПИД регулятор по управлению парковкой и т.д.
Итог — самое оно для работы в поле, учтены многие вещи для защиты от внешних условий. Единственное что не удалось полностью проверить — работу на ярком солнце, погода с октябрю месяцу испортилась.

Идея для развития


И тут нас посетила идея — у нас в руках аналог OpenMV с куда как лучшими аппаратными характеристиками и имеющее массовое производство. Осталось довести работу с камерой до уровня OpenMV, спортировать туда micropython, сделать удобное IDE и перепроверить как будут работать текущие скрипты из OpenMV. Кроме этого туда вполне портируется mRos и это сразу расширяет применение таких камер для систем на ROS.

В итоге, мы планируем поставки аналогов OpenMV в марте и mROS к маю.

Для того, чтобы снизить цену на кастомизацию камеры мы готовы предложить ее Вам. Заполните форму и мы с Вами свяжемся когда будем готовы к заказу первой партии.
Теги:
Хабы:
+14
Комментарии10

Публикации

Изменить настройки темы

Информация

Сайт
golf-robotics.com
Дата регистрации
Дата основания
Численность
2–10 человек
Местоположение
Россия
Представитель
Вячеслав Голицын

Истории