系列文章目录
文章目录
前言
研一上学期后半学期开始正式接触Cartographer这个谷歌的开源框架。本文主要记录一下自己学习的过程,以及学习过程中参考的一些资料和别人的笔记,仅当作记录。
提示:以下是本篇文章正文内容,下面案例可供参考
一、资料
1、知乎
cartographer 学习链接
Cartographer论文翻译
cartographer源码详细解读
2、优快云
泡泡机器人原创专栏-Cartographer】Cartographer理论及实现浅析
上述博客主要介绍了Cartographer大致的框架,我整理了一下该博客中提到的,用思维导图方式呈现一下。
每个模块介绍【slamcode的博客 】cartographer源码分析 - 优快云博客
3、哔站
【Cartographer 专题讲解一】萌妹子带你读Cartoprapher论文
【Cartographer 专题讲解二】Cartographer_ros 代码讲解入门
Cartographer代码详解专题五:算法主线程讲解
4、个人博客
二、论文学习
论文:2016年谷歌的 Real-Time Loop Closure in 2D LIDAR SLAM
学习资料:上述1.3中计算机视觉life的【Cartographer 专题讲解一】萌妹子带你读Cartoprapher论文
以及1.1中论文翻译
1、摘要
重点:
-
实现了5厘米分辨率的实时建图和闭环检测功能
-
为了实现实时闭环,我们使用了一种branch-and-bound分支定界方法来计算scan-to-submap匹配作为约束条件。
算法流程
- input Sensor Data:从上到下依次是激光、里程计、IMU、帧数据
激光数据经过两个滤波。Voxel Filter(fixed size)体素滤波。Adaptive Filter自适应滤波。这里进行两次滤波的原因是根据配置文件设置不同的options,减少数据量。
IMU经过ImuTracker:计算重力加速度的方向。再和里程计数据进行融合。
Odometry经过PoseExtrapolator:保持一段位姿,用于计算线速度和角速度。再进行位姿的差值,去除运动畸变。 - Local SLAM(前端部分)重点
处理后的数据经过Scan Matching(调用ceres库求解),将当前帧的数据插入到submap(子图)中。总结:前端利用CSM方法将激光数据插入子图中。
3.Global SLAM(后端)
主要是回环检测。利用分支定界加速。总结:构建回环消除子图间误差。
2、主要工作
匹配方法
传统方法:Scan-to-scan匹配。主要采用ICP和PL-ICP。这两种方式会累积误差。
本文方法:Scan-to-map匹配。CSM(相关匹配),构建似然场模型。
还有Poxel-accurate scan(高精度相机匹配),但是计算量很大。
处理误差方法
粒子滤波和图优化。
3、系统概述
定期运行一个位姿优化pose optimization。当一个子地图完成后,即不再有新的激光扫描被插入其中,它就会参与到闭环的扫描匹配过程中。所有已完成的子地图和扫描都会自动考虑进行闭环loop closure。通过每隔几秒钟完成一次优化,操作员的经验是,当一个位置被重新访问时,会立即发生闭环。这导致了软实时约束soft real-time constraint,即闭环扫描匹配必须比添加新的激光扫描更快地发生,否则它将明显落后。我们通过使用branch-and-bound分支定界法以及每个已完成的子地图中的几个预先计算的栅格来实现这一点。
4、Local 2D SLAM
scan to submap
每一帧激光数据转化到子图中,就是一个旋转量R+平移量t。即将每一帧激光点云从scan坐标系转化到子图坐标系下。
submaps
由概率栅格地图构图。每个小格子都有一个自己的value。如果value<Pmin,则该点无障碍物。如果value>Pmax,则该点有障碍物。如果Pmin<value<Pmax,该点不确定。
图中被击中的点,进行hit+1操作,原点和击中的点连线,中间的点进行miss+1操作。其他点对其分配一个值。当每组激光数据更新的时候,对栅格地图中每个点进行更新。
CSM
当每次把激光数据插入到子图中时,使用基于ceres的scan matching对位姿进行优化。scan matching负责找到一个位姿,使子图中该扫描点的概率最大。这个问题可以转化为一个最小二乘问题,见下图。
5、回环检测(重点)
目的:在大场景中构建子图用于减少误差(连续的子图之间误差很小)。但是子图直接需要通过回环检测来消除误差。
这里可以理解为将位姿之间的差值转化为最小二乘进行求解。
这里引出一个稀疏位姿调整(Sparse Pose Adjustment)方法。???
上图中左下角e为残差。右下角为核函数,在实践应用中,应对对称的环境,减小误差匹配带来的问题。???
分支定界
算法一

作用:便于寻找最优位姿,减少计算
**体素滤波 Voxel Filiter
作用:减小数据量
自适应体素滤波 Adaptive Voxel Filter**
作用:根据一些原则 在远近不同的地方保留不同数量的点云。经过自适应体素滤波,原始的激光点云数据分为high_res…和low_res。
Global SLAM 后端
一帧点云–》Addnode()包含点云很多信息