В интернете существует довольно большое количество способов геометрической калибровки камеры и лидара — например, 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 приветствуются.

Комментарии (4)


  1. CVshnik
    27.08.2026 01:36

    Ручное совмещение можно было бы сделать полуавтоматом, выбрать по >4 точек с каждого сенсора и совместить их с помощью 3д преобразования. Вообще говоря в вашем случае лучший паттерн это угол стена пол стена, там 3 плоскости, 3 плоскости можно находить как целое и совмещать.


    1. Sencis Автор
      27.08.2026 01:36

      У RGB-D камеры очень сильный шум у неё нет плоскостей, ровная стена волнами идёт как синус, будет не просто найти такие точки. Стены в том числе я использовал как ориентир но на них тонгаж и крен плохо видно + у камеры FOV 90 градусов маленький и уже на 2.5, 3м шум очень сильный, имхо чем больше разных предметов - паттернов тем лучше. Я ожидал, что ICP или GICP будет в этом синусе искать какую-то среднею/усредненую плоскость где уровняются растояния до всех ближайших точек RGB-D камеры, либо, хотя-бы по фронтам дальним/ближним совместит “плоскости” но увы(.


      1. CVshnik
        27.08.2026 01:36

        Когда мои колегм тыкали палкой в ргбд, там проблема была с совмещением д и ргб, как у вас это решено? Там разные разрешения и разные дисторсии были. Если есть переход ргб в д, то можно оптикой найти все по паттернам на а4, на том же углу. Сейчас ллм уже справится с задачей если ее поставить по шагам. Найти 3 плоскости паттерна, найти 3 плоскости лидрара. И совместить их. Но Вы как инженер решили задачу и идете дальше, это тоже вариант конечно


        1. Sencis Автор
          27.08.2026 01:36

          В EEPROM камеры зашиты векторы трансляции, матрицы вращения, коэффеценты дисторсии для перехода от от depth к rgb или imu например. Потому я наоборот обычно делал находил калибровку lidar - depth а от неё, да можно скинуть калибровочные матрицы llm из EEPROM для перехода от depth в rgb и llm пересчитает её в матрицу lidar -> rgb. Ставить задачу llm найти преобразование lidar-> depth либо lidar-> rgb-d я не пробовал.