Я начинаю серию статей об использовании стерео камеры с ROS 2. В первой статье я расскажу о том как настроить камеру PS5 HD для использования в ROS 2. Конкретно мы установим все необходимые зависимости и запустим пакет который позволит публиковать кадры с камеры в топик ROS и выполним калибровку камеры.
Кому интересно прошу под кат.
О стерео камере
Недавно у меня появилась такая камера для PlayStation 5 от Sony.

Камера PS5 оснащена процессором OmniVision OV580, который обеспечивает аппаратную синхронизацию двух Full HD сенсоров с точностью до кадра и передает несжатый стереопоток по интерфейсу USB 3.0. При базовой линии около 60 мм и поддержке 1080p @ 30fps (или 800p @ 60fps) она выступает доступной альтернативой промышленным стерео камерам для задач Visual SLAM (далее VSLAM) и построения карт глубины.
Также стоит отметить два момента. Во‑первых, камера PS5 HD не вычисляет информацию о глубине из коробки как это делают другие активные карты глубины такие как Microsoft Kinect Intel RealSense. Во‑вторых, камера имеет скользящий затвор (Rolling shutter). Подробнее о типах затвора можно прочитать в этой статье и о влиянии затвора на результаты работы визуального SLAM в этой научной статье.
Я реализовал пакет для ROS 2 который позволяет получить кадры с обоих монокулярных камер в топики /left/raw_image и /right/raw_image. Исходный код пакета можно найти на github: https://github.com/vovaekb/ps5_camera_ros
Установка
Для работы с USB‑интерфейсом и захватом видеопотока потребуются пакеты libusb и утилиты V4L2
sudo apt update sudo apt install build-essential git libusb-1.0-0-dev pkg-config
Установим также пакеты ROS 2 для работы с изображениями:
sudo apt install ros-{$ROS_DISTRO}-cv-bridge ros-{$ROS_DISTRO}-image-transport ros-{$ROS_DISTRO}-sensor-msgs python3-opencv python3-yaml
Для работы камеры требуется файл бинарной прошивки firmware.bin (или camera‑firmware‑ps5.bin). Из‑за копирайта Sony бинарник обычно не распространяется прямо в репозиториях. Его находят в официальных обновлениях или в сообществах (например, репозиториях ps5_hdcam или psmoveapi). Можно скачать отсюда. Загрузчик можно скачать отсюда.
Поместите полученный файл firmware.bin в системную директорию:
sudo mkdir -p /lib/firmware/ps5camera sudo cp firmware.bin /lib/firmware/ps5camera/firmware.bin
Убедитесь что текущий пользователь принадлежит группе video так чтобы ROS 2 мог получать видеопоток с камеры без sudo:
sudo usermod -aG video $USER
Нам нужна утилита v4l‑utils чтобы найти какие пути /dev/video
sudo apt install v4l-utils v4l2-ctl --list-devices
Компиляция:
cd ~/ros2_ws/src git clone https://github.com/vovaekb/ps5_camera_ros.git cd ~/ros2_ws rosdep install --from-paths src --ignore-src -r -y colcon build --packages-select ps5_camera source install/setup.bash
Запустим:
ros2 run ps5_camera ps5_stereo_node
Увидим такой вывод в терминале

Запустим rqt_image_view
ros2 run rqt_image_view rqt_image_view

Как видим картинка довольно неплохого качества.
Калибровка стереокамеры
Для калибровки будет использовать уже имеющийся пакет ROS 2 image_pipeline, а точнее его утилиту camera_calibration.
Нам нужна калибровочная доска. Распечатайте шахматную доску (Chessboard) на ровной поверхности (желательно наклеить на жесткий картон или стекло). На этом сервисе можно сгенерировать и скачать такую доску.
Для успешной калибровки вам нужно точно знать параметры доски:
количество внутренних углов (например, если на доске 9×7 квадратов, то внутренних углов будет 8×6).
размер стороны одного квадрата в метрах (например, 0.025 для 25 мм).
Убедитесь, что ваша камера запущена и публикует несжатые изображения и информацию о камере. Вам понадобятся следующие топики (названия могут отличаться, это пример): Левая камера: /left/image_raw и /left/camera_info Правая камера: /right/image_raw and /right/camera_info Важно: Частота публикации кадров (FPS) с обеих камер должна быть одинаковой, а сами кадры — синхронизированы по времени (timestamp).
Чтобы узнать, с какой частотой приходят кадры от каждой камеры, используйте команду ros2 topic hz. Для каждой камеры выполним:
ros2 topic hz /left/image_raw
Даже если FPS одинаковый, кадры могут публиковаться «вразнобой» (например, левый кадр отстает от правого на полкадра). В ROS 2 у каждого сообщения в заголовке (header.stamp) есть временная метка.
Запустим инструмент калибровки
ros2 run camera_calibration cameracalibrator --size 7x9 --square 0.015 left:=/left/image_raw right:=/right/image_raw left_camera:=/left/camera_info right_camera:=/right/camera_info
Лучше эту команду запускать из какой‑нибудь папки тк некоторые файлы будут сохраняться прямо в нее.
Если размер ячейки 15 мм, то значение параметра square должно быть 0.015.


