Cartographer总结(1:整体框架)

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的外部封装

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cartographer_ros 是一个在 ROS 中使用 Google Cartographer 进行 2D 和 3D SLAM 的软件包。它提供了一个 ROS 节点,可以将 Cartographer 的输出与 ROS 生态系统中的其他软件包集成起来。 Cartographer_ros 的源代码框架如下: 1. launch 文件:Cartographer_ros 使用 launch 文件来配置和启动 ROS 节点。launch 文件包括 cartographer.launch、demo_backpack_2d.launch、demo_backpack_3d.launch 等。 2. ROS 节点:Cartographer_ros 的主要节点是 cartographer_node,它负责运行 Cartographer,并将数据发布到 ROS 话题上。cartographer_node 本身是由多个模块组成的,每个模块负责处理不同的任务。 3. ROS 话题:cartographer_node 将数据发布到 ROS 话题上,这些话题包括激光雷达数据、里程计数据、地图数据等。 4. Cartographer 模块:CartographerCartographer_ros 的核心部分,它包括了多个模块,如 sensor_bridge、mapping、localization 等。这些模块负责处理传感器数据、建立地图和定位机器人。 5. ROS 服务:Cartographer_ros 还提供了一些 ROS 服务,比如 start_trajectory、finish_trajectory 等,这些服务可以用于控制 Cartographer 的运行。 6. 消息定义:Cartographer_ros 使用了自定义的消息类型,如 cartographer_ros_msgs/TrajectoryState、cartographer_ros_msgs/SubmapList 等。 总的来说,Cartographer_ros 的源代码框架是基于 ROS 架构设计的,它通过 ROS 节点、话题和服务来实现 Cartographer 的集成和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值