Cartogapher_ros 部分
cartorgrapher_ros的入口函数:
cartographer_ros/cartographer_ros/cartographer_ros/node_main.cc。其中Run()接口启动所有的节点,包括
1.加载参数:节点参数,轨迹参数
2.定义map_builder 变量。
3.节点类。所有数据都在节点类中进行发布与订阅。
发布的主题:topic
kSubmapListTopic
kTrajectoryNodeListTopic
kLandmarkPosesListTopic
kConstraintListTopic
kScanMatchedPointCloudTopic (matched point cloud data)
服务:
kSubmapQueryServiceName (Query Submap)
kStartTrajectoryServiceName (start a trajectory)
kFinishTrajectoryServiceName (end a trajectory)
kWriteStateServiceName
Cartogapher 核心部分
cargtograper 源码主要包括:cloud, common, ground_truth, io, mapping, metrics, sensor, transform
Mapping:这是cartogapher算法的核心部分,包括ros 调用的接口,子图构建接口,姿态图优化接口。
common:基本的数据结构、工具接口
Sensor:传感器数据结构
transform:位姿数据数据,位姿的变换矩阵
io:数据以及日志的存储
cloud:点云前处理
Local SLAM
TrajectoryBuilder,PoseGraph。TrajectoryBuilder建立与维护局部子图。PoseGraph进行全局位姿的闭环检测。
Mapbuilderinterface为接口类,实际的实现在MapBuilder中。cartor-grapher算法的顶层实现类包括:
MapBuilder(目录:/mapping/map_builder.h)包含的了成员变量:
std::unique_ptr pose_graph_:指向位姿图的智能指针;
std::unique_ptrsensor::CollatorInterface sensor_collator_:指针指向收集的传感器数据
std::vector<std::unique_ptrmapping::TrajectoryBuilderInterface> trajectory_builders_:包含所有轨迹的管理向量
std::vectorproto::TrajectoryBuilderOptionsWithSensorIds all_trajectory_builder_options_:轨迹的配置向量
MapBuilder被TrajectoryBuilder调用,通过在轨迹上采集的数据来构建一个栅格地图,建图过程的误差会随着时间进行累积。
TrajectoryBuilder创建轨迹。
轨迹就是节点串,每一条轨迹上都有多个结点,在(/mapping/trajectory_builder_interface.h)InsertionResult{} 用来存储结点的结构数据。结点的数据包括:结点Id、TrajectoryNode::Data、submap。
结点Id(NodeId):包括轨迹id,节点索引
轨迹结点(TrajectoryNode):包括时间,传感器数据,结点在Local Slam中的位姿,点云,结点在世界坐标系中的位姿。
submaps😦/mapping/submaps.h)距离数据持续不断的添加到子图中。数据达到一定阈值后,就完成子图,并建立约束以及比闭环检测。
LocalSlamResultCallback:回调函数。当local SLAM线程处理距离数据,插入姿态时进行调用。
AddSensorData():处理传感器数据的函数
CollatedTrajectoryBuilder继承TrajectoryBuilderInterface,继承与实现了特殊的方法
MapBuilder:相关类的调用关系,MapBuilderInterface->MapBuilder->TrajectoryBuilderInterface->CollatedTrajectoryBuilder->GlobalTrajectoryBuilder->CreatGlobalTrajectoryBuilder2D->LocalTrajectoryBuilder2D。