Когда калибратор соберет достаточно данных у нас будет такая картинка (для всех параметров X, Y, Size, Skew появится зеленая полоса и кнопка Calibrate станет активной)

Нажмем кнопку Calibrate. Затем нажмем кнопку Save и в терминале увидим такой вывод

При нажатии Save создается архив calibrationdata.tar.gz (или папку calibrationdata). Внутрь помещаются все калибровочные снимки и сырой файл калибровки ost.yaml (или ost.txt). Это исходный/промежуточный файл параметров.
Затем нажмем кнопку Commit. Утилита автоматически конвертирует исходные параметры в стандартный формат ROS sensor_msgs/CameraInfo, разделяет параметры стереопары и генерирует два готовых файла — left.yaml и right.yaml.
При генерации итоговых файлов (left.yaml и right.yaml) утилита калибровки сохраняет их либо в текущую рабочую директорию, из которой вы запускали cameracalibrator либо в системную папку кэша калибровок ROS: ~/.ros/camera_info/.
Объяснение результата в терминале
Объяснение параметров калибрации на английском
Camera Matrix (K /
Dorintrinsic): Contains focal lengths (\(f_x, f_y\)) and optical center coordinates (\(c_x, c_y\)) defining pixel projection.Distortion Coefficients (D /
distortion_coefficients): Models radial (barrel/pincushion) and tangential lens warping using parameters like k₁, k₂, p₁, p₂.Rectification Matrix ®: Rotation grid used primarily in stereo setups to align left and right image planes.
Projection Matrix (P): Maps rectified 3D points directly onto the corrected 2D image plane.
Reprojection Error: Expressed in pixels, this single numerical score shows overall accuracy‑lower numbers (typically under 0.5–1.0 pixel) mean a better
Более детально о процедуре калибровки и описании параметров в выводе результата в терминале можно прочитать в официальной документации OpenCV.
Как видно из вывода в терминале результат калибровки был сохранен в архив calibrationdata.tar.gz в папке /tmp. Найдем архив и распакуем его. Мы увидим такие файлы внутри:

Проверьте что у вас в папке есть файлы left.yaml и right.yaml.Если их нет значит вы забыли нажать кнопку Commit или калибровка прошла как монокулярная. Попробуйте еще раз и проверьте папку из которой вы запускали cameracalibrator.
Теперь нужно использовать эти файлы в нашем узле для камеры. Сохраним файлы внутри пакета. Этот подход позволяет хранить всю конфигурацию камеры вместе с исходным кодом пакета.
Создайте папку config и скопируйте файлы
mkdir -p ~/ros2_ws/src/ps5_camera/config cp ~/left.yaml ~/right.yaml ~/ros2_ws/src/ps5_camera/config/
Обновите файл setup.py, чтобы ROS 2 устанавливал конфиги.
Откройте setup.py и добавьте копирование папки config в сборку:
# добавьте импорты import os from glob import glob ... data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # Добавьте эту строку для установки yaml-файлов калибровки: (os.path.join('share', package_name, 'config'), glob('config/*.yaml')) ],
Пересоберите пакет:
cd ~/ros2_ws colcon build --packages-select ps5_camera source install/setup.bash
Запустим ноду:
ros2 run ps5_camera ps5_stereo_node --ros-args \ -p left_camera_info_url:=/home/vlad/ros2_ws/src/ps5_camera/config/left.yaml \ -p right_camera_info_url:=/home/vlad/ros2_ws/src/ps5_camera/config/right.yaml
После запуска ноды вызовите в соседнем терминале эхо топиков калибровки
ros2 topic echo /left/camera_info
Вывод должен быть таким

На этом пока все. Мы настроили и калибровали камеру. В следующих статьях мы посмотрим как можно использовать камеру для визуального SLAM.
