Опыт проектирования девайса для стереозрения: от идеи до серии


— Привет, ты сейчас чем занят помимо работы?
— Да ничем особо.
— А что умеешь?
— Всего понемногу. Модели 3d рисовать, платы разводить простенькие, посчитать что-нибудь в матлабе.
— Есть интересная задача, хочешь поучаствовать?..

Так началось мое знакомство с проектом 3dberry – устройства для изучения компьютерного зрения на Raspberry Pi. По сути, в начале задача сводилась к тому, чтобы смоделировать геометрию оптики в каком-нибудь CADе. И сразу мной было решено найти систему, моделирующую прохождение лучей во всей красе и как можно более наглядно. После небольшого анализа существующих продуктов был выбран один, наиболее визуально пригодный, простой в установке и максимально функциональный.

Программа поставлялась в виде аддона для SW, и после небольшой анкетки на сайте получена 30тидневная триалка. Первый запуск показал, что интуитивно далеко не все понятно, были скачаны мануалы, и дальше дело пошло. Но не туда, куда хотелось бы. Софтинка умела делать все, что связано с оптикой, лучами, линзами, зеркалами и т.д., но моделирование стереозрения оказалось на ней слишком заморочным и времязатратным. И, несмотря на любовь к качественному 3d моделированию физических процессов, пришлось от нее отказаться.

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

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

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

Где-то в середине описанного выше процесса разработки конструкции, мне была выдана Raspberry Pi с камерой, и я стал выполнять роль нуба-тестировщика, что вполне соответствовало действительности. Стоит отметить, что до этого Raspberry Pi я видел только на картинках и работал с линуксом постольку-поскольку. Однако все оказалось куда проще, чем я себе представлял, и после накатывания образа на флешку и подключения к малине всего необходимого, включая собранную 3dberry, я запустил скрипт и увидел картинку. Картинка была двойная, как и следует выглядеть картинке со стереокамеры, но немного кривоватая. После нехитрых манипуляций с винтами и камерой в соответствии с рекомендациями из урока, картинка стала явно ровнее, и я продолжил дальше познавать мир стереозрения.

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

Стоит отметить, что это наиболее важный этап подготовки камеры к работе. Как выяснилось позже, не всегда можно получить адекватный результат калибровки, что напрямую зависит от того, как держать доску во время работы скрипта. Однако пока мы не можем обойтись без этого этапа, т.к. калибровка каждой камеры с 3dberry индивидуальна в силу присутствия собственных погрешностей сборки каждой насадки. После прокачки скила этот процесс проходит достаточно быстро и точно, и в итоге, я получил набор из 15 двойных картинок, которые режутся на правые и левые скриптом №4 с учетом результата работы скрипта №2.

Да, еще хотел сказать, что все скрипты из уроков написаны с использованием библиотеки OpenCV 2.4.11 для Python 2.7.10. Некоторые функции в последних версиях питона и OpenCV имеют свои особенности, вызывающие баттхерт в самые неподходящие моменты, поэтому решено было использовать как базу стабильные проверенные версии.

Далее открываем пятый урок, который описывает работу непосредственно калибровочного скрипта. В процессе его работы особо делать ничего не нужно, все что могли мы уже сделали, осталось скрестить пальцы и ждать. Шучу. 🙂 Скрещивать пальцы не нужно – при правильно сделанных картинках все пройдет гладко –, а вот подождать придется, т.к. процесс расчета использует мощность малинки на всю и занимает порядка 5-10ти минут.

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

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

Последний урок самый интересный.

Он наглядно в режиме видео демонстрирует, что можно получить после проведения всех манипуляций, и результат действительно вызывает позитивные эмоции. Напомню, что я – нуб в области стереозрения и раньше видел как это работает только на видео гугловскго проекта танго. Но сейчас я своими руками смог собрать и откалибровать систему, которая может риалтайм строить 3d карту пространства. Причем, мне не понадобилось никаких специфических знаний и умений. По-моему, это замечательно. 🙂

Дальнейшие планы разработки девайса зависят полностью от отзывов наших пользователей, но мы можем уже сейчас сказать, что настроены улучшать конструкцию и качество производства и сборки. Скрипты мы двигаем в сторону уменьшения времени расчета и приближения хотя бы к 4м кадрам в секунду на второй малине – этого уже будет достаточно для полноценного применения в проектах в режиме «почти-риалтайм». Первые отзывы показали, что для использования на реальных роботах хотелось бы побольше угол обзора и стереопару, но пока это только теоретически, первые эксперименты на настоящей системе покажут какие есть недостатки, и в какую сторону нам лучше всего бежать.

Будем рады отзывам и предложениям в комментариях!


0 комментариев на «“Опыт проектирования девайса для стереозрения: от идеи до серии”»

  1. Максим, интересно.
    В комментариях могу покритиковать/предложить
    1. Я так и не понял суть устройства, возможно фотографии могли бы пролить свет
    Одна камера с системой зеркал? Почему не две камеры?
    2. Что система выдает на выходе?
    Замудреную картинку или же 3D модель в неком формате?

  2. Evsurf, спасибо за отзыв! Суть в том, что мы можем получать стереокартинку с одной камеры (то есть да, одна камера с системой зеркал). Нет необходимости синхронизировать потоки или покупать дорогие девайсы. На выходе получается карта глубин, которую уже можно дальше переводить в 3d модель или в облако точек, например. Кстати, на 3dberry.org есть видео работы самого девайса и скрипты для работы.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение