初识Cartographer
引言
在学习slam和ros的过程中,不少用到gmapping和cartographer等开源的pkg包来进行嵌入式设备的建图。作为一个学习者,还是有必要了解一下Cartographer的底层实现的。
Cartographer和Cartographer_ros
知乎链接
Cartographer的主要理论是通过闭环检测来消除构图过程中产生的累积误差[1]。用于闭环检测的基本单元是submap。一个submap是由一定数量的laser scan构成。
Cartographer主要负责处理来自Laser、IMU、Odemetry等传感器的数据并基于这些数据进行地图的构建。所以这一部分应该说是cartographer代码的核心部分。
而Cartographer_ros是基于ros的通信机制获取传感器的数据并将他们转换成cartographer中定义的格式传递给cartographer处理,与此同时也将cartographer的处理发布用于显示或保存。
是基于cartographer的上层应用。所以,cartographer_ros相当于是对cartographer进行了一层ROS接口的封装。根据官网的说明来看,即使不采用ROS,也可以运行cartographer算法。
这样一来,我们就清楚了Cartographer和Cartographer_ros之间的关系。
Cartographer里的文件夹
一、 Cartographer源码文件目录
- bazel: 第三方库的构建包括eigen、ceres等
- cartographer: 源码部分
- cmake: 包括了cmake模块的FindXXX.make文件以及相关的函数
- configuration_files: cartographer的lua配置文件
- docs: cartographer相关的一些指导文档
- scripts: 一些工具与库的安装脚本
二、 Cartographer/cartographer
文件内有8个文件夹,分别是cloud、common、ground_true、io、mapping、metrics、sensor、transform。
-
common: 定义了基本数据结构和一些工具的使用接口。例如,四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等。
-
sensor: 定义了传感器数据的相关数据结构。
-
transform: 定义了位姿的数据结构及其相关的转化。如2d、3d的刚体变换等。
-
mapping: 定义了上层应用的调用借口以及局部submap构建和基于闭环检测的位姿优化等的接口。这个文件也是算法的核心。其中mapping_2d和mapping_3d是对mapping接口的不同实现。
-
io: 定义了一些与IO相关的工具,用于存读取数据、记录日志等。
-
cloud: grpc进行远程调用,与多机协同有关。
-
ground_truth: slam开发过程中评估用的工具
-
metrics: cartographer过程数据的各种输出格式