К содержимому
  1. Главная
  2. Блог
  3. Camarray: модуль стереокамеры Arducam 1MP*2 MIPI

Camarray: модуль стереокамеры Arducam 1MP*2 MIPI

9 декабря 2022 · По материалам Arducam

Введение

Arducam 1MP*2 — модуль стереокамеры MIPI с двумя синхронизированными монохромными сенсорами OV9281 с глобальным затвором (2 × 1 Мп). Он подключается напрямую к разъёмам MIPI CSI-2 на Raspberry Pi и Jetson Nano и работает на этих платформах с драйвером камеры V4L2. Модуль удобно встраивать в собственные аппаратные разработки или использовать с собственными алгоритмами во встраиваемых системах — для измерения глубины, 3D-картографирования, SLAM и т. п.

Что такое Camarray

Camarray — серия встраиваемых стереокамер и решений для нескольких камер от Arducam. Camarray пришла на смену плате Arducam Sync Stereo Camera HAT: она выдаёт до 4 синхронизированных модулей камер за одно подключение к разъёму камеры встраиваемой системы — Raspberry Pi, Jetson Nano или Xavier NX. С Arducam Camarray число камер больше не ограничено разъёмами на основной или несущей плате. А драйверы камер от Arducam делают приложения с несколькими камерами ещё гибче.

ПримечаниеОграничения платы Camarray HAT:
  1. Camarray HAT не поддерживает цифровое панорамирование в режиме объединения с половинным разрешением и программное управление скоростью панорамирования.
  2. Camarray HAT не обрезает кадр наполовину (половина горизонтального разрешения каждой камеры и половина угла обзора), а сжимает его вдвое (половина горизонтального разрешения каждой камеры при неизменном угле обзора), поэтому режим сканирования ей не нужен.

Общие характеристики

Сенсор

Модель сенсораOV9281
Тип затвораГлобальный затвор
Активная область1280 × 2 × 800
Разрешение1 Мп × 2
Оптический формат1/4″
Размер пикселя3 × 3 мкм
Цветной фильтрНет (монохромный)
Блок-схема сенсора OV9281
Блок-схема OV9281

Объектив

Сменный объективДа
ДиафрагмаF2.8
ФокусировкаРучная
Дистанция фокусировкиОт 30 мм до бесконечности (при фокусировке на бесконечность)
Фокусное расстояние (EFL)2,8 мм
Угол обзора70° по горизонтали
Крепление объективаM12
Чувствительность к ИКБез ИК-фильтра (чувствителен к ИК-излучению)
Объективы стереокамеры, 3D-вид

Плата камеры

Размер платы камеры105 × 24 мм
Чертёж платы стереокамеры с размерами
Механический чертёж
№ выводаНазваниеТипОписание
13V3ПитаниеПитание 3,3 В
2FSINВходВход синхронизации кадров
3STBВыходВыход строба для светодиода
4GNDЗемляЗемля
53V3ПитаниеПитание 3,3 В
6SDAВход/выходДанные последовательного интерфейса SCCB (вход/выход)
7SCLВходТактовый вход последовательного интерфейса SCCB
8GNDЗемляЗемля

Разъём и шлейф

Интерфейс разъёмаMIPI CSI-2, 15 контактов, 2 линии
Длина шлейфа150 мм (15 контактов), 150 мм (15–22 контакта)
Ответный разъёмSFW15R-2STE1LF
№ выводаНазваниеТипОписание
1GNDПитаниеЗемля
2CAM_D0_NВыходЛиния данных MIPI 0 (−)
3CAM_D0_PВыходЛиния данных MIPI 0 (+)
4GNDПитаниеЗемля
5CAM_D1_NВыходЛиния данных MIPI 1 (−)
6CAM_D1_PВыходЛиния данных MIPI 1 (+)
7GNDПитаниеЗемля
8CAM_CK_NВыходТактовая линия MIPI (−)
9CAM_CK_PВыходТактовая линия MIPI (+)
10GNDПитаниеЗемля
11CAM_IO0ВходВключение питания
12CAM_IO1ВходСветодиодный индикатор
13CAM_SCLДвунаправленныйI2C SCL
14CAM_SDAДвунаправленныйI2C SDA
15CAM_3V3ПитаниеВход питания 3,3 В

Возможности драйвера (официальный драйвер V4L2)

ВидеоформатGREY (8 бит) / Y10P (10 бит)
Выходной интерфейсПоследовательный выход MIPI, 2 линии
Форматы выводаМонохромный RAW, 8/10 бит

