SLAM Cartographer(18)后端优化问题求解器 了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解
SLAM Cartographer(16)约束构建器 了解约束构建器的MaybeAdd(计算局部/全局约束)-NotifyEndOfNode(添加约束完成)-WhenDone(闭环检测完成)调用循环和它们的接口实现,看到它借助线程池在后台并行地完成了闭环检测和INTER_SUMMAP类型的约束计算。在后台线程中完成子图与路径节点之间可能的约束计算中先通过基于分支定界算法的匹配器进行粗匹配,然后再通过Ceres进行细匹配。
SLAM Cartographer(15)位姿图 了解位姿图PoseGraph2D的构造过程,以及它是如何将前端输出的子图更新信息以及激光雷达扫描的点云数据添加到位姿图中的,并通过一个约束构建器在后台完成闭环检测。每当前端有输出的时候,不一定立即计算约束更新位姿图的,而是放到一个工作队列中,当闭环检测结束后在调度工作队列完成更新。
SLAM Cartographer(14)Global SLAM的主线业务 在Cartographer中的位姿图是由轨迹节点和子图构成的二部图,图中的约束描述的是轨迹节点与子图之间的位置关系。后端优化就是估计轨迹节点与子图在世界坐标系下的位姿,最小化全局估计与局部估计之间的偏差
SLAM Cartographer(13)基于Ceres库的扫描匹配器 基于ceres的扫描匹配器CeresScanMatcher2D,要求hit点在占用栅格上出现的概率最大化(即代价为hit点占据空间出现空闲栅格概率最小)之外, 还通过两个残差项(平移和角度)来约束了优化后的估计位姿在先验位姿的附近
SLAM Cartographer(12)Local SLAM的主线业务 Local SLAM的主线业务逻辑, 由两个函数决定。函数AddRangeData主要是在筛选激光点云并将它们划分为hit点和miss点,函数AddAccumulatedRangeData则主要调用函数ScanMatch进行扫描匹配和函数InsertIntoSubmap完成子图更新
SLAM Cartographer(11)占用栅格 子图是一种ProbabilityGrid占用栅格形式的地图,其父类2D栅格地图Grid2D则定义了栅格单元的存储方式, 并通过类MapLimits来描述占用地图的作用范围。了解了插入器对象range_data_inserter_,介绍了栅格单元的占用概率更新原理,并分析了查找表的构建方法和光线投射方式更新栅格地图。
SLAM Cartographer(10)子图 维护的子图仅包括旧新两个子图,其中旧图用于扫描匹配,新图作为储备。 当新图中插入的数据达到一定程度之后,就替换旧图进行扫描匹配,并重新创建一个新图。还有子图类。
SLAM Cartographer(9)局部轨迹生成器 局部轨迹生成器类LocalTrajectoryBuilder2D包含了Local SLAM的核心要素以及实现这些要素的对象,添加传感器数据、扫描匹配、运动滤波、更新子图等相关的功能。
SLAM Cartographer(8)连接前端与后端的桥梁 在GlobalTrajectoryBuilder的成员变量中,了解到前端子图构建LocalTrajectoryBuilder2D、后端闭环检测PoseGraph2D。 还有其接口类GlobalTrajectoryBuilder中的接口处理点云数据函数。