Simple-LIO-SAM——(一)项目简介

LIOSAM介绍

LIOSAM(Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping),紧耦合激光惯性里程计方法。 作者TixiaoShan是SLAM届大神,在LIOSAM之前发表过LeGO-LOAM,在LIOSAM之后发布了LVI-SAM——在LIOSAM基础上又加入了语义定位因子。 网上关于LIOSAM的解读已经有很多,这里不会进行太过详细的复述,具体的内容解析会放在后面系列文章慢慢仔细阐述。

简单来说,LIOSAM整体的框架与其他方法区别在与:

  1. 使用因子图作为后端优化框架,将IMU预积分与雷达点云匹配及回环检测等紧耦合
  2. 使用当前帧-局部地图匹配而不是对全局地图匹配来加速点云匹配速度
  3. 基于位置关系选择回环帧,并使用点云匹配计算回环因子
  4. 使用高频IMU并进行简单积分对点云做运动畸变校正

另外,LIOSAM作者的工程功底很好,LIOSAM代码库被github上很多SLAM开源项目作为code base

本项目目的

LIOSAM源代码虽然不能说庞大,甚至可以说简单,因为整个代码库主要只要5个文件。 LIOSAM原代码src目录
LIOSAM原代码src目录

但是原代码里面每个模块都通过ROS的topic与其他模块有紧密的联系,且非常多的冗余代码和topic,这导致了 整个的流程对新手十分不友好,下图是LIOSAM原本运行时的rqt_graph

原始LIOSAM运行时rqt_graph
原始LIOSAM运行时rqt_graph

第二个复杂之处在于LIOSAM框架涉及到的知识点和工具较多,至少要熟悉ROS,gtsam,pcl几个库,算法层面需要熟悉点云匹配、IMU积分、因子图、三维转换等。 对于熟悉SLAM的人来说可能较为简单上手,但是对于新入门的人来说则一开始会一头雾水。

基于上述这些原因,笔者基于LIOSAM改进,完成了SPL-LIO-SAM项目,希望能够以最大幅度帮助初学者理解LIOSAM框架及里面的算法细节。

适用人群

如果你是SLAM大牛,那本项目可能对你没有用处。如果你是以下人群之一,笔者相信本项目可以让你受益匪浅。

  1. SLAM初学者。本项目对代码注释和讲解可以说细致到令人发指,因此十分适合初学者学习。
  2. 接触过SLAM,希望将SLAM算法工程化,并加以实现。
  3. 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原始代码中有很多中间结果的发布,这些中间结果可以用来可视化及调试程序,但是对于学习者和开发者而言不仅意义不大,而且会在初始学习源码阶段误导学习者。 本项目在话题发布上进行大幅度简化,简化后的设计如下: Simple-LIO-SAM节点及话题设计
Simple-LIO-SAM节点及话题设计
简化后运行时的rqt_graph: Simple-LIO-SAM的rqt_grpah
Simple-LIO-SAM的rqt_grpah

坐标系简化

LIOSAM中实用的坐标系并不复杂,但是作者提供的urdf包含了太多为了兼容性考虑的坐标系,这些坐标系对于实际运行和理解并没有用。因此,本项目基于ROS对坐标系的约束,将 坐标系关系树简化为如下: Simple-LIO-SAM的坐标系关系
Simple-LIO-SAM的坐标系关系

保留算法及定义完整性

虽然本项目去除了很多非必要topic,同时对于一些非必要代码也进行了简化,但对一些学习算法有帮助的细节依旧保留。比如激光里程计在发布的时候有mapping/odometrymapping/odometry_incremental两个话题,这两个话题虽然类似但是背后却有很不同的含义,但同时两者合一又不影响算法的运行。因此采取的做法时在代码中保留这部分代码,同时加以解释,但发布时只发布其中一个话题。

完善的注释及流程图

网上对LIOSAM源码的注释其实并不少,比如LIO-SAM-noteLIO-SAM-DetailedNote,还有一些blog也对源码做了解释,但是都不太完美,同时缺少项目性的组织。本项目借鉴了一些开源项目的注释,并加以完善,可以说,本项目是目前对LIOSAM注释最完善的开源项目。Simple-LIO-SAM代码 Simple-LIO-SAM部分注释图
Simple-LIO-SAM部分注释图
为了最为清晰的展示LIOSAM算法不同模块的流程,该项目还对各个模块流程进行梳理,建立了完善的流程图设计 算法Pipeline梳理
算法Pipeline梳理
点云去畸变流程图-top
点云去畸变流程图-top
点云去畸变流程图-细节示例1
点云去畸变流程图-细节示例

本项目所有章节

  1. Simple-LIO-SAM——(一)项目简介
  2. Simple-LIO-SAM——(二)环境搭建与运行
  3. Simple-LIO-SAM——(三)总体流程认识
  4. Simple-LIO-SAM——(四)utility文件解读
  5. Simple-LIO-SAM——(五)点云去畸变模块
  6. Simple-LIO-SAM——(六)特征提取模块
  7. Simple-LIO-SAM——(七)GTSAM快速入门
  8. Simple-LIO-SAM——(八)IMU预积分模块
  9. Simple-LIO-SAM——(九)点云匹配算法详解
  10. Simple-LIO-SAM——(十)后端优化模块详解