Частота кадров (настраивается: 5–80 к/с)

Raspberry PiJetson Nano
RAW8 (GREY)2560 × 800 при 80 к/с2560 × 800 при 80 к/с
RAW10 (Y10P)2560 × 800 при 80 к/с2560 × 800 при 80 к/с

Быстрый старт

Подключение оборудования

Стереомодуль OV9281, подключённый к Raspberry Pi
Используются модуль стереокамеры Arducam 1MP*2 MIPI и Raspberry Pi 4B.

Установка драйвера

1. О драйверах

Для Raspberry Pi есть 3 драйвера:

  • официальный драйвер;
  • драйвер MIPI-камеры от Arducam;
  • драйвер V4L2 от Arducam.

1) Драйвер MIPI-камеры от Arducam не конфликтует с официальным драйвером.

2) Драйвер V4L2 от Arducam конфликтует с официальным драйвером. Чтобы пользоваться официальным драйвером, сначала удалите драйвер V4L2 от Arducam.

3) Драйвер V4L2 от Arducam конфликтует с драйвером MIPI-камеры от Arducam. Чтобы пользоваться драйвером MIPI-камеры, сначала удалите драйвер V4L2 от Arducam.

4) Драйвер V4L2 от Arducam автоматически заменяет два других драйвера. После его удаления система автоматически возвращается к официальному драйверу.

Этот модуль работает с драйвером V4L2 от Arducam.

2. Проверка драйвера

Проверьте, установлен ли в системе драйвер V4L2 от Arducam.
sudo nano /boot/config.txt

Несколько раз нажмите PageDown или прокрутите колесо мыши вниз и проверьте, есть ли в файле строка dtoverlay=arducam.

Строка драйвера Arducam в файле конфигурации

1) Если есть строка dtoverlay=arducam, драйвер V4L2 от Arducam уже установлен и работает.

2) Если есть строка #dtoverlay=arducam, драйвер V4L2 от Arducam устанавливали, но сейчас он удалён. Чтобы восстановить драйвер, удалите символ # и перезагрузите Raspberry Pi.

3) Если нет ни dtoverlay=arducam, ни #dtoverlay=arducam, драйвер V4L2 от Arducam никогда не устанавливался — выполните полную установку по инструкции ниже.

3. Установка драйвера V4L2 от Arducam

#Скачайте пакет драйвера

wget https://github.com/ArduCAM/Arducam_OBISP_MIPI_Camera_Module/releases/download/v1.0/Release.tar.gz
Загрузка пакета драйвера

#Распакуйте архив

tar zxvf Release.tar.gz
Распаковка архива с драйвером

#Перейдите в распакованную папку

cd Release/

#Установите драйвер

./install_driver.sh
Установка драйвера

#Перезагрузите устройство

Нажмите y, затем Enter, чтобы перезагрузить систему.

Ошибка при установке?Если ваша операционная система выпущена не официально Raspberry Pi, установка драйвера завершится ошибкой с сообщением о версии. Список официально поддерживаемых ОС — на сайте Raspberry Pi.
Сообщение об ошибке версии при установке драйвера

4. Удаление драйвера

Учтите: драйвер занимает аппаратные ресурсы CSI, поэтому после его установки утилита raspistill работать не будет. Удалить драйвер V4L2 от Arducam можно двумя способами:

Способ 1: команда удаления

cd Release/
./uninstall_driver.sh
ПримечаниеЧтобы изменения вступили в силу, перезагрузите Raspberry Pi.

Способ 2: правка файла конфигурации

1. Выполните команду:

sudo nano /boot/config.txt

2. Несколько раз нажмите PageDown или прокрутите колесо мыши вниз и проверьте, есть ли в файле строка dtoverlay=arducam.

Строка драйвера Arducam в файле конфигурации

Измените строку dtoverlay=arducam на #dtoverlay=arducam, чтобы отключить драйвер V4L2. Нажмите Ctrl+X, Y, Enter, чтобы сохранить изменения и выйти.

ПримечаниеЧтобы изменения вступили в силу, перезагрузите Raspberry Pi.

Первый запуск

1. Проверьте, определяется ли камера

ls /dev/video0
Камера определяется как /dev/video0

2. Проверьте поддерживаемые видеоформаты

v4l2-ctl --list-formats-ext
Список поддерживаемых видеоформатов
Сейчас поддерживаются только форматы «GREY» и «Y10P», формат «Y10» не поддерживается.

3. Предпросмотр в реальном времени

#RAW8

