Cartographer总结(1:整体框架)

本文介绍了Cartographer的工程结构,包括cartographer和cartographer_ros,以及它们在SLAM中的作用。Cartographer依赖于glog、ceres和Protobuf等库,支持2D和3D建图。文章详细阐述了Cartographer的类层次,强调了trajectory概念的重要性,并概述了全局和局部SLAM的角色。在ROS环境中,重点讲述了map_builder的创建、节点的启动、轨迹的加载和订阅过程。此外,还提到了时间处理的注意事项,Cartographer内部使用的是UTC时间,与ROS时间不完全相同,需要进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cartographer总结(1:整体框架)

by 扛着相机的翻译官

  Git上开源的cartographer分为cartographer工程和其ros封装即cartographer_ros两部分。cartographer_ros部分只是对cartographer的封装应用,相当于一个example,可以用来理解cartographer的接口如何使用。

cartographer使用了goolge自带的一些库,如 ceres, glog 等,还有一些非google开发的依赖库,如 ProtobufLua 等。最新版本的cartographer使用了更多google开发的库。这些goolge的库使用起来方不方便因人而异,我个人的使用感觉还是很不方便的,尤其是在安装过程中,版本的要求较多,跨平台能力一般。

*Protobuf: 是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。
*Lua: 用来配置cartographer的各项参数。

cartographer的官网可以找到整体流程图:

在这里插入图片描述

 该流程图简单表示了算法内部的数据流程,实际使用的类要比流程图中多一些。
 根据我的总结,cartographer的类分层顺序为:map_builder->global_trajectory_builder->local_trajectory_builder
 这其中包含了2d和3d两种情况,分别实例化2d和3d的相关类。(todo: 列出相关类)
 为什么要有trajectory的概念呢?这正是cartographer的伟大之处,它支持多次建图,和純定位(pure localization),同时稍加改进,cartographer将可以解决slam中的某些long-term问题。即同一场景不同时间建图时的场景变化的问题,在历史地图上进行增量建图的问题。这一切都得益于trajectory的概念。
Global_slam负责整张map的维护,包括回环检测和后端优化。
Local_slam负责submap的生成,前端的算法。

 在cartographer_ros中最主要的是在node_main.cpp中:

 1.创建一个cartographer的map_builder,此类是建图的基础,几乎所有功能都在该类内部:

auto map_builder =
      cartographer::common::make_unique<cartographer::mapping::MapBuilder>(
          node_options.map_builder_options);

 2. 创建一个node,并将map_builder传入node中:

Node node(node_options, std::move(map_builder), &tf_buffer);

 3. 如果有需要载入的pbstream文件,进行文件读取和数据反序列化:

 if (!FLAGS_load_state_filename.empty()) {
    node.LoadState(FLAGS_load_state_filename, FLAGS_load_frozen_state);
  }

 4. 使用默认的topic创建trajectory:

  if (FLAGS_start_trajectory_with_default_topics) {
    node.StartTrajectoryWithDefaultTopics(trajectory_options);
  }

 5. 运行ros的回调,即订阅topics的过程:

  ::ros::spin();

 至此,启动算法的全部流程完成,还有两个结束建图时运行的函数:

  node.FinishAllTrajectories();//结束所有的trajectory
  node.RunFinalOptimization();//运行最终优化

在添加trajectory的过程中,分为以下3个步骤,都是非常重要的环节,分布初始化了cartographerExtrapolatorSensorSamplers,这两个功能都是cartographer自带的;第三个是基于ros的topic订阅,在ros::spin()的作用下订阅topics:

  /// 1
  AddExtrapolator(trajectory_id, options);
  /// 2
  AddSensorSamplers(trajectory_id, options);
  /// 3
  LaunchSubscribers(options, topics, trajectory_id);

关于cartographer的时间

 注意!cartographer内部使用的时间为:::cartographer::common::Time ,是UTC时间不是Unix时间,除此之外还与ROS的time不同。
 ROS的time使用的是seconds + nano-seconds,而 ::cartographer::common::Time 使用的是seconds + 100*nano-seconds,不要混淆。
 所以使用的时候需要进行转换,cartographer 中已经给出了 ::ros::Time ToRos::cartographer::common::Time FromRos 两者之间互相转换的函数。

2:cartographer的外部封装

### Cartographer 文件夹下载与使用说明 #### 一、Cartographer整体结构 Cartographer 是一个开源的 SLAM(Simultaneous Localization and Mapping)库,其源码主要分为两个部分:`cartographer` 和 `cartographer_ros`[^1]。其中: - **`cartographer`** 部分包含了核心算法实现,适用于多种机器人平台。 - **`cartographer_ros`** 则是针对 ROS(Robot Operating System)环境的具体封装。 #### 二、安装与配置流程 为了正确获取并使用 Cartographer 资源,需按照以下方法操作: ##### 1. 安装依赖项 在 Ubuntu 系统上运行以下命令来安装必要的工具链和依赖包: ```bash sudo apt-get update && sudo apt-get install -y \ build-essential \ cmake \ git \ python-wstool \ python-catkin-tools ``` ##### 2. 创建工作空间 创建一个新的 Catkin 工作区用于存储 Cartographer 及其相关组件: ```bash mkdir -p ~/cartographer_ws/src cd ~/cartographer_ws/ catkin_init_workspace src ``` ##### 3. 获取源码 通过 `wstool` 初始化并拉取 Cartographer 源码仓库至本地: ```bash cd ~/cartographer_ws/src/ wstool init . git clone https://github.com/cartographer-project/cartographer_ros.git . -b melodic-devel wstool merge cartographer_ros/cartographer_ros.rosinstall wstool update -j4 ``` ##### 4. 编译项目 完成上述步骤后,在同一目录下执行编译脚本以构建整个工程: ```bash cd ~/cartographer_ws/ ./build.sh ``` 如果遇到任何错误,请确认所有依赖已成功安装,并重新尝试以上过程。 ##### 5. 设置环境变量 每次新开终端前都需要加载对应的设置文件以便访问新安装的功能模块。可以输入如下指令刷新当前会话中的路径映射关系[^3]: ```bash source ~/cartographer_ws/install_isolated/setup.bash ``` #### 三、关键代码位置解析 对于具体功能开发或者调试而言,了解内部逻辑至关重要。例如姿态图优化器实现在二维场景下的处理逻辑位于此文件中[^2]: ```cpp // File Location: src/cartographer/cartographer/mapping/internal/2d/pose_graph_2d.cc void PoseGraph2D::AddSubmap(const proto::Submap& submap_proto) { // Implementation details... } ``` #### 四、总结 综上所述,Cartographer 提供了一套完整的解决方案支持多传感器融合定位建图需求。从基础框架搭建到高级特性定制均具备详尽文档指导用户快速入门实践应用案例分析研究前沿技术方向探索可能性无限广阔前景值得期待!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值