一、cartographer源码总体介绍
cartographer 整个源码分为两部分 cartographer 和cartographer_ros 两部分。
cartographer主要负责处理来自Laser、IMU、Odometry等传感器的数据并基于这些数据进行地图的构建。所以这一部分应该说是cartographer代码的核心部分(这里涉及到我们的优化算法,想要优化地图构建,就需要在这里设计算法)。
cartographer_ros是基于ros的通信机制获取传感器的数据并将他们转换成cartographer中定义的格式传递给cartographer处理,与此同时也将cartographer的处理发布用于显示或保存。是基于cartographer的上层应用。所以,cartographer_ros相当于是对cartographer进行了一层ROS接口的封装(这里不涉及到地图构建相关的算法,仅仅是基于ROS发布/订阅机制进行通信)。
二、cartographer源码详细介绍
2.1 src/cartographer目录
bazel: 第三方库的构建包括eigen、ceres等;
cartographer: 源码部分,(重点);
cmake: 包括了cmake模块的FindXXX.make文件以及相关的函数;
configuration_files: cartographer的lua配置文件;
docs: cartographer相关的一些指导文档;
scripts: 一些工具与库的安装脚本,如abseil、proto3等工具的安装脚本;
2.1.1 src/cartographer/cartographer目录
cartographer 部分源码分为以下几个文件夹 cloud, common, ground_truth, io, mapping, metrics, sensor, transform
位置:/src/cartographer/cartographer
cloud:云服务相关功能,grpc进行远程调用,与多机协同有关;
common:定义基本的数据结构以及一些工具的使用接口,通用的函数包括:任务,线程池,lua文件解析,数学库等;
ground_truth:slam开发过程中评估用的工具;
io:定义一些与io相关的工具,存读取数据,记录日志;
mapping:cartographer核心代码区,定义上层调用接口以及局部submap 构建和基于闭环检测cd位姿优化等接口,里面的2d和3d是对mapping接口的不同实现;
metrics:cartographer过程数据的各种输出格式;
sensor:定义雷达和点云的数据结构,传感器处理相关的函数imu、里程计、点云、压缩等;
transform:定义位姿的相关结构和相关转换,包含一些时间戳转换、坐标系转换;
2.1.2 src/cartographer/cartographer/mapping目录
该文件夹位cartographer的核心代码区,里面包含了2d,3d建图的函数map_builder、pose_grapher、constraint、optimization、scan_match等相关类封装。
2.2 src/cartographer_ros目录
cartographer_ros 部分目录分为以下几个文件夹
cartographer_ros:核心代码(与cartographer相关)
cartographer_ros_msgs:定义了msg和srv 文件,它们为cartographer定义了各种消息类型(与cartographer相关)
cartogpher_rviz :可视化相关工程cartographer相关)
docs :相关的文档
script:与安装相关的自动化脚本
2.2.1 src/cartographer_ros/cartographer_ros目录
launch:存放的是各个launch脚本文件,有之前运行过的demo脚本"demo_backpack_2d.launch"
configuration_files:cartographer的TF树,定义了map_builder,pose_graph,trajectory_builder的配置信息。
urdf :用URDF文件描述的机器人模型,(也就是配置机器人的各个节点,如几个关节、几个轮子、几个IMU)
script:自动化安装程序
2.2.1 src/cartographer_ros/cartographer_ros/cartographer_ros目录
该目录下定义了所有与cartographer相关的函数实现,如node_main.cc入口文件。