Simple-LIO-SAM——(一)项目简介
- ⭐ Zeal's Blog
- 🛠 知乎专栏
- 🌀 项目仓库
LIOSAM介绍
LIOSAM(Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping),紧耦合激光惯性里程计方法。 作者TixiaoShan是SLAM届大神,在LIOSAM之前发表过LeGO-LOAM,在LIOSAM之后发布了LVI-SAM——在LIOSAM基础上又加入了语义定位因子。 网上关于LIOSAM的解读已经有很多,这里不会进行太过详细的复述,具体的内容解析会放在后面系列文章慢慢仔细阐述。
简单来说,LIOSAM整体的框架与其他方法区别在与:
- 使用因子图作为后端优化框架,将IMU预积分与雷达点云匹配及回环检测等紧耦合
- 使用当前帧-局部地图匹配而不是对全局地图匹配来加速点云匹配速度
- 基于位置关系选择回环帧,并使用点云匹配计算回环因子
- 使用高频IMU并进行简单积分对点云做运动畸变校正
另外,LIOSAM作者的工程功底很好,LIOSAM代码库被github上很多SLAM开源项目作为code base
本项目目的
LIOSAM源代码虽然不能说庞大,甚至可以说简单,因为整个代码库主要只要5个文件。但是原代码里面每个模块都通过ROS的topic与其他模块有紧密的联系,且非常多的冗余代码和topic,这导致了 整个的流程对新手十分不友好,下图是LIOSAM原本运行时的rqt_graph
第二个复杂之处在于LIOSAM框架涉及到的知识点和工具较多,至少要熟悉ROS,gtsam,pcl
几个库,算法层面需要熟悉点云匹配、IMU积分、因子图、三维转换
等。 对于熟悉SLAM的人来说可能较为简单上手,但是对于新入门的人来说则一开始会一头雾水。
基于上述这些原因,笔者基于LIOSAM改进,完成了SPL-LIO-SAM项目,希望能够以最大幅度帮助初学者理解LIOSAM框架及里面的算法细节。
适用人群
如果你是SLAM大牛,那本项目可能对你没有用处。如果你是以下人群之一,笔者相信本项目可以让你受益匪浅。
- SLAM初学者。本项目对代码注释和讲解可以说细致到令人发指,因此十分适合初学者学习。
- 接触过SLAM,希望将SLAM算法工程化,并加以实现。
- SLAM学习者或工程师,但是希望对LOAM,LeGO-LOAM,LVI-SAM,loam_velodyne其中任何一种算法进行精细学习
Simple-LIO-SAM项目特点/与LIOSAM区别
基于最新的ROS2发行版humble实现
虽然LIOSAM源码中有一个ros2分支,但该分支的维护者并不是原作者,而且已经长时间没有人维护,且该分支存在一些bug没有被修复。为了能够在进行本项目的学习过程中 熟悉最新的ROS2框架,笔者在LIOSAM的ros2分支基础上,修复了存在的bug,同时将功能较为独立的Transformfusion
类抽取成独立的类。
开箱即用docker开发环境
为了便于上手及部署,笔者同时准备了适配的docker镜像供学习者使用。
简化
话题发布的简化
LIOSAM原始代码中有很多中间结果的发布,这些中间结果可以用来可视化及调试程序,但是对于学习者和开发者而言不仅意义不大,而且会在初始学习源码阶段误导学习者。 本项目在话题发布上进行大幅度简化
,简化后的设计如下:
rqt_graph
:
坐标系简化
LIOSAM中实用的坐标系并不复杂,但是作者提供的urdf
包含了太多为了兼容性考虑的坐标系,这些坐标系对于实际运行和理解并没有用。因此,本项目基于ROS对坐标系的约束,将 坐标系关系树简化为如下:
保留算法及定义完整性
虽然本项目去除了很多非必要topic,同时对于一些非必要代码也进行了简化,但对一些学习算法有帮助的细节依旧保留。比如激光里程计在发布的时候有mapping/odometry
和mapping/odometry_incremental
两个话题,这两个话题虽然类似但是背后却有很不同的含义,但同时两者合一又不影响算法的运行。因此采取的做法时在代码中保留这部分代码,同时加以解释,但发布时只发布其中一个话题。