cartographer是基于图优化的算法,主要的目标是实现低计算资源的损耗,达到实时slam的目的,看具体代码之前现对整个框架介绍
主要参考:Cartographer源码阅读1——整体框架介绍
1.catrographer整体框架
cartographer的代码主要包括两个部分:cartographer和cartographer_ros。
cartographer主要负责处理来自Laser、IMU、Odemetry等传感器的数据并基于这些数据进行地图的构建。所以这一部分应该说是cartographer代码的核心部分。而cartographer_ros是基于ros的通信机制获取传感器的数据并将他们转换成cartographer中定义的格式传递给cartographer处理,与此同时也将cartographer的处理发布用于显示或保存。是基于cartographer的上层应用。所以,cartographer_ros相当于是对cartographer进行了一层ROS接口的封装。
cartographer_ros是基于ros的通信机制获取传感器的数据并将他们转换成cartographer中定义的格式传递给cartographer处理,与此同时也将cartographer的处理发布用于显示或保存。是基于cartographer的上层应用。所以,cartographer_ros相当于是对cartographer进行了一层ROS接口的封装。
2.cartographer算法流程(Cartographer ROS Integration)
根据官网,cartographer的整体流程如下:
cartographer的整体框架可以分为 、Local_SLAM和Global_SLAM 滤波器等
input Sensor data主要是传感器数据的输入:lidar, Odometry, IMU,Fixed Frame pose(暂时不知)
Local SLAM也被称为Frontend,负责生成较好的子图。从传感器出发,Laser的数据经过两个滤波器后进行Scan Matching,用来构建子图submap, 而新的Laser Scan进来后也会插入到已经维护着的子图的适当位置。如何决定插入的最优位姿,就是通过Ceres Scan Matching来实现的。估计出来的最优位姿也会与里程计和IMU数据融合,用来估计下一时刻的位姿。
该部分相关的参数定义在/src/cartographer/configuration_files/trajectory_builder_2d.lua和/src/cartographer/configuration_files/trajectory_builder_3d.lua中。
Global SLAM也称为Backend. 负责进行全局优化,将不同的子图以最匹配的位姿贴在一起,该部分的主要任务是进行Loop Closure。如前所述,闭环检测本质上也是一个优化问题,文中将其表达成了pixel-accurate match的形式,采用Branch-and-Bound Approach (BBA)的方法来解决。
3.文件框架(cartographer和cartographer_ros)
整体框架
cartographer部分
cartographer_ros
1.src_carto/cartographer
src_carto/cartographer主要包含cartographer和configuration_files等,其中cartographer是核心代码,configuration_files为配置文件。
cartographer文件
src_carto/cartographer/cartographer部分源码主要分为了如图所示的几个文件夹:cloud、common、ground_truth、io、mapping、metrics、sensor、transform。其中一些文件夹的作用我们也能猜到:
1. common: 定义了基本数据结构和一些工具的使用接口。例如,四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等。详见Common部分源码分析
2. sensor: 定义了传感器数据的相关数据结构。详见sensor源码分析
3. transform: 定义了位姿的数据结构及其相关的转化。如2d\3d的刚体变换等。详见:transform部分源码分析
4. mapping: 定义了上层应用的调用借口以及局部submap构建和基于闭环检测的位姿优化等的接口。这个文件也是算法的核心。其中mapping_2d和mapping_3d是对mapping接口的不同实现。详见mapping部分源码分析
5. io: 定义了一些与IO相关的工具,用于存读取数据、记录日志等。详见io部分源码分析
6. cloud
src_carto/configuration_files
2.cartographer_ros下的文件如图所示:
cartographer_ros_msgs里定义了部分msg文件和srv文件。cartographer_rviz是与显示相关的函数。
参考文章: