Сегодня я бы хотел рассказать вам о нашей новой железке на базе Raspberry Pi Compute Module, предназначенной для изучения компьютерного зрения и установки на роботов и дронов. По сути это «умная» стереокамера — она поддерживает работу с двумя камерами одновременно, имеет в качестве «сердца» настоящую малину и, самое важное – работает со стоковой версией Raspbian.
Вот как выглядит собранное решение, с установленными двумя камерами и Pi Compute модулем.
Устройство работает со стоковой версией Raspbian. Вам нужно только скопировать наш файлик dtblob.bin для того, чтобы включить поддержку двух камер.
Это означает, что вы можете использовать привычные raspivid, raspistill и другие утилиты для работы с изображениями и видео.
Для справки, поддержка режима стерео появилась в Raspbian аж в 2014 году, одновременно с выходом первой версии Raspberry Pi Compute. Вы можете посмотреть историю разработки поддержки стереорежима на форуме Raspberry.
Перед описанием технических деталей позвольте показать вам несколько реальных примеров работы устройства.
1. Захват изображения
Код:
raspistill -3d sbs -w 1280 -h 480 -o 1.jpg
и вы получаете следующее:
Вы можете скачать оригинальное захваченное изображение вот тут.
2. Захват видео
Код:
raspivid -3d sbs -w 1280 -h 480 -o 1.h264
и вы получаете следующее:
Вы можете скачать оригинальный видеофайл (конвертирован в mp4) по этой ссылке.
3. Использование Python и OpenCV для построения карты глубин
В этом случае я использовал слегка модифицированный код из предыдущего проекта 3Dberry (https://github.com/realizator/3dberry-turorial).
Для получения этих картинок и видео мы использовали вот такую пару камер:
Для установки на дронов чаще используем широкоугольные (160 градусов), вот такие:
Теперь чуть подробнее про саму железку
Технические детали
Вид спереди:
Вид сверху:
Основные характеристики:
Размеры: 90x40 mm
Камеры: 2 x CSI 15 lanes cable
GPIO: 40 classic Raspberry PI GPIO
USB: 2 x USB type A, 1 USB on a pins
Ethernet: RJ45
Память: Micro SD (for CM3 Lite), у остальных NAND (flash)
Монитор: HDMI out
Питание: 5V DC
Поддерживаемые малины: Raspberry Pi Compute Module 3, Raspberry Pi CM 3 Lite, Raspberry Pi CM 1
Типы поддерживаемых камер: Raspberry Pi camera OV5647, Raspberry Pi camera Sony IMX 219, HDMI In (одиночный режим)
Для прошивки NAND: MicroUSB connector
Выключатель питания: Да-да, это он. Больше никаких втыканий-вытыканий MicroUSB провода для ребута по питанию!
Немножко истории
Вообще затея сама появилась еще в 2015 году. Первая версия родилась в конце 2015 года. Некоторые знают, что у нашей команды есть «пунктик» на удаленном управлении разными механическими штуковинами, поэтому в первом релизе на борту был установлен дополнительный чип, дававший нам 16 PWM выходов — для руления сервами, моторчиками и прочими полезностями.
К тому моменту на рынке была только первая версия Compute модуля, на борту которой стоял старый процессор от самой первой распберри. Железка прекрасно справлялась с захватом, сжатием и стримом видео, но в конце концов мы уперлись именно в процессор. Например, её уже не хватало для одновременно стрима h264 пилоту и RTMP стрима на сервер. А для роботостроителей основной хотелкой стало построение карты пространства по карте глубин и SLAM — тут процессора не хватало совсем.
У тут на тебе — выходит версия Compute Module 3. Они сразу «перепрыгнули» с первой версии на третью, поставив процессор от третьей Raspberry. Теперь его мощности уже было достаточно, чтобы что-то обсчитывать на лету.
Однако оказалось что поколения вроде как и совместимы, а вроде как и не очень. Тот факт, что Compute Module 3 был на миллиметр шире нас не смутил. А вот требования к питанию серьезно поменялись.
К тому же у нас уже набралось замечаний по результатам работы с первой версией, и мы решили выпустить новую, в которой внесли все накопившиеся изменения.
Что исправлено во втором поколении
Добавили поддержку Compute Module 3
У нас переключаемая схема питания, так что при желании можно работать и с первой малиной. Выбор тут простой: если нужно только транслировать видео — прекрасно хватает первой малины. В качестве бонуса идет её почти в три раза меньшее энергопотребление и тепловыделение. А нужно посчитать что-то посерьезнее (несколько видео либо компьютерное зрение) — ставим третью.
Развернули модуль «чипами от платы»
В первой версии перепутали тип разъема SoDIMM на плате, в результате компьют-модуль вставал чипами «к мамке». На Compute Module 1 это проблем не вызывало — проц грелся слабо, и узкого места между платами ему хватало для нормлаьного охлаждения. С третьим такой фокус бы не прокатил, поэтому мы «перевернули» коннектор, что повлекло за собой переразводку всей платы с чистого листа.
Штатная поддержка MicroSD
Первый компьют-модуль по умолчанию имел встроенную FLASH на борту и с микросд работать не умел. Мы попытались привесить туда MicroSD как второй накопитель, но столкнулись с большим головняком по его поддержке. Общение с кернельщиками на малиновом форуме показало, что проблема непростая (при загрузке модуль рандомно выбирал NAND или MicroSD для бута). В итоге на текущей ревизии мы сделали разводку как на референсной devboard от малины. Если Compute Module Lite — без встроенной NAND — работаем с микросд как в обычной малине. Если версия не Lite или первый модуль — микросд недоступна.
Переместили коннекторы камер наверх и разнесли на 65 мм
В первой версии коннекторы были направлены вдоль плоскости платы. Мелочь, но после множества установок в корпуса выяснилось несколько проблем.
- Из коннекторов торчит шлейф камеры, который желательно не гнуть (особенно синюю армированную часть). Это тупо занимало ненужное место в корпусе и мешало установке.
- Коннекторы были совсем рядом — это мешало работать со шлейфами.
- Камеры в корпусе обычно стоят на 65 мм стереобазу, а шлейфы на плате были рядом. Получается что каждый шлейф приходилось неестественно изгибать — надломы, разрывы, выскакивание из коннекторов.
Убрали чип и дополнительные 16 PWM
Проанализировав множество последних проектов поняли, что фича эта неактуальна. Чаще всего хватает и программных PWM малины.
Добавили выключатель питания
Те кто хоть немного работал с малиной понимают о чем речь :-)
Добавили третий USB на пинах сбоку
В наших малиновых проектах нам часто нужны USB донглы на борту. Если их втыкать в разъемы на плате — имеем торчащий далеко наружу модуль. Попытка воспользоваться USB удлинителем еще больше усугубляет проблему. Оставался один вариант — пайка проводками напрямую к малине. Добавленные нами боковые пины позволяют сделать простой удлинитель и расположить USB донгл (чаще WiFi или 4G) прямо вдоль платы, и всё это хозяйство прекрасно помещается в компактный корпус.
Вот такую вот историю я хотел вам сегодня поведать. Спасибо за внимание и готов ответить на вопросы.
Комментарии (50)
QuaziKing
28.06.2018 18:01+1Gde kupit?
Realizator Автор
28.06.2018 18:13Пока нигде, железка только покинула стены хардварной лаборатории. :-)
Прикидываем сейчас объем и стоимость тиража.
Gol
28.06.2018 18:07+1Я больше моделист, чем роботостроитель, так что я эту штуку использовал, в основном, на машинках. Выглядело примерно вот так (первая версия была, колхозная)
www.instagram.com/p/BH0tqazDseG
www.instagram.com/p/BH0uCn_DXj4
Видео с борта отдавалось по вифи, через WiFiBroadcast. Ощущения при езде в Окулусах офигенные были :-)
Помимо стерео картинки, камеры могут работать независимо, т.е. можно запустить два raspivid и стримить два потока одновременно. Вместо одной из камер можно HDMI захват добавить. Два HDMI пока завести не получилось, к сожалению.Realizator Автор
28.06.2018 21:31Видео с борта отдавалось по вифи, через WiFiBroadcast. Ощущения при езде в Окулусах офигенные были :-)
Ага… я хорошо помню фрагмент, когда машинки подъезжали к девчонкам в миниюбках, которые на тех тестах были. Машинки то у самой земли, девочки высокие, а камеры широкоугольные. :-)
Ivanii
28.06.2018 18:22+2А зачем безногий кварц на первой фотке рядом с RJ45?
Realizator Автор
28.06.2018 18:28+2Я ждал этого вопроса! Аппаратчики подтянулись! :-) Плюсанул карму как первому заметившему.
Это кварцевый резонатор для чипа с сеткой и USB. На первой ревизии накосячили с линией PLL — протянули её сквозь все слои на другую сторону. Пришлось накладывать патчи и ставить внешние резонаторы. В итоге переразвели плату и вернулись к решению по обвязке, которое было в первой ревизии.
Four_Leaf_Clover
28.06.2018 20:25+1Только начал пилить болванку жесткого диска для зеркал камеры, как вы выпускаете такой интересный продукт. Спасибо, что развиваете это направление. Жду релиза!
BelBES
28.06.2018 21:19+1А как решен вопрос с синхронизацией видеопотоков? Для динамичных сцен это критично...
Realizator Автор
28.06.2018 21:26Я в статье давал ссылочку на форум малины, там есть такой товарищ 6by9, который собственно и реализовывал стерео в Raspbian, и в малиновой ветке пару раз он на него отвечал. Если коротко — тут нет синхронизации как на промышленных сенсорах (которые с глобальным затвором и для синхрона прям отдельную ногу имеют), но рассинхрон минимальный (миллисекунды набираются за десятки минут).
Ну а мы как любители практики пробовали ставить стереострим видео на десятки часов — визуальной разницы не заметили (это значит что разница если и есть, то не больше пары десятков миллисекунд). Это как раз Gol и тестировал.
Realizator Автор
28.06.2018 21:39upd> в прошлом ответе (про 6by9) я говорил про синхронизацию именно процесса захвата сенсорами. В видеопотоке кадры с обеих камер склеиваются и идут одним кадром, режимов склейки много (со скейлом, без, side-by-side, top-bottom и так далее). Так что «долетают» они одновременно — это если речь о том что стереопара распознается и анализируется уже где-то на земле, а не на борту
BelBES
28.06.2018 22:56Просто помню, что когда активно занимался стереозрением, то для случая, например, самоходных автомобилей, рассинхрон в 50-100ms между кадрами уже давал серьезные артефакты на результирующей depth map'е.
Realizator Автор
28.06.2018 23:34Ну 50-100 это реально очень много, согласен. А как у вас такое получалось? Камеры независимо на компе захватывались и оцифровывались?
BelBES
29.06.2018 00:03Ну да, если тупо брать две камеры и без какой-либо синронизации брать с них кадры, то такая большая задержка получается.
BelBES
29.06.2018 00:03По хорошему по тайм-стемпам синхронизировать надо, тогда можно добиться задержки <10ms
Realizator Автор
29.06.2018 01:14У нас немного иная логика — камеры малины родные, по шинам CSI-2 обе воткнуты напрямую в проц, поэтому всё шустро. Это не две отдельные камеры по USB или через платы видеозахвата. И, кстати, у обеих малиновых на лету синхронизируются настройки — балансы белого, яркость и прочие вещи. С независимыми камерами это большая проблема.
evgeny_boger
29.06.2018 00:28Спасибо за статью! А расскажите, как доставать в промышленных масштабах CM3? Какие microSD берёте, чтобы не сыпались? Почему выбрали R-Pi, а не какие-нибудь imx6q?
Realizator Автор
29.06.2018 01:10+1Ну CM3 спокойно продается на фарнеловских сайтах, можно штучно приобретать, а можно вагонами :-).
По карточкам — ну тут кто что любит, мы чаще Kingston или Transcend используем.
А почему малина — ответ простой: готовность и уровень поддержки софта и сообщества. Нам в свое время хватило счастья от переноса линукса с ядра 2.6.32 на 3.9 на виртурилке, спасибо и низкий поклон Texas Instruments. Хочется просто брать и проводить эксперименты со стереозрением, а не пытаться месяцами просто заставить софт работать.
W0xel
29.06.2018 09:31Очень круто. Работаем сейчас с OpenCV на Python. Где эту приблуду достать можно, а главное — за сколько? Если можно то в ЛС vk.com/barashkoff3. Спасибо!
Singrana
29.06.2018 10:17Присоединяюсь к вопросу — как такую достать?
Realizator Автор
29.06.2018 11:58Ну как выпустим тираж — можно будет купить. Пока мы пытаемся понять интерес народа. Продвинутые товарищи разгадали квест в статье и смогли встать в очередь. :-)
Вообще мы железо обычно разрабатываем для своих задач, когда не можем найти на рынке готовое решение, подходящее под наши задачи. Если решение вызывает массовый интерес — уже организовываем тираж.dlinyj
29.06.2018 13:51Лично у меня интерес следующий, робот телеприсутствия. Так чтобы можно было смотреть стереоскопически, что происходит.
Realizator Автор
29.06.2018 13:55Я ниже ответил, что все виртурильные наработки перенесены на малину. Стерео у нас поддерживается «из коробки» — менять ничего не надо. Собственно мы уже летали и катались со стерео, еще с прошлой ревизией стереопи с первым компьют-модулем. На форуме для радиомоделистов я небольшой обзорчик делал.
upd> сейчас прикручиваем это всё к Oculus Go, но тут Gol подробнее рассказать может
dlinyj
29.06.2018 13:50А что с проектом виртурилка, уже заморожен?
Realizator Автор
29.06.2018 13:52Наработки все перенесены на другие платформы (чаще с малиной работаем), саму железку прошлую уже выпускать не будем — время идет, много нового появляется. Можно считать что stereopi это витртурилка 2.0
dlinyj
29.06.2018 13:54Я к вам пришёл тогда не в самый удачный мой период жизни, вот и получилось, что несколько слабоват для вас был. Желаю всяческих успехов вам, даже готов посодействовать чем-то. Разве что теперь в Питере живу.
DirectX
29.06.2018 16:09Интересный проект, но Малина, к большому сожалению, не потянет серьёзный процессинг. Только совсем уж простые алгоритмы в реальном времени можно реализовать. Для более серьёзных вещей нужны штуки вроде Nvidia Jetson TX2.
Realizator Автор
29.06.2018 16:17+1Согласен, вопрос только в определении «серьезный процессинг». Джетсон штука очень злая, с малиной сравнивать нечестно :-) Ну и цена у самого джетсона (без кроватки и обвязки) примерно в 13 раз выше.
Для задач «изучить», «быстро спрототипировать» малина больше подходит. И получается хороший вариант пощупать технологии перед тем, как переходить на предложенную вами тяжелую артиллерию.
пы.сы.: Google умудрился на PiZero (с очень старым процом) запихнуть нейронку и распознавание образов, так что тут еще и вопрос оптимизации решения под платформу.
pulsatrix
29.06.2018 20:25А с какой точностью определяется глубина «залегания» предметов?
Realizator Автор
30.06.2018 11:49А это зависит от стереобазы (расстояния разнесения камер) и разрешения, с которым будете работать. Это конечно не миллиметры или сантиметры на расстоянии десятков метров, как, например, у лидаров типа Lidar Lite v3 HP, зато за один кадр вы сканируете сразу большой кусок пространства — до полусферы (при широкоугольных камерах).
futureader
30.06.2018 02:25Выглядит круто, компактно.
Но мне не очень понятно, почему этот extension board за 59$ настолько дороже самой raspberry pi? И почему бы не решить эту же проблему дешевле просто использовав 2 raspberry pi? В случае со stereo vision можно даже препроцессинг делать на каждой.Realizator Автор
30.06.2018 11:52Варианты с двумя распберри пробовались еще в эпоху первых малин. Идея интересная, особенно с малявками типа PiZero. Но, к сожалению, к моменту «сбора» двух картинок по сетке в одну стерео набирается гарантированный рассинхрон в несколько кадров — карта глубин рассыпается. А касательно цены — мы не Raspberry Foundation, тираж прикидывали небольшой. Будут миллионы устройств — будет копеечная цена. :-)
akaAzazello
30.06.2018 13:43позволю уточнение (т.к. вначале некорректно предполагал, что эта плата влючате в себя миксер для стерео-камер) — поддержка 2х камер по интерфейсу CSI — это фича RPI Compute module, и все наличествующие Compute Module IO Board (официальная и китайские вариации) уже имеют таковые 2 входа.
уникальность вашей платы в её размере (по цене китайские IO Board дешевле будут), благодаря которому она прекрасно влезет в какое-то роботизированное устройство, но стоило ли на ней оставлять в таком случае RJ-45, HDMI, полноразмерные USB?Realizator Автор
30.06.2018 13:47Хороший вопрос. Как я упоминал, мы обычно затачиваем наши железки под решение своих задач. Нам нужна была компактная плата, с которой хорошо и удобно делать две вещи:
1. Комфортно отлаживаться. Поэтому у нас полноразмерные USB на борту, полноценный коннектор сетки и полноразмерный HDMI.
2. Удобно встраивать на борт в готовом решении. Поэтому плату сделали маленькой, и предусмотрели «слим» версию (я её показывал на видео) без больших разъемов и колодки GPIO, которые просто не паяются при производстве.
Касательно китайских GPIO — это клоны отладочной борды от самой Raspberry с вариациями на эту тему. Они очень удобны для прототипирования при разработке своего железа, но никак не годятся для наших целей. Они просто для других задач, с которыми кстати хорошо справляются.Realizator Автор
30.06.2018 16:02upd> опечатался — не китайских GPIO, а китайских devboard имел в виду
AmigoRRR
Молодцы ребята, классная плата!
Что с поддержкой ubuntu 16.04 и ROS?
Gol
Я ROS ни разу не использовал, так что не знаю. Насчёт Ubuntu тоже не уверен. В Raspbian точно работает.
Realizator Автор
Ну убунту на малину можно накатить (https://www.ubuntu.com/download/iot/raspberry-pi-2-3)
Прелесть распбиана в том что там клевая обвязка вокруг видеоподсистемы сделана, в частности по стерео. Никакой головной боли.
С ROS есть планы активно туда забуриться. Основной этап битвы с железом вроде завершен (тьфу-тьфу-тьфу), будем сейчас прикладным софтом заниматься.
А у вас по ROS общий интерес, или пробовали уже там карту глубин и SLAM?
AmigoRRR
Почитайте мой, блог, делаю робота на ROS.
Карту глубин и SLAM еще не делал, нет у меня пока таких камер, но думал об этом, пока больше в сторону лазерного лидара смотрю.
Но тема стерео зрения и построения карты глубины в ROS крайне интересует, пока не видел норм работ на эту тему.
Если вы делаете свое устройство для роботов, то рекомендую всетаки сделать поддержку ROS и написать понятные туториалы, тесты.
Realizator Автор
Именно так и планировали делать. Мануалы в стиле уроков (как на 3dberry.org) будут.
У нас до большого тиража будут пробные выпуски платы маленькими партиями, планируем раздать несколько штук ранним тестерам. Сейчас вот будем набирать желающих.
AmigoRRR
Можете меня записать в желающих, сниму вам красивые видео обзоры и статьи напишу.
Realizator Автор
Записал!
keylase
И меня пожалуйста
Realizator Автор
сделано
pneuman
и меня!
dlinyj
Ну я чего в стороне-то буду…