简介
LIO-SAM是基于因子图构建的激光雷达惯性里程计,可以将大量的相对测量值、绝对测量值、回环等多种不同数据作为因子融入激光雷达惯性里程计系统中。IMU预积分的运动估计被用来去处激光雷达运动畸变,并为激光雷达惯性里程计的优化提供初值。获得的激光惯性里程计的结果反过来用作估计IMU的偏差。为了确保实时性与高性能,进行位姿优化时边缘化掉了一些旧的激光雷达数据,而不是将激光雷达点云与整个地图进行匹配。在局部范围而不是全局范围进行扫描匹配可以有效提高系统的实时性,选择性地引入关键帧和高效的滑动窗口也能提高实时性能。
与其他算法的对比
LOAM:LOAM使用一个激光雷达和一个imu能实现了最好的性能,自它在KITTI odometry benchmark site发布以来就一直排在最前面。虽然LOAM算法很成功,但依然存在一些限制。首先是它保存地图是在一个全局体素地图中,其次它无法进行回环检测,也无法融入其它的像GPS这样的绝对测量数据进行位姿矫正,而且LOAM也存在在大场景测试中偏移问题,原因是因为它核心还是一个基于scan-matching的方法。
系统框架
运行时存在的问题
-
之字形或跳动
如果激光雷达和IMU数据格式与LIO-SAM的要求一致,则可能是由于激光雷达和IMU数据的时间戳不同步而导致此问题。 -
上下跳跃
测试bag数据集时base_link上下跳跃,可能是你的IMU外参标定错误。例如,重力加速度具有负值或者方向标定错误。
请修改params.yaml的外部参数:
extrinsicTrans: [0.0, 0.0, 0.0]
extrinsicRot: [1, 0, 0,
0, 1, 0,
0, 0, 1]
extrinsicRPY: [1, 0, 0,
0, 1, 0,
0, 0, 1]
-
mapOptimization崩溃
通常是由GTSAM引起的。请安装在README.md中指定的GTSAM。更多类似的问题可以在这里找到。 -
gps里程表不可用
通常是由于消息frame_ids和本体frame_id之间的转换不可用引起的(例如:应该可以从“imu_frame_id”和“ gps_frame_id”转换为“ base_link”框架。 -
如何保存地图
修改params.yaml
savePCD:true
-
与Robosense兼容性
由于Robosense点云与Velodyne点云格式不同需要进行转换,可以尝试使用转换工具rs_to_velodyne。 -
与livox兼容性
目前不行。 -
如何修改IMU的内部参数
可以尝试使用内参标定的工具https://github.com/gaowenliang/imu_utils。 -
机器人静止时坐标缓慢上下跳动
可能是因为没有足够的关键帧用于生成扫描匹配图,也可能是imu没进行校准,建议使用imu_utils进行校准。 -
长走廊上无法使用
长走廊属于SLAM中的退化问题,LIO-SAM无法使用。 -
使用9轴IMU
原因是9轴IMU给出了用于LIO-SAM初始化的横滚、俯仰和偏航角。系统的性能在很大程度上取决于IMU测量的质量。IMU数据速率越高,系统精度越好。建议使用至少提供200Hz输出频率的IMU。LIO-SAM当前仅适用于9轴IMU。