多线激光雷达即有多个激光发射器同时工作,如常见的 Velodyne16,就是共有 16 个激光发射器,一般这些发射器竖排排列,然后一起水平旋转。
激光雷达在一定的时间内旋转一圈,即一帧的点云数据。值得注意的是,在一帧时间内激光雷达的载体也会运动,因此,一帧数据内会包括不同时间的点云,这也就是激光雷达的运动畸变。
下图是kitti数据集的坐标系表示


main函数:
laserCloudHandler回调函数
这一步其实是需要放在特征提取之前做的
但是这块A-loam中没有,借助lio-sam中featureExtraction.cpp讲解
首先遍历所有点云,取出相邻两点的距离信息,计算两个点的列数id差。由于在筛选时会去除空点,因此防止两个有效点云虽然相邻但是间隔很远。
根据深度信息筛选下图中b的情况,根据相邻点的距离差,筛选下图中a的情况。

激光雷达的一帧数据是过去一段时间而非某个时刻的数据,在这一帧时
间内的激光雷达或者其载体通常会发生运动,因此,这一帧数据的原点都不一致,运动补偿的目的就是把所有的点云补偿到某一个时刻,这样就可以把本身在过去100ms 内收集的点云统一到一个时间点上去
P
s
t
a
r
t
=
T
s
t
a
r
t
c
u
r
r
e
n
t
∗
P
c
u
r
r
e
n
t
P_{start}=T_{start_current} * P_{current}
Pstart=Tstartcurrent∗Pcurrent
运动补偿需要知道每个点该时刻对应的位姿$ T_{start_current $,通常有几种做法:
代码对应laserOdometry.cpp
去畸变
TransformToStart()函数 将输入的点云坐标转到起始时刻
TransformToEnd()函数 将输入的点云坐标转到结束时刻
主函数
while循环
建立laserMapping节点,加载体素滤波参数,订阅前端点云和里程计信息,回调函数就是把信息存进队列。将后端数组复位,建立process线程进行处理