StereoPi — наша железка для изучения компьютерного зрения, дронов и роботов

    Всем привет!

    Сегодня я бы хотел рассказать вам о нашей новой железке на базе Raspberry Pi Compute Module, предназначенной для изучения компьютерного зрения и установки на роботов и дронов. По сути это «умная» стереокамера — она поддерживает работу с двумя камерами одновременно, имеет в качестве «сердца» настоящую малину и, самое важное – работает со стоковой версией Raspbian.
    Вот как выглядит собранное решение, с установленными двумя камерами и Pi Compute модулем.

    image

    Устройство работает со стоковой версией Raspbian. Вам нужно только скопировать наш файлик dtblob.bin для того, чтобы включить поддержку двух камер.

    Это означает, что вы можете использовать привычные raspivid, raspistill и другие утилиты для работы с изображениями и видео.

    Для справки, поддержка режима стерео появилась в Raspbian аж в 2014 году, одновременно с выходом первой версии Raspberry Pi Compute. Вы можете посмотреть историю разработки поддержки стереорежима на форуме Raspberry.

    Перед описанием технических деталей позвольте показать вам несколько реальных примеров работы устройства.

    1. Захват изображения


    Код:

    raspistill -3d sbs -w 1280 -h 480 -o 1.jpg

    и вы получаете следующее:

    image

    Вы можете скачать оригинальное захваченное изображение вот тут.

    2. Захват видео


    Код:

    raspivid -3d sbs -w 1280 -h 480 -o 1.h264

    и вы получаете следующее:

    image

    Вы можете скачать оригинальный видеофайл (конвертирован в mp4) по этой ссылке.

    3. Использование Python и OpenCV для построения карты глубин


    image

    В этом случае я использовал слегка модифицированный код из предыдущего проекта 3Dberry (https://github.com/realizator/3dberry-turorial).

    Для получения этих картинок и видео мы использовали вот такую пару камер:

    image

    Для установки на дронов чаще используем широкоугольные (160 градусов), вот такие:

    image

    Теперь чуть подробнее про саму железку




    Технические детали


    Вид спереди:

    image

    Вид сверху:

    image

    Основные характеристики:
    Размеры: 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 выходов — для руления сервами, моторчиками и прочими полезностями.

    image

    К тому моменту на рынке была только первая версия Compute модуля, на борту которой стоял старый процессор от самой первой распберри. Железка прекрасно справлялась с захватом, сжатием и стримом видео, но в конце концов мы уперлись именно в процессор. Например, её уже не хватало для одновременно стрима h264 пилоту и RTMP стрима на сервер. А для роботостроителей основной хотелкой стало построение карты пространства по карте глубин и SLAM — тут процессора не хватало совсем.

    image

    У тут на тебе — выходит версия 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) прямо вдоль платы, и всё это хозяйство прекрасно помещается в компактный корпус.

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

    Похожие публикации

    Комментарии 57
      +3
      Молодцы ребята, классная плата!
      Что с поддержкой ubuntu 16.04 и ROS?
        0
        Я ROS ни разу не использовал, так что не знаю. Насчёт Ubuntu тоже не уверен. В Raspbian точно работает.
          +1
          Ну убунту на малину можно накатить (https://www.ubuntu.com/download/iot/raspberry-pi-2-3)
          Прелесть распбиана в том что там клевая обвязка вокруг видеоподсистемы сделана, в частности по стерео. Никакой головной боли.
          С ROS есть планы активно туда забуриться. Основной этап битвы с железом вроде завершен (тьфу-тьфу-тьфу), будем сейчас прикладным софтом заниматься.
          А у вас по ROS общий интерес, или пробовали уже там карту глубин и SLAM?
            0
            Почитайте мой, блог, делаю робота на ROS.
            Карту глубин и SLAM еще не делал, нет у меня пока таких камер, но думал об этом, пока больше в сторону лазерного лидара смотрю.
            Но тема стерео зрения и построения карты глубины в ROS крайне интересует, пока не видел норм работ на эту тему.
            Если вы делаете свое устройство для роботов, то рекомендую всетаки сделать поддержку ROS и написать понятные туториалы, тесты.
              +1
              Именно так и планировали делать. Мануалы в стиле уроков (как на 3dberry.org) будут.
              У нас до большого тиража будут пробные выпуски платы маленькими партиями, планируем раздать несколько штук ранним тестерам. Сейчас вот будем набирать желающих.
                0
                Можете меня записать в желающих, сниму вам красивые видео обзоры и статьи напишу.
                  0
                  Записал!
                    0

                    И меня пожалуйста

                      0
                      сделано
                        0
                        и меня!
                          0
                          Ну я чего в стороне-то буду…
            +1
            Gde kupit?
              0
              Пока нигде, железка только покинула стены хардварной лаборатории. :-)
              Прикидываем сейчас объем и стоимость тиража.
              +1
              Я больше моделист, чем роботостроитель, так что я эту штуку использовал, в основном, на машинках. Выглядело примерно вот так (первая версия была, колхозная)
              www.instagram.com/p/BH0tqazDseG
              www.instagram.com/p/BH0uCn_DXj4

              Видео с борта отдавалось по вифи, через WiFiBroadcast. Ощущения при езде в Окулусах офигенные были :-)

              Помимо стерео картинки, камеры могут работать независимо, т.е. можно запустить два raspivid и стримить два потока одновременно. Вместо одной из камер можно HDMI захват добавить. Два HDMI пока завести не получилось, к сожалению.
                0
                Видео с борта отдавалось по вифи, через WiFiBroadcast. Ощущения при езде в Окулусах офигенные были :-)

                Ага… я хорошо помню фрагмент, когда машинки подъезжали к девчонкам в миниюбках, которые на тех тестах были. Машинки то у самой земли, девочки высокие, а камеры широкоугольные. :-)
                  0
                  какая была задержка видео?
                    0

                    Как обычно, порядка 100-150 мс.

                  +4
                  А зачем безногий кварц на первой фотке рядом с RJ45?
                    +3
                    Я ждал этого вопроса! Аппаратчики подтянулись! :-) Плюсанул карму как первому заметившему.
                    Это кварцевый резонатор для чипа с сеткой и USB. На первой ревизии накосячили с линией PLL — протянули её сквозь все слои на другую сторону. Пришлось накладывать патчи и ставить внешние резонаторы. В итоге переразвели плату и вернулись к решению по обвязке, которое было в первой ревизии.
                      0
                      del
                      +1
                      del
                        +1
                        Только начал пилить болванку жесткого диска для зеркал камеры, как вы выпускаете такой интересный продукт. Спасибо, что развиваете это направление. Жду релиза!
                          +1

                          А как решен вопрос с синхронизацией видеопотоков? Для динамичных сцен это критично...

                            0
                            Я в статье давал ссылочку на форум малины, там есть такой товарищ 6by9, который собственно и реализовывал стерео в Raspbian, и в малиновой ветке пару раз он на него отвечал. Если коротко — тут нет синхронизации как на промышленных сенсорах (которые с глобальным затвором и для синхрона прям отдельную ногу имеют), но рассинхрон минимальный (миллисекунды набираются за десятки минут).

                            Ну а мы как любители практики пробовали ставить стереострим видео на десятки часов — визуальной разницы не заметили (это значит что разница если и есть, то не больше пары десятков миллисекунд). Это как раз Gol и тестировал.
                              0
                              upd> в прошлом ответе (про 6by9) я говорил про синхронизацию именно процесса захвата сенсорами. В видеопотоке кадры с обеих камер склеиваются и идут одним кадром, режимов склейки много (со скейлом, без, side-by-side, top-bottom и так далее). Так что «долетают» они одновременно — это если речь о том что стереопара распознается и анализируется уже где-то на земле, а не на борту
                                0

                                Просто помню, что когда активно занимался стереозрением, то для случая, например, самоходных автомобилей, рассинхрон в 50-100ms между кадрами уже давал серьезные артефакты на результирующей depth map'е.

                                  0
                                  Ну 50-100 это реально очень много, согласен. А как у вас такое получалось? Камеры независимо на компе захватывались и оцифровывались?
                                    0

                                    Ну да, если тупо брать две камеры и без какой-либо синронизации брать с них кадры, то такая большая задержка получается.

                                      0

                                      По хорошему по тайм-стемпам синхронизировать надо, тогда можно добиться задержки <10ms

                                        0
                                        У нас немного иная логика — камеры малины родные, по шинам CSI-2 обе воткнуты напрямую в проц, поэтому всё шустро. Это не две отдельные камеры по USB или через платы видеозахвата. И, кстати, у обеих малиновых на лету синхронизируются настройки — балансы белого, яркость и прочие вещи. С независимыми камерами это большая проблема.
                                0
                                Спасибо за статью! А расскажите, как доставать в промышленных масштабах CM3? Какие microSD берёте, чтобы не сыпались? Почему выбрали R-Pi, а не какие-нибудь imx6q?
                                  +1
                                  Ну CM3 спокойно продается на фарнеловских сайтах, можно штучно приобретать, а можно вагонами :-).
                                  По карточкам — ну тут кто что любит, мы чаще Kingston или Transcend используем.
                                  А почему малина — ответ простой: готовность и уровень поддержки софта и сообщества. Нам в свое время хватило счастья от переноса линукса с ядра 2.6.32 на 3.9 на виртурилке, спасибо и низкий поклон Texas Instruments. Хочется просто брать и проводить эксперименты со стереозрением, а не пытаться месяцами просто заставить софт работать.
                                    +1
                                    > Хочется просто брать и проводить эксперименты со стереозрением, а не пытаться месяцами просто заставить софт работать.

                                    Золотые слова. В свое время аналогично долго сражались с китайскими SBC, шаг вправо-влево и ты наедине со своей проблемой. Коммьюнити RPi, которое наступило на 99% граблей, это самое ценное.
                                      0
                                      Ну если у Texas Instruments были две критичные ошибки в документации (обе четырехлетней давности на тот момент), то что говорить про китайцев :-)
                                      Поэтому да, тот факт что оно работает из коробки, и практически на любой вопрос есть ответ — определяющий факторы.
                                  0
                                  Очень круто. Работаем сейчас с OpenCV на Python. Где эту приблуду достать можно, а главное — за сколько? Если можно то в ЛС vk.com/barashkoff3. Спасибо!
                                    0
                                    Присоединяюсь к вопросу — как такую достать?
                                      +1
                                      Ну как выпустим тираж — можно будет купить. Пока мы пытаемся понять интерес народа. Продвинутые товарищи разгадали квест в статье и смогли встать в очередь. :-)
                                      Вообще мы железо обычно разрабатываем для своих задач, когда не можем найти на рынке готовое решение, подходящее под наши задачи. Если решение вызывает массовый интерес — уже организовываем тираж.
                                        0
                                        Лично у меня интерес следующий, робот телеприсутствия. Так чтобы можно было смотреть стереоскопически, что происходит.
                                          0
                                          Я ниже ответил, что все виртурильные наработки перенесены на малину. Стерео у нас поддерживается «из коробки» — менять ничего не надо. Собственно мы уже летали и катались со стерео, еще с прошлой ревизией стереопи с первым компьют-модулем. На форуме для радиомоделистов я небольшой обзорчик делал.
                                          upd> сейчас прикручиваем это всё к Oculus Go, но тут Gol подробнее рассказать может
                                      0
                                      А что с проектом виртурилка, уже заморожен?
                                        0
                                        Наработки все перенесены на другие платформы (чаще с малиной работаем), саму железку прошлую уже выпускать не будем — время идет, много нового появляется. Можно считать что stereopi это витртурилка 2.0
                                          +1
                                          Я к вам пришёл тогда не в самый удачный мой период жизни, вот и получилось, что несколько слабоват для вас был. Желаю всяческих успехов вам, даже готов посодействовать чем-то. Разве что теперь в Питере живу.
                                            0
                                            Ага, рядом со мной значит! Ну в личке договоримся кофе попить :-)
                                        0
                                        Интересный проект, но Малина, к большому сожалению, не потянет серьёзный процессинг. Только совсем уж простые алгоритмы в реальном времени можно реализовать. Для более серьёзных вещей нужны штуки вроде Nvidia Jetson TX2.
                                          +1
                                          Согласен, вопрос только в определении «серьезный процессинг». Джетсон штука очень злая, с малиной сравнивать нечестно :-) Ну и цена у самого джетсона (без кроватки и обвязки) примерно в 13 раз выше.
                                          Для задач «изучить», «быстро спрототипировать» малина больше подходит. И получается хороший вариант пощупать технологии перед тем, как переходить на предложенную вами тяжелую артиллерию.
                                          пы.сы.: Google умудрился на PiZero (с очень старым процом) запихнуть нейронку и распознавание образов, так что тут еще и вопрос оптимизации решения под платформу.
                                          0
                                          А с какой точностью определяется глубина «залегания» предметов?
                                            0
                                            А это зависит от стереобазы (расстояния разнесения камер) и разрешения, с которым будете работать. Это конечно не миллиметры или сантиметры на расстоянии десятков метров, как, например, у лидаров типа Lidar Lite v3 HP, зато за один кадр вы сканируете сразу большой кусок пространства — до полусферы (при широкоугольных камерах).
                                            0
                                            Выглядит круто, компактно.
                                            Но мне не очень понятно, почему этот extension board за 59$ настолько дороже самой raspberry pi? И почему бы не решить эту же проблему дешевле просто использовав 2 raspberry pi? В случае со stereo vision можно даже препроцессинг делать на каждой.
                                              0
                                              Варианты с двумя распберри пробовались еще в эпоху первых малин. Идея интересная, особенно с малявками типа PiZero. Но, к сожалению, к моменту «сбора» двух картинок по сетке в одну стерео набирается гарантированный рассинхрон в несколько кадров — карта глубин рассыпается. А касательно цены — мы не Raspberry Foundation, тираж прикидывали небольшой. Будут миллионы устройств — будет копеечная цена. :-)
                                              0
                                              позволю уточнение (т.к. вначале некорректно предполагал, что эта плата влючате в себя миксер для стерео-камер) — поддержка 2х камер по интерфейсу CSI — это фича RPI Compute module, и все наличествующие Compute Module IO Board (официальная и китайские вариации) уже имеют таковые 2 входа.

                                              уникальность вашей платы в её размере (по цене китайские IO Board дешевле будут), благодаря которому она прекрасно влезет в какое-то роботизированное устройство, но стоило ли на ней оставлять в таком случае RJ-45, HDMI, полноразмерные USB?
                                                0
                                                Хороший вопрос. Как я упоминал, мы обычно затачиваем наши железки под решение своих задач. Нам нужна была компактная плата, с которой хорошо и удобно делать две вещи:
                                                1. Комфортно отлаживаться. Поэтому у нас полноразмерные USB на борту, полноценный коннектор сетки и полноразмерный HDMI.
                                                2. Удобно встраивать на борт в готовом решении. Поэтому плату сделали маленькой, и предусмотрели «слим» версию (я её показывал на видео) без больших разъемов и колодки GPIO, которые просто не паяются при производстве.
                                                Касательно китайских GPIO — это клоны отладочной борды от самой Raspberry с вариациями на эту тему. Они очень удобны для прототипирования при разработке своего железа, но никак не годятся для наших целей. Они просто для других задач, с которыми кстати хорошо справляются.
                                                  0
                                                  upd> опечатался — не китайских GPIO, а китайских devboard имел в виду
                                                    0
                                                    спасибо за прояснения. нашёл на видео «слим»-версию — это похоже на то, о чём я думал, читая статью.
                                                    да, если не секрет — мультимплексор на CSI1 (у которого 4 линии) не пробовали делать? (т.е. 2 стерео-камеры(с fish-eye) на него для карты глубины, а камеру с обычным объективом на CSI0)
                                                      0
                                                      Мультиплексор это «некрасивое» решение с кучей головной боли по аппаратной части (там закрытые бинарники по работе с камерой и нештатное использование I2C у малины при работе с видеочастью). А с новыми IMX219 еще и крипточип туда воткнут — броадком какие-то секреты свои бережёт. Учитывая, что мы сейчас будем «разгонять» карту глубин до теоретических 90FPS — мультиплексирование выглядит совсем тупиковой веткой. Если нужна третья камера — в крайнем случае её можно по USB зацепить (например, сделав PiZero с камерой дочерним устройством в режиме клиента через usbgadget).
                                                  0
                                                  del
                                                    0
                                                    Вы написали про расчет глубины по двум камерам. Вычисления прямо на raspberry pi выполняются? На какое количество кадров и при каком разрешении можно рассчитывать?
                                                      0
                                                      Да, вычисления на Пи сразу. Пока мы делали proof-of-concept на питоне, за скоростью не гонялись, получалось около 25 FPS при 640х480 и подкрученных настройках карты глубин (там много параметров). В планах прогнать всё на сишечке, с разными разрешениями. Вообще пиковый FPS захвата картинки до 90 fps (заявленный в официальных доках), неофициальный в аппаратных ветках малинового форума — до 120 fps (с соняшными сенсорами). Будем пробовать сделать так, чтобы расчет карты глубин успевал за камерой.

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

                                                    Самое читаемое