hdl-graph-slam是比较早期的经典3d slam开源算法,思路简单明了,比较容易理解整个slam整体架构,适合入门,并且也是不多见的多传感器融合的开源方案。本文进行算法进行简单总结和思考。主要简单说明其优点,重点分析其不足和可改善的部分。
优点
- 代码架构简洁明了, 理解简单;
- 采用eigen、pcl、g2o等开源库,可以重点关注SLAM思想和框架,而不关心其内部具体数学推导和实现过程。
- 增加平面约束条件;
- 可同时融合gps 、lidar、imu等多种传感器,且容易理解;
缺点
前端里程计效果不佳
SLAM中虽说后端更为重要,但是前端里程计的好坏,也会直接影响后端优化的效果,在闭环优化前,主要靠前端激光里程计维持其准确性。常见的前端匹配主要包括scan-to-scan, scan-to-map和map-to-map三种类型,其中scan-to-map目前是比较流行的做法,和scan-to-scan相比较其优点非常明显。16年开源的cartographer 算法引入了submap的思想,也可采用多帧构建滑窗局部map也可,效果均比hdl采用相邻两帧点云匹配效果较好,其稳定性与累计误差均可优化。
前端未充分使用imu或里程计等惯性信息进行预测和融合。
点云降采样代码重复
由于采用的lidar必然存在一定噪点或离群点,同时包括过远或过近的不确定点云,可根据一定需求进行滤波。同时考虑性能以及点云密度不均衡问题,通常做法都需要预先做一定的滤波和降采样处理。
HDL在接收点云源数据进行了滤波和降采样等预处理,但在前端里程计点云匹配中,又进行了相同的一次的降采样处理,不是太理解。
关键帧提取重复且耗时
- 目前采用图优化思想的slam算法,基本都是采用关键帧进行保存轨迹,可以认为是轨迹降采样,其目的可降低运算资源且提高鲁棒性,基本理论即一定距离间隔或角度间隔的轨迹点作为关键pose,并记录对应时刻点云等其他传感器信息,并同时可作为图优化的顶点。hdl代码中在前端匹配时进行了关键帧提取而在后端优化放入图优化顶点时再次进行关键帧提取,显然有点重复。
- 为后端闭环检测做准备,在提取关键帧时,且同时计算了每个关键帧已经走过的累计轨迹长度,其目的是后续闭环检测中的一个条件,只有经过一定的累计距离的关键帧才有可能是闭环,否则可能为附近前端匹配帧。但是由于关键帧本身即为轨迹采样器,其相邻帧的间隔基本固定,而闭环累计条件并非需要准确累计值,因此其关键帧序号本身即为累计长度标量,此累计值计算有一点多余。
imu,gps等时间同步
slam中最重要的是多个传感器进行时间同步,从而与顶点进行约束,而hdl的时间同步较为简单,即采用时间戳最近法则,则认为是同步。
imu姿态约束
由于在测试时,未使用imu姿态角进行约束。因为源码中的直接采用imu提供的4元数姿态角进行约束,作者应该是使用的是磁力计并提供了绝对航向姿态信息,但是磁力计稳定性较差,一般情况下增加此约束,可能会导致结果更差,因此目前demo和实际测试中均没有使能IMU姿态角约束。
闭环检测方法
- 闭环检测与前端里程计基本类似,采用仅是当前帧与历史帧中的一帧进行点云匹配,从而判断是否闭环,其准确性和可靠性可通过scan-to-map进行提升。
- hdl采用的方法是将当前帧与历史帧每一帧一一比较是否满足闭环条件,然后再将满足条件的每个历史帧再一一进行点云匹配,最后找到最佳匹配点云帧认为闭环,显然效率较低。可采用lego-loam中的闭环进行优化,采用KDtree进行位置搜索,找到与当前帧最近的可能闭环点,然后取出最近关键帧前后多帧点云构成submap,然后进行一次点云匹配。其中满足闭环条件的最近关键帧附近显然满足hdl中满足闭环条件的候选条件,构建局部地图后显然更加可靠和稳定,且仅需一次点云匹配即可。
定时优化
hdl简单的将后端开启了一个独立线程进行,且采用定时的方式不停地进行优化处理,实际上优化处理较为耗费时间,而且如果没有新的闭环条件存在,仅存在imu和gps等其他信息进行多次优化意义并不是特别大。
因此闭环检测应当进行实时判断,而当出现一定闭环时再进行一次后端优化,从而更新整个关键帧信息,可节省大量时间。
定时地图发布
由于前端里程计构建了关键帧信息,因此地图发布仅需要进行简单的点云拼接即可。如果未进行后端优化,其表明历史关键帧信息队列并没有发生变化,仅是新添加了新的关键帧。因此可采用增量式更新地图即可。当成功出现优化结果时,再进行一次全体更新。
而目前hdl做法较为简单,定时将所有关键帧包含的点云信息,重新进行拼接,耗费大量时间。
总结
以上仅是个人一些观点,入门学习较为简单,真正使用时需要进行一定修改和优化,否则较大地图创建误差较大。