LOAM:Lidar Odometry and Mapping in Real-time
LOAM为清华自动化本科毕业的Zhang Ji博士在CMU读博期间,于2014年在RSS期刊发表的关于三维激光传感器的SLAM算法。
缺点:
- 没有回环检测;
- 计算时间复杂度较高,基于三维空间中的位姿进行优化;
- 户外可能受到各种噪声影响,例如树上摇晃的树叶,地上的杂草。而这些点未必会重复出现在前后两帧激光中。而错误的特征点将会影响位姿精度。
- LOAM需要提取平面点和边缘点,由于车体上下颠簸,竖直维度提取的平面点很容易造成误差。
一、LOAM安装和编译
1.下载A-LOAM源码(版本:ubuntu18.04 ros melodic )
cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git
2.编译
cd ~/catkin_ws/src
cd ../
catkin_make
#可添加到 ~/.bashrc 文件中:
source ~/catkin_ws/devel/setup.bash
3.运行
#终端一
roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch
#终端二
rosbag play YOUR_DATASET_FOLDER/nsh_indoor_outdoor.bag
4.运行Kitti数据集
A-LOAM运行KITTI数据集需要运行kittiHelper节点,首先要将KITTI数据转换成ROS 的 Topic 或者 rosbag,读取KITTI数据集的 图像\雷达\时间戳 并发布topic和保存bag,跑之前修改launch文件:
<launch>
<node name="kittiHelper" pkg="aloam_velodyne" type="kittiHelper" output="screen">
<param name="dataset_folder" type="string" value="/data/KITTI/odometry/" />
<param name="sequence_number" type="string" value="00" />
<param name="to_bag" type="bool" value="false" />
<param name="output_bag_file" type="string" value="/tmp/kitti.bag" /> <!-- replace with your output folder -->
<param name="publish_delay" type="int" value="1" />
</node>
</launch>
其中/data/KITTI/odometry/修改为kitti数据集的路径,to_bag的值可以为false或者true,选择是否将kitti数据集计算轨迹的同时打包成bag输出,输出路径为out_bag_file的值。
运行:
roslaunch aloam_velodyne kitti_helper.launch
roslaunch aloam_velodyne aloam_velodyne_HDL_64.launch
二、LOAM解析
1.整体框架
主要思路就以两个并行算法LidarOdometry(高频低精度)、LidarMapping(低频高精度)实现低漂移和低计算复杂度。
2.主要流程
主要包括三个节点:点云提取(scan registration)、雷达里程计(lidar odometry)、雷达建图(lidar mapping)
2.1点云提取(scan registration)
LOAM中选用特征点来进行运动估计,特征点选取(edge point角点)和平面点(planar point),如下黄点为edge point,红点为planar point。试验数据表明,大部分点云都是平面点。边线点起到的约束作用较小。
2.2雷达里程计
主要根据scanRegistration发布的点云信息,寻找角点与平面点的匹配点,并构建点到线及点到面的约束方程,使用ceres进行求解。点云使用pcl下的kdtree存储。
- 先将点云都变换到起始坐标系,
- 然后在存放上一帧点云的kdtree中查找点云的最邻近点,
- 在找到的最邻近点的相邻帧找到邻近点的最邻近的点。并构造距离方程。
- 通过迭代得到两个SCAN之间的坐标系变换。
- 累积便可的odom的输出。
2.3雷达建图
地图创建
雷达地图创建采用点云地图,通过迭代得到的每一次sweep对应的雷达的世界坐标系下的位姿变换矩阵,得到点云的世界坐标坐标。
位姿精优化(mapping odometry)
选取点最近邻5个点,进行协方差矩阵特征值、特征向量计算,若其中一个特征值远大于其他特征值,则说明该点是边线点,其中最大的特征值对应的特征向量就是该线的方向向量。同理得到点面的约束