arducamstill -t 0 -pixfmt GREY -w 2560 -h 800

#RAW10

arducamstill -t 0 -pixfmt Y10P -w 2560 -h 800
Вывод программы при предпросмотре
В последней строке в реальном времени показывается частота кадров. GREY — для RAW8, Y10P — для RAW10. Параметры -w и -h задают ширину и высоту входного изображения.
Изображение со стереокамеры OV9281
Чтобы выйти из предпросмотра, нажмите Ctrl+C.

4. Сохранение снимка

Сделайте снимок с задержкой 1 секунду (время задаётся в миллисекундах) и сохраните его в файл image.jpg:

arducamstill -t 1000 -o image.jpg -pixfmt GREY -w 2560 -h 800 -p 800,100,1024,768
Сохранение снимка
Файл снимка в домашней папке pi
Просмотр сохранённого снимка

5. Приём данных без вывода изображения

Из-за ограниченной производительности платформы возможны пропуски кадров. Реальную частоту входящих кадров можно проверить, принимая данные без вывода изображения на экран.

#RAW8

v4l2-ctl --set-fmt-video=width=2560,height=800,pixelformat='GREY' --stream-mmap --stream-count=-1 -d /dev/video0

#RAW10

v4l2-ctl --set-fmt-video=width=2560,height=800,pixelformat='Y10P' --stream-mmap --stream-count=-1 -d /dev/video0
Приём данных без вывода изображения

6. Настройка экспозиции

Откройте два терминала: в первом выполните команду вывода изображения, во втором — команду настройки экспозиции.

#Настройка экспозиции:

v4l2-ctl -c exposure=1000

#Просмотр параметров экспозиции (минимум, максимум, значение по умолчанию)

v4l2-ctl -l
Параметры экспозиции: минимум, максимум, значение по умолчанию

Например, выполните во втором терминале команду:

v4l2-ctl -c exposure=4000
Изменение экспозиции во втором терминале

Чем больше время экспозиции, тем ярче изображение и ниже частота кадров.

7. Настройка усиления

Откройте два терминала: в первом выполните команду вывода изображения, во втором — команду настройки усиления.

#Настройка усиления:

v4l2-ctl -c gain=12

#Просмотр параметров экспозиции (минимум, максимум, значение по умолчанию)

v4l2-ctl -l
Параметры усиления: минимум, максимум, значение по умолчанию

Например, выполните во втором терминале команду:

v4l2-ctl -c gain=12
Изменение усиления во втором терминале

Чем больше усиление, тем ярче изображение; частота кадров при этом не меняется.

8. Изменение частоты кадров

Выполните команду ниже, подставив вместо «X» нужную частоту кадров.

v4l2-ctl -c frame_rate=X

Например, нужно установить 30 к/с. Откройте два терминала и в первом выполните команду:

arducamstill -t 0 -pixfmt GREY -w 2560 -h 800
Текущая частота кадров при предпросмотре
В последней строке в реальном времени показывается текущая частота кадров; в конфигурации RAW8 по умолчанию — 58 к/с.

Во втором терминале выполните команду изменения частоты кадров:

v4l2-ctl -c frame_rate=30
Частота кадров после изменения
Частота кадров изменилась на 30 к/с.

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

v4l2-ctl -l
Диапазон частоты кадров для текущего режима
Частоту кадров можно менять от 5 до 80 к/с. Если заданное значение больше максимума, камера работает на максимальной частоте; с минимумом — так же.
ВажноНапример, если задать 80 к/с, при выводе изображения частота поднимется только до 58 к/с. Но в режиме приёма данных без вывода изображения частота снова будет 80 к/с. (Показанные значения частоты кадров не мгновенные: они рассчитываются итеративно по предыдущим значениям и меняются медленно.)
Иллюстрация к примечанию о частоте кадров, 1
Иллюстрация к примечанию о частоте кадров, 2

Вывод изображения в медиаплеере VLC

Изображение можно смотреть в реальном времени в медиаплеере VLC. (VLC воспроизводит только изображение в формате RAW8.)

1. Откройте медиаплеер VLC

Запуск медиаплеера VLC

2. Выберите Media → Open Capture Device…

Пункт Open Capture Device в меню VLC

3. В поле Video device name выберите /dev/video0 и нажмите Play

Выбор устройства /dev/video0 в VLC
Изображение со стереокамеры в VLC

Изображение может не поместиться на экране целиком. Щёлкните правой кнопкой мыши по заголовку окна VLC и выберите Maximize.

