И когда лидар или транспортное средство находится в движении, искажение самодвижения
LiDAR измеряет расстояние и направление до окружающих объектов, испуская лазерные лучи и определяя относительное положение автомобиля относительно препятствия. Когда лазерных лучей достаточно, эти точки формируют облако точек для построения 3D-информации. Именно это мы обычно называем данными облака точек.
У большинства LiDAR, хотя лазерный сигнал передаётся и принимается быстро, точки, из которых состоит облако точек, формируются не одновременно. Обычно данные, накопленные за 100 мс (что соответствует типичному значению 10 Гц), выводятся как один кадр облака точек. Если за эти 100 мс абсолютное положение корпуса LiDAR или объекта, на котором он установлен, меняется, система координат каждой точки в этом кадре будет отличаться. Интуитивно такой кадр облака точек будет «искажён» и не будет точно соответствовать обнаруженной информации об окружающей среде. Это похоже на фотографию: если рука дрогнула, снимок получится смазанным. Это и есть искажение LiDAR из-за собственного движения.
Давайте посмотрим, что представляет собой искажение из-за собственного движения.
Характер искажения облака точек LiDAR из-за собственного движения связан с методом сканирования. Например, каждый кадр традиционного 360-градусного механического LiDAR сканируется от точек вокруг центра LiDAR за 100 мс. Когда корпус LiDAR или базовое транспортное средство неподвижны, начальные и конечные точки сканирования лучше совпадают, поскольку начало координат остаётся неизменным. А когда LiDAR или транспортное средство движется, возникает искажение собственного движения: данные одного оборота деформируются, из-за чего окружающие точки больше не совпадают, поскольку разные точки имеют разные начала координат.

Рисунок 1. Схема искажения из-за собственного движения для 360-градусного механического LiDAR
Давайте подробнее разберём суть этого явления.
Проще говоря, искажение из-за собственного движения в облаке точек LiDAR по сути является результатом того, что каждая точка в кадре относится к своей системе координат.
На рисунке ниже слева p1~p3 обозначают три точки, последовательно просканированные LiDAR, которые в реальном мире лежат на одной линии. Однако из-за резкого движения LiDAR в пределах одного кадра эти три точки были просканированы при трёх разных положениях датчика, как показано на среднем рисунке. Поэтому в итоговом облаке точек (крайний правый рисунок) эти три точки фактически находятся в разных системах координат и уже не выглядят коллинеарными.

Рисунок 2. Изменения системы координат облака точек
На рисунке 3 приведён пример реального применения.
Искажение из-за собственного движения возникло, когда автомобиль с Livox LiDAR выполнял разворот: и стена, и автомобиль вдали дали расслоение из-за быстрого вращения автомобиля.

Рисунок 3. Облака точек припаркованных у дороги автомобилей расслаиваются из-за движения автомобиля
Как же исправить искажение из-за собственного движения? Очевидно, если ехать достаточно медленно...
Конечно нет. Нам нужно преобразовать систему координат всех точек в одном кадре к единой системе координат, где находится первая точка p1, как показано на рисунке 1. По сути, это компенсация движения LiDAR.
We use p1iдля обозначения координатыpiв системе координат LiDAR 1, иT jiдля обозначения изменения положения координаты отiк j. В кадре облака точек изменения каждой точки относительно системы координат первой точки составляютT12, T13, T14… соответствующую точку можно легко перенести в координаты первой точки:

В принципе это выглядит очень просто (и на практике тоже довольно просто). Если вы знаетеT1iв каждой точке, то как это узнать?
В практических приложениях обычно сначала пытаются измерить информацию о движении LiDAR, например изменение положенияTоблака точек кадра (интервал 100 мс).T1iточки затем определяется линейной интерполяцией на основе разницы времени Δt между точкой и начальной или конечной точкой, исходя из предположения кратковременной равномерности. Изменение положенияTможно получить через инерциальную навигационную систему (INS) или LiDAR-одометрию (например,LIO). Если для расчёта изменения положения используется инерциальный измерительный блок (IMU, который предоставляет информацию об угловой скорости и ускорении), требуется дополнительная информация о начальной скорости LiDAR или транспортного средства.
А как получить значение Δt? Выходные данные Livox LiDAR содержат временную метку для каждой точки. Облако точек можно считывать напрямую из пакета данных облака точек Custom Msg. Для других типов LiDAR может потребоваться получать временную метку каждой точки на основе информации из SDK или путём ручного расчёта.
Преобразование координаты каждой точки в каждом кадре к единой системе координат по приведённой выше формуле и является процессом удаления искажений.
На рисунке 4 ниже показано сравнение облаков точек до и после удаления искажений.

На рисунке 4 показаны результаты после калибровки облака точек
Мы загрузили код описанного выше процесса удаления искажений на GitHub; если вам интересно, пожалуйста, click here.
Примечания к коду:
Rely on:
livox_ros_driver
PCL
ROS
Компиляция: используйте команды в workspace
catkin_make
Run:
source develop/setup.bash
roslaunch livox_distribution_pkg run.launch
Примечания к интерфейсу:
Класс ImuProcess определён в data_process.h. Функция-член UndistortPcl этого класса выполняет устранение искажений; параметр функции Sophus::SE3d Tbe задаёт положение между началом и концом кадра текущего облака точек. Если это положение можно предоставить напрямую, функцию можно вызвать для удаления искажений. Если доступны только данные IMU, для удаления искажений вызывается функция-член Process класса ImuProcess.
Специальные примечания:
Калибровка смещения искажений требует, чтобы пользователь вручную рассчитал изменение смещения при соответствующей разнице времени на основе своих источников информации о смещении (GPS-координаты положения, скорость и т. д.) и передал его в функцию UndistortPcl в коде.
Use:
Input:
Этот инструмент разработан на базе ROS, поэтому входная информация имеет два топика: топик облака точек /livox/lidar в формате customMsg и топик информации IMU /livox/imu
Output:
На выходе получается откалиброванное облако точек /livox_unidistort