本文是我在学习深蓝学院的激光slam第一课的学习笔记,这一课主要介绍了2d和3d的激光slam的一些基本概念,以及需要的一些数学基础。
激光slam介绍
基本方法
输入
- 里程计数据(odometry):正常来说都会有,因为slam一般配备在移动机器人、无人车,在一些特殊场景可能没有(手持设备)
- 2d/3d激光雷达扫描结果:必须要有,在2dslam的情况下一般是单线的
- IMU: 一般是可选的,可以没有
输出
- 3d点云地图:3dslam输出,在导航的时候会转成覆盖栅格地图进行导航
- 覆盖栅格地图(occupancy-grid map):将环境分割成对栅格并输出每个栅格是否可通行
- 轨迹(trajectory) 或姿态(pose graph)
帧间匹配方法(2d)
- PL-ICP(Point-to-line ICP):利用点到线的距离做误差计算,相对于点到点的方法更加符合室内结构化场景,但比较依靠初始解
- CSM(Correlation Scan Match):暴力枚举所有可能的状态进行匹配相关性计算,取最优结果,(通过一定优化可以减少计算时间)
- Optimization-Based:将地图空间看成解空间,依赖地图状态的梯度通过迭代求解,能方便引入额外约束,同样依赖初始解
- 实际常用 CSM + 梯度优化的方法,(也可以用 CSM + PL-ICP, 但是需要实际场景中有比较多结构化线段)
帧间匹配方法(3d)
- Point-to-Plane ICP:用点到面的距离作误差匹配
- Plane-to-Place ICP (GCIP): 面到面的距离
- NDT:划分网格拟合高斯分布,因为计算速度快所以在3d场景用得多一点
- NICP:在icp的基础上引入法向量信息(normal),角度精度较高
- IMLS-ICP:对点云进行局部曲面拟合
- Feature-based Method:参考视觉slam,提取特征点和描述子进行特征匹配,3d激光扫描结果信息量较多,所以可以使用
回环检测方法
- Scan-to-Map
- Map-to-Map
- Branch and Bound & Lazy Decision (延迟检测):由于2d 激光slam对环境数据量太少,很容易造成不同场景结果相似,导致出现错误的回环,延迟检测的方法是只有在检测到多个回环的情况下并且回环都一致的时候才认为出现回环
发展
Filtered-based (滤波方法,目前在2d激光slam(主要是建图)已经很少使用,因为滤波方法更关注当前状态(位置),对历史信息不修正(没有回环的概念),所以不利于利用全局数据进行建图,在定位(VO,VIO等)用的较多)
- EKF-SLAM (1990s): 随环境增大状态量会急剧增大
- FastSLAM (02~03):粒子滤波,每个粒子携带一个地图
- Gmapping (07): FastSLAM的升级版本
- Optimal RBPF (10):Gmapping的基础上进一步优化
Graph-based (图优化方法)
- Karto-SLAM (10):基于优化的方案(CSM + SPA)
- Cartographer (16):原理和Karto一样,用ceres实现,相对更完整
实际应用中注意的问题
数据预处理 (Preprocess)
- 轮式里程计标定,最好能到0.3%左右
- 激光雷达运动畸变(扫描过程中雷达的位置变化)
- 不同系统之间的时间同步(当每个传感器连接到不同处理器(cpu)上的时候系统时间可能会不一致,这个时候需要考虑时间同步获得统一时间戳)
实际环境的问题(大部分可以通过和视觉融合来解决)
动态物体、环境变化
- 高动态:移动中的人,车
- 低动态:物体被移动(椅子,箱子),频率低
几何结构相似环境:走廊等,容易发生状态退化,在3d的情况下则是比较空旷的区域,大部分点云无效导致环境退化
- 建图的操作复杂
- 全局定位
- 地面材质变化、地面凹凸不平、机器人载重变化:会造成里程计数据误差(间接改变了轮子直径)
数学基础
位姿和转换矩阵(pose & transformation matrix)
- 假设机器人B在坐标系O中的坐标表示为 $(x, y, \theta)$
则坐标系B到坐标系O的转换矩阵为:
不同机器人坐标系转换
机器人A和机器人B的坐标转换