cartographer 代码分析

本文详细介绍了Cartographer的ROS封装及其核心实现。Cartographer_ROS主要包含两个节点,occupancy_grid_node和offine_node_main,分别负责发布地图和处理传感器数据。在核心实现中,Cartographer通过AddTrajectoryBuilder初始化,并使用TrajectoryBuilderInterface处理传感器数据,进行局部和全局轨迹生成。关键类包括LocalTrajectoryBuilder2D、GlobalTrajectoryBuilder和PoseGraph2D,涉及激光数据处理、回环检测和图优化问题的解决。整个流程中,数据压缩、运动畸变矫正、Ceres优化和因子图模型等技术起到了重要作用。

相关注释代码链接为:cartographer代码注释
在这里插入图片描述

代码主要分为两个部分,其一为cartographer的核心实现,另一个为cartographer的ros封装壳。首先介绍其ros封装,可以看到大概的调用流程,然后再深入源码去剖析其实现过程。但是其代码可以说十分的繁琐且复杂,在只能大致理清楚其逻辑。

Cartographer-ROS

根据运行的命令 roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=${HOME}/Downloads/b2-2016-04-05-14-44-52.bag可以知道,运行文件offline_backpack_2d.launch启动算法。

  • 加载配置文件 backpack_2d.lua
  • 调用launch文件 offline_node.launch

因此,深入文件 offline_node.launch

  • 运行节点 rviz
  • 运行节点 cartographer_occupancy_grid_node
  • 运行节点 cartographer_offline_node

因此对于cartographer-ros来说,主要的节点就是这两个,其在如下文件中分别实现

  • offine_node_main.cc
  • occupancy_grid_node.cc

occupancy_grid_node

在这里插入图片描述

主要实现的功能有

  • 新建一个定时器,定时发布全局地图信息
  • 构造回调函数,在回调函数内处理子地图列表信息

其子列表信息回调函数流程如下:

  • 设置所有之前的子地图为待删除子地图
  • 在待删除子地图中去掉当前子地图列表中还存在的
  • 获取新子地图信息 FetchSubmapTextures
    • 发布一个srv,获取压缩后的子地图栅格信息
    • 对栅格地图信息进行解压
  • 转换子地图信息格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值