一.Aloam简介
秦通对LOAM的一个简化版本,没有IMU的信息,是入手激光SLAM非常简单的程序,初学者必备。其将原版LOAM代码中手写的求解旋转矩阵,欧拉角,推到LM及雅克比矩阵,改成了运用Eigen库和ceres库进行求解优化,极大的简化了代码的复杂性,非常适合初学者进行学习。
Git链接:
https://github.com/HKUST-Aerial-Robotics/A-LOAM
二.loam与Aloam对比
1.LOAM:
LOAM使用了作者定义的特征点提取和匹配方法,主要去边角点和平面点。LOAM use a new defined feature system (corner and flat point), for the detail see its article.
LOAM假设每一次激光扫描过程中是匀速运动,并且用这个假设修正激光雷达数据的运动扭曲问题。在VLOAM中则是更进一步,使用视觉的里程计估计每一个扫描数据的运动。LOAM suppose linear motion within the scan swap (VLOAM further uses visual odometry to estimate it), and undistort the lidar points.
LOAM也有一个低频率调用的全局优化线程。
目前网上也有对LOAM的多个中文注释版本:
(1)https://zhuanlan.zhihu.com/p/57351961
(2)https://blog.csdn.net/Nksjc/article/details/76401092
(3)https://github.com/cuitaixiang/LOAM_NOTED
2.ALOAM
另外,下面的算法都使用hdl_graph_slam给到的室外数据集做了结果的测试,建模的图像如下所示。由于没有找到轨迹的真实值,没有对轨迹误差做比较分析。
LOAM和ALOAM的区别(Difference LOAM vs A-LOAM):
LOAM中提供了使用IMU信息修正的接口, ALOAM中省略了这一块。LOAM has IMU refinement.
ALOAM中缺少了对提取到的特征点的筛选过程,具体可以参见LOAM的代码部分(对一些不好的边角点做了筛选)。Lack feature filter in A-LOAM.
LOAM中的优化LM方法是作者自己编写的,ALOAM则是使用了Ceres库完成这一部分。LOAM implies the LM solver itself. A-LOAM uses Ceres solver.
补充上面的一点,LOAM中作者解析地求出了雅各比的表达式(其中使用了一些小技巧统一了不同特征点的残差函数的导数表达),ALOAM则是简单地使用了ceres提供的自动求导工具(这样可以节省开发的时间,得到了也是准确的解,但是运算时间会稍稍长些,具体可以参见ceres的官方文档)。LOAM use analytical derivatives for Jacobians, but A-LOAM uses the automatic derivatives offered by Ceres (which is exact solution but a little bit slower).
相比于原本的LOAM, ALOAM的可读性更高,非常适合学习。尤其是雅各比的部分,LOAM原本的雅各比推导非常的难理解。ALOAM直接用自动求导,整个SLAM最复杂的运算就不需要推导了!
Performance:
• A-LOAM seems good,less redundant points.
• but has more error in far edges.
• LOAM method has no assumption of a consistent “floor”, that is better for our case.
• A-LOAM has the same logical with LOAM, but its performance is much worse.
下面是对ALOAM的三个线程的运行时间的分析(以下的运行测试都是再i5 9300 cpu上进行的),分别是scan registration线程,odometry线程,和mapping线程。其中mapping是进行全局优化的线程,另外两个线程则和实时性息息相关。
ALOAM - scan refistration
the maximum time is : 0.034434
the mean of time is : 0.0148146394612
ALOAM - odometry
the maximum time is : 0.027296
the mean of time is : 0.0157431030928
ALOAM - mapping
the maximum time is : 0.326849
the mean of time is : 0.257764385093
For one input scan, it takes 0.0305s in average. 对于一个新的扫描帧,需要大概0.03秒的处理时间,另外低频优化每次的耗时大概0.25秒(并不影响实时性)。
三.Aloam整体框架
1.工程基于ROS进行的开发,如图所示:
1>launch文件夹:算法的启动接口,通过该文件夹下的不同的launch文件,让算法驱动不同版本的激光雷达,从而进行建图工作;
2>include文件夹 :主要包含一个简单的通用头文件common.h和一个计时器的类tictoc.h文件夹,计时单位为ms,其中common.h主要包含俩个功能:
(1)通过typedef对pcl pointcloud进行重命名,方便对后面代码进行简化。
(2)角度转换。
tictoc.h主要是对std::chrono代码进行封装,用于后面的时间操作。
3>rviz_cfg:包含loam启动时的rviz配置相关记录;
4>src文件夹:包含的是LOAM算法整体部分,核心代码:4个cpp分别对应节点图中4个节点,1个hpp为基于Ceres构建的残差函数,用以计算点到直线与点到平面的距离,从而进行点云配准;
5>picture文件夹:预留的编译产出目录,README.md中的图片;
6>docker文件夹:提供了docker环境,方便开发者搭建环境;
2.运行节点图
四.参考文献
https://blog.csdn.net/weixin_44492024/article/details/101452315
https://www.cnblogs.com/wellp/p/8877990.html
https://mp.weixin.qq.com/s/ou4ynyt9PXMBj0nVnR7YpA