В интернете существует довольно большое количество способов геометрической калибровки камеры и лидара — например, FAST-Calib, cam2lidar, lidar_camera_calibration 1, 2. 3 и другие. Они хорошо работают и позволяют достичь субпиксельной точности. Однако для этого требуются калибровочные шаблоны, изготовленные с высокой точностью, дорогие датчики (лидары с повторяющимся сканированием), а также, зачастую, большая область пересечения FOV камеры и лидара. Особенно это относится к методам калибровки калибровки, основанным на решении задачи Perspective‑n‑Point (PnP).
Предлагаемый в данной статье метод калибровки заключается в ручном совмещении облаков точек от лидара и RGB‑D камеры. Автоматические алгоритмы вроде ICP и GICP в моём случае не справлялись с этой задачей даже при наличии хороших начальных приближений. Ручная настройка позволяет достичь миллиметровой точности (2.5–3.5 мм), чего вполне достаточно для построения карт обхода препятствий, отслеживания объектов, навигации по Aruco‑маркерам и других прикладных задач.
Для этих целей я использую простое самодельное приложение:

Ниже приведена пошаговая инструкция по его использованию.
Изначально приложение ожидает, что к мини‑ПК, Jetson подключены лидар Livox и камера RealSense. В области FOV не должно происходить никакого движения (статичная сцена), датчики закреплены на том креплении, для которого нужно выполнить калибровку. В разделе mount на GitHub приведены два готовых варианта крепления в качестве примера а в программе есть пресеты для них.
Перед датчиками необходимо разместить предметы, которые будут служить геометрическими паттернами. Важно, чтобы на них была хорошо различима геометрия сразу в нескольких плоскостях — например, как на спинках этих стульев:

Предметы должны располагаться на разных расстояниях от датчика, чтобы итоговое совмещение облаков точек сходилось одновременно и на ближних, и на дальних объектах. При этом все они обязательно должны попадать в зону пересечения FOV лидара и камеры.
Далее необходимо запустить захват облаков точек от лидара и камеры и дождаться его завершения: облако лидара должно перестать пополняться, а изображение с камеры — перестать меняться и принять итоговое смещение (эта пауза нужна, чтобы алгоритм автоэкспозиции камеры успел подстроиться под освещение, а лидар — накопить достаточное количество точек). После этого следует нажать «Сохранить», чтобы не тратить моточасы лидара на дальнейшую подгонку, а предметы можно будет вернуть на место:

Затем необходимо заполнить поля Translation и Euler и нажать Apply, чтобы применить предварительные параметры смещения и вращения. Эти значения должны быть получены из расчётов геометрии вашего крепления или его прямых замеров, а также сверены с руководствами по FOV датчиков. Поля Lidar Crop и Camera Crop позволяют отсечь лишние точки и оставить только ту область, где поле зрения лидара и камеры пересекается. Это особенно полезно, если вы пытаетесь использовать автоматическую калибровку ICP или GICP, которая может не дать результата из‑за шумов облака от RGB‑D камеры или слишком малой области пересечения FOV.
После подготовительных шагов можно приступать к ручному подбору значений:
Когда калибровка выполнена, её можно сохранить в текстовый файл.
Стоит, однако, признать, что я не исключаю ошибок в собственной реализации — особенно в преобразовании систем координат между лидаром и камерой. Возможно, именно поэтому ICP и GICP в моём случае не показывают стабильного результата, тогда как у других исследователей они работают. Если вы заметите неточность в коде или в логике преобразований — буду благодарен за указание: репозиторий открыт, issues приветствуются.

