Camarray: модуль стереокамеры Arducam 1MP*2 MIPI
Введение
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 не поддерживает цифровое панорамирование в режиме объединения с половинным разрешением и программное управление скоростью панорамирования.
- Camarray HAT не обрезает кадр наполовину (половина горизонтального разрешения каждой камеры и половина угла обзора), а сжимает его вдвое (половина горизонтального разрешения каждой камеры при неизменном угле обзора), поэтому режим сканирования ей не нужен.
Общие характеристики
Сенсор
| Модель сенсора | OV9281 |
|---|---|
| Тип затвора | Глобальный затвор |
| Активная область | 1280 × 2 × 800 |
| Разрешение | 1 Мп × 2 |
| Оптический формат | 1/4″ |
| Размер пикселя | 3 × 3 мкм |
| Цветной фильтр | Нет (монохромный) |

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

Плата камеры
| Размер платы камеры | 105 × 24 мм |
|---|

| № вывода | Название | Тип | Описание |
|---|---|---|---|
| 1 | 3V3 | Питание | Питание 3,3 В |
| 2 | FSIN | Вход | Вход синхронизации кадров |
| 3 | STB | Выход | Выход строба для светодиода |
| 4 | GND | Земля | Земля |
| 5 | 3V3 | Питание | Питание 3,3 В |
| 6 | SDA | Вход/выход | Данные последовательного интерфейса SCCB (вход/выход) |
| 7 | SCL | Вход | Тактовый вход последовательного интерфейса SCCB |
| 8 | GND | Земля | Земля |
Разъём и шлейф
| Интерфейс разъёма | MIPI CSI-2, 15 контактов, 2 линии |
|---|---|
| Длина шлейфа | 150 мм (15 контактов), 150 мм (15–22 контакта) |
| Ответный разъём | SFW15R-2STE1LF |
| № вывода | Название | Тип | Описание |
|---|---|---|---|
| 1 | GND | Питание | Земля |
| 2 | CAM_D0_N | Выход | Линия данных MIPI 0 (−) |
| 3 | CAM_D0_P | Выход | Линия данных MIPI 0 (+) |
| 4 | GND | Питание | Земля |
| 5 | CAM_D1_N | Выход | Линия данных MIPI 1 (−) |
| 6 | CAM_D1_P | Выход | Линия данных MIPI 1 (+) |
| 7 | GND | Питание | Земля |
| 8 | CAM_CK_N | Выход | Тактовая линия MIPI (−) |
| 9 | CAM_CK_P | Выход | Тактовая линия MIPI (+) |
| 10 | GND | Питание | Земля |
| 11 | CAM_IO0 | Вход | Включение питания |
| 12 | CAM_IO1 | Вход | Светодиодный индикатор |
| 13 | CAM_SCL | Двунаправленный | I2C SCL |
| 14 | CAM_SDA | Двунаправленный | I2C SDA |
| 15 | CAM_3V3 | Питание | Вход питания 3,3 В |
Возможности драйвера (официальный драйвер V4L2)
| Видеоформат | GREY (8 бит) / Y10P (10 бит) |
|---|---|
| Выходной интерфейс | Последовательный выход MIPI, 2 линии |
| Форматы вывода | Монохромный RAW, 8/10 бит |
Частота кадров (настраивается: 5–80 к/с)
| Raspberry Pi | Jetson Nano | |
|---|---|---|
| RAW8 (GREY) | 2560 × 800 при 80 к/с | 2560 × 800 при 80 к/с |
| RAW10 (Y10P) | 2560 × 800 при 80 к/с | 2560 × 800 при 80 к/с |
Быстрый старт
Подключение оборудования

Установка драйвера
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.

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, чтобы перезагрузить систему.

4. Удаление драйвера
Учтите: драйвер занимает аппаратные ресурсы CSI, поэтому после его установки утилита raspistill работать не будет. Удалить драйвер V4L2 от Arducam можно двумя способами:
Способ 1: команда удаления
cd Release/
./uninstall_driver.sh
Способ 2: правка файла конфигурации
1. Выполните команду:
sudo nano /boot/config.txt
2. Несколько раз нажмите PageDown или прокрутите колесо мыши вниз и проверьте, есть ли в файле строка dtoverlay=arducam.

Измените строку dtoverlay=arducam на #dtoverlay=arducam, чтобы отключить драйвер V4L2. Нажмите Ctrl+X, Y, Enter, чтобы сохранить изменения и выйти.
Первый запуск
1. Проверьте, определяется ли камера
ls /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задают ширину и высоту входного изображения.

Чтобы выйти из предпросмотра, нажмите Ctrl+C.
4. Сохранение снимка
Сделайте снимок с задержкой 1 секунду (время задаётся в миллисекундах) и сохраните его в файл image.jpg:
arducamstill -t 1000 -o image.jpg -pixfmt GREY -w 2560 -h 800 -p 800,100,1024,768



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

Во втором терминале выполните команду изменения частоты кадров:
v4l2-ctl -c frame_rate=30

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



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

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

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


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


Из-за ограниченной производительности Raspberry Pi и особенностей VLC изображение может подтормаживать.
4. Настройка экспозиции, усиления и частоты кадров
Откройте Tool → Effects and Filters.

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

Вывод изображения в mplayer
1. Установите mplayer
sudo apt-get install mplayer
2. Выведите изображение
mplayer tv:// -tv driver=v4l2:device=/dev/video0
Не вводите эту команду через удалённое подключение — иначе программа зависнет.


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


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

Что дальше
После быстрого старта изучите указания по применению — например, по работе с драйверами MIPI-камер Arducam пользовательского уровня.
Указания по применению
Карта глубины на Raspberry Pi
1. Установите драйвер
Порядок установки драйвера описан на этой странице.
2. Подключите оборудование

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