Развёртывание окна VLC
Развёрнутое окно VLC с изображением
Из-за ограниченной производительности Raspberry Pi и особенностей VLC изображение может подтормаживать.

4. Настройка экспозиции, усиления и частоты кадров

Откройте Tool → Effects and Filters.

Окно эффектов и фильтров в VLC

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

Ползунки экспозиции, усиления и частоты кадров в VLC

Вывод изображения в mplayer

1. Установите mplayer

sudo apt-get install mplayer

2. Выведите изображение

mplayer tv:// -tv driver=v4l2:device=/dev/video0
Не вводите эту команду через удалённое подключение — иначе программа зависнет.
Запуск программы mplayer
Изображение в mplayer

Изображение может не поместиться на экране целиком — перетащите окно за заголовок, чтобы увидеть всё изображение.

Или щёлкните правой кнопкой мыши по заголовку окна mplayer и выберите Maximize — тогда изображение будет видно целиком (и воспроизводится оно довольно плавно).

Развёртывание окна mplayer
Стереоизображение в развёрнутом окне mplayer

Либо выполните команду ниже, чтобы масштабировать изображение. Оно будет видно целиком, но начнёт подтормаживать.

mplayer tv:// -tv driver=v4l2:device=/dev/video0 -zoom -x 1280 -y 400
-x и -y — ширина и высота масштабированного изображения; меняйте их пропорционально.
Масштабированное изображение в mplayer

Что дальше

После быстрого старта изучите указания по применению — например, по работе с драйверами MIPI-камер Arducam пользовательского уровня.

Указания по применению

Карта глубины на Raspberry Pi

1. Установите драйвер

Порядок установки драйвера описан на этой странице.

2. Подключите оборудование

Стереомодуль OV9281, подключённый к Raspberry Pi
Используются модуль стереокамеры Arducam 1MP*2 MIPI и Raspberry Pi 4B.

3. Перезагрузите Raspberry Pi

После перезагрузки выполните команду ls /dev/video*, чтобы увидеть видеоузел.

4. Настройка ПО

4.1 Скачайте демонстрационный код

git clone https://github.com/ArduCAM/3d-camera.git
cd 3d-camera/stereo-camera/RaspberryPi/stereo_depth_demo/

4.2 Установите зависимости для Python 3.x

Рекомендуется последняя версия Raspbian.
sudo apt-get update && sudo apt-get install -y libhdf5-dev libhdf5-serial-dev libatlas-base-dev libjasper-dev libqtgui4 libqt4-test && sudo pip3 install opencv-python==3.4.6.27
sudo pip3 install stereovision
sudo pip3 install matplotlib

5. Запуск программ

5.1 Съёмка изображений

python 1_test.py

Справка:

Справка программы съёмки

Пример:

Пример запуска программы съёмки

5.2 Съёмка изображений для калибровки

python 2_chess_cycle.py
Съёмка изображений для калибровки

5.3 Разделение снимков

python 3_pairs_cut.py
Разделение стереопар на отдельные снимки

5.4 Калибровка

python 4_calibration.py
Калибровка стереокамеры

5.5 Настройка карты глубины

python 5_dm_tune.py
Результат настройки карты глубины

5.6 Карта глубины по видео в реальном времени

python 6_dm_video.py
Карта глубины по видео в реальном времени

Работа с OpenCV

Убедитесь, что драйвер установлен.

import numpy as np
import cv2
import time
def fourcc(a, b, c, d):
    return ord(a) | (ord(b) << 8) | (ord(c) << 16) | (ord(d) << 24)

def pixelformat(string):
    if len(string) != 3 and len(string) != 4:
        msg = "{} is not a pixel format".format(string)
        raise argparse.ArgumentTypeError(msg)
    if len(string) == 3:
        return fourcc(string[0], string[1], string[2], ' ')
    else:
        return fourcc(string[0], string[1], string[2], string[3])
cap = cv2.VideoCapture(0,cv2.CAP_V4L2)
cap.set(cv2.CAP_PROP_FOURCC, pixelformat("GREY"))
cap.set(cv2.CAP_PROP_CONVERT_RGB,0)
now = time.time()
frame_num=0
while(True):
    if time.time() - now > 1:
        now = time.time()
        print(frame_num)
        frame_num=0
    else:
        frame_num = frame_num+1
    # Capture frame-by-frame
    ret, frame = cap.read()
    # Display the resulting frame
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Затем выполните команду:

sudo python ov9281_dulcam_opencv_raw8.py

Ещё по теме

Запросить цену

Укажите количество — пришлём коммерческое предложение.