Cartographer 源码解析1.2 —— 代码结构

 *转载请注明出处 @梦凝小筑

1.2 Cartographer 源码软件结构

    Cartographer 的源码中,主要有两大部分:

    1,Cartographer 算法核心代码,在Cartographer文件夹中,

    2,Cartographer 在 ros 平台的接口,在Cartographer_ros文件夹中

    *    还有一个ceres-solver google 的开源 优化库 ,用来求解各种优化问题 ,这里不介绍。

    软件结构如图所示:

解析:

(1)Cartographer_ros

作用:Cartographer 在 ros 平台的接口 , 启动rosj节点、读取来自传感器数据、处理并将数据上传给核心Cartographer核心算法部分、载入外部参数、初始化Extrapolator等

模块:Options、node、MapBuilderBridge、SensorBridge、TfBridge

Options:

    主要代码文件:node_option.cc 、node_option.h 、trajectory_options.cc 、trajectory_options.h 

    功能:

  NodeOptions node_options;//!定义Cartographer最初级选项
  TrajectoryOptions trajectory_options;//!定义建图的一些设置参数

  //!LoadOptions从外部载入参数,并赋值给 node_options和 trajectory_options
  //!输入参数 有launch文件中导入,分别是参数文件的路径和文件名
  std::tie(node_options, trajectory_options) =
      LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);

node:

    主要代码文件:node.cc 、node.h

    功能:

    Node::LoadState  cartographer参数载入的入口

  //!调用MapBuilderBridge.LoadState
  map_builder_bridge_.LoadState(state_filename, load_frozen_state);

    Node::StartTrajectoryWithDefaultTopics 建图前的设置

  CHECK(ValidateTrajectoryOptions(options));
  //!建图前的设置
  AddTrajectory(options, DefaultSensorTopics());

    Node::AddTrajectory

int Node::AddTrajectory(const TrajectoryOptions& options,
                        const cartographer_ros_msgs::SensorTopics& topics) {
  const std::set<cartographer::mapping::TrajectoryBuilderInterface::SensorId>
      expected_sensor_ids = ComputeExpectedSensorIds(options, topics);//!预期id

  //!根据参数初始化MapBuilderBridge
  //!MapBuilderBridge map_builder_bridge_ GUARDED_BY(mutex_);
  const int trajectory_id =
      map_builder_bridge_.AddTrajectory(expected_sensor_ids, options);
  AddExtrapolator(trajectory_id, options);//!设置外推器的参数
  AddSensorSamplers(trajectory_id, options);
  LaunchSubscribers(options, topics, trajectory_id);//!消息订阅
  wall_timers_.push_back(node_handle_.createWallTimer( //! ros 计时器
      ::ros::WallDuration(kTopicMismatchCheckDelaySec),
      &Node::MaybeWarnAboutTopicMismatch, this, /*oneshot=*/true));
  for (const auto& sensor_id : expected_sensor_ids) {
    subscribed_topics_.insert(sensor_id.id);
  }
  return trajectory_id;
}

    Node::ComputeExpectedSensorIds

    Node::AddExtrapolator

    Node::AddSensorSamplers

    Node::LaunchSubscribers  (*重要) 定义topic订阅器,订阅各个传感器信息

 

MapBuilderBridge:

----持续更新----

 

 

 

 

 

 

 

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cartographer 是一款 Google 开的用于实时构建 2D 和 3D 室内地图的工具,主要用于在机器人等移动设备上进行定位和建图任务。本文将对 Cartographer代码进行分析解读,以帮助读者更好地理解该工具的实现原理。 1. 结构 Cartographer码分为多个部分,包括: - cartographer:主要代码库,包含地图构建、局部地图匹配、位姿估计等核心功能。 - cartographer_ros:ROS wrapper,将 cartographer 代码库与 ROS 框架进行了整合,提供了 ROS 接口。 - cartographer_rviz:RViz 插件,用于可视化展示地图、轨迹等信息。 - cartographer_android:Android 版本,用于在 Android 系统上运行 Cartographer。 2. 核心算法 Cartographer 采用了多种算法来实现室内地图的构建和定位,其中比较重要的算法包括: - 位姿图优化(Pose Graph Optimization):通过对传感器数据进行多次优化,得到机器人在运动过程中的位置和方向信息。 - 实时建图(Real-Time Mapping):使用激光雷达等传感器,实时获取机器人周围环境的信息,构建室内地图。 - 局部地图匹配(Local Submap Matching):将当前传感器数据与已构建的局部地图进行匹配,从而得到更准确的位置信息。 - 点云滤波(Point Cloud Filtering):将激光雷达获取的点云数据进行滤波处理,去除噪声和无效数据。 3. 关键函数解析 以下是 Cartographer 中比较重要的几个函数的解析: - cartographer/mapping/internal/pose_graph_2d.cc: PoseGraph2D::AddNode():向位姿图中添加新的节点,包括节点 ID、位姿信息等。 - cartographer/mapping/internal/pose_graph_2d.cc: PoseGraph2D::AddConstraint():向位姿图中添加新的约束,包括约束类型、起始和终止节点 ID、约束值等。 - cartographer/mapping/internal/scan_matching/ceres_scan_matcher.cc: CeresScanMatcher::Match():使用 Ceres 库实现激光雷达数据与局部地图的匹配过程。 - cartographer/mapping/internal/3d/optimization/optimization_problem_3d.cc: OptimizationProblem3D::Solve():使用 Ceres 库实现位姿图优化过程,得到机器人在运动过程中的位置和方向信息。 - cartographer/mapping/internal/3d/scan_matching/real_time_correlative_scan_matcher_3d.cc: RealTimeCorrelativeScanMatcher3D::Match():实时建图过程中使用的一种激光雷达数据与局部地图的匹配算法。 4. 开发环境 Cartographer 的开发环境需要使用 Google 推荐的 Bazel 构建系统,以及 C++11 编译器和 ROS 框架。具体的开发环境搭建和编译过程可以参考 Cartographer 的官方文档。 5. 总结 Cartographer 是一款非常优秀的室内地图构建和定位工具,在机器人、自动驾驶等领域有着广泛的应用。本文对 Cartographer代码进行了分析解读,希望能够帮助读者更好地理解该工具的实现原理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值