SLAM-cartographer 概述

cartographer_ros

nodes_graph_demo_2d.jpg

Figure 1: cartographer_node

ROS API reference documentation

配置文件分为三部分。和ros对应的一下参数在 backpack_2d.lua中,LocalSLAM的参数在 trajectory_builder.lua中,GlobalSLAM的参数主要在 pose_graph.lua(通过 map_builder.lua引用) 中。

怎么理解cartographer_ros中的trajectory?

为什么使用多轨迹?topic是怎么订阅的?

cartographer_ros 中我们看到在建图的节点 Node 中有 AddTrajectory 的接口,此外在 Node 中还有一个Service,可以由节点外请求StartTrajectory,再添加一条Trajectory。 这个轨迹到底表示什么?多条轨迹如何存在?在addTrajectory的时候,需要订阅传感器 信息,那那个传感器的信息归属哪条轨迹呢?我们看到在StartTrajectory和 addTrajectory的是时候都是带上TrajectoryOptions和SensorTopics,表明每添加一条轨 迹会带上新轨迹需要的所有参数,最重要的是传感器信息,在订阅传感器的时候,会根据 传感器的个数选择topic,个数超过一个的时候topic的命名规则是<topic>_<num>。

举个例子:trajectory_0的参数中指定laserScan的传感器topic名为laser0,有3个传感 器,那么发布和订阅的topic就是 laser0_1, laser0_2, laser0_3。而trajectory_1的参 数指定laserScan的传感器topic名为laser1,有两个传感器,那么发布和订阅的topic就 是laser1_1, laser1_2。也就是说预先要把topic的命名规定好。关于trajectory对topic 的订阅在函数 Node::ComputeExpectedSensorIds 中确定,topic 的名字在 node_constants.h中,各个topic的数量在 backpack_2d.lua 中配置。

这样做的目的可能是(没有看代码,还有待确认,只是猜测):

  • 多机器人同时进行建图,每条轨迹代表一个机器人的建图轨迹。
  • 多机器人建图之后可以将图合起来进行再次优化。

每条轨迹包含的资源

  • 确定构建该轨迹需要订阅的topic,topic命名方式上面已经说明了。这些传感器资源 组成 expected_sensor_ids。需要注意的是发 布topic的时候要按照这个名字发送。
  • 调用 AddTrajectory 带上expected_sensor_ids 和轨迹相关的参数初始化轨迹需要的 资源。
  • 给该轨迹添加 Extrapolator。
  • 给该轨迹添加传感器的采样器 Samplers。
  • 订阅相关topic。

下面分别说明上面的细致的处理方法。

根据配置确定传感器id

需要处理距离类(SensorType::RANGE)传感器(laser_scan,echo_laser_scan, point_clouds),IMU(SensorType::IMU)传感器,Odometry(SensorType::ODOMETRY), GPS/nav_sat(SensorType::FIXED_FRAME_POSE), LandMark(SensorType::LANDMARK)。

这些传感器有固定的topic名称,配置文件有配置了使用的个数。

  • 当一种传感器只使用一个时,sensor_id 就是topic的名称;
  • 当一种传感器有n个时,senor_id 命名是 <topic>_<id>,id从1开始。

使用传感器配置信息初始化路径

  • 添加TrajectoryBuilder,并附带得到LocalSLAM结果的回调函数。 TrajectoryBuilder包括一个LocalSLAM的 TrajectoryBuilder和一个GlobalSLAM的TrajectoryBuilder。 Global的TrajectoryBuilder会用到Local的TrajectoryBuilder。Global TrajectoryBuilder需要定义pose_graph,用来进行全局的优化。
  • 为轨迹添加sensor_bridge。每条轨迹只能有一个 sensor_bridge。

为Trajectory添加Extrapolator

有两个位姿估计器:Node中有一个;LocalTrajectoryBuilder中有一个。 LocalTrajectorybuilder中的估计器如果配置使用imu则只会在处理imu的时候初始化, 否则只有在处理距离数据的时候初始化。处理odom的时候不会初始化估计器,而且没有 估计器odom数据和距离数据都不会被处理。

一条轨迹只能有一个Extrapolator, 用来估计位姿。 添加对象是 PoseExtrapolator, 带入参数 pose_queue_duration 和 重力加速度常数。 pose_queue_duration表示一个位姿要保存这么久,主要是用来估计线速度和角速度, 然后使用这些速度来推断运动。如果使用IMU和odometry则会改进估计的效果。

为Trajectory添加 SensorSampler

一条轨迹只能有一个SensorSampler, 用来处理传感器数据。使用的参数都在配置文件 中,主要是各种传感器的采样率。

订阅各种topic并指定回调函数

Comments

comments powered by Disqus