运行 Cartographer的配置参数比较重要,稍微不注意就会报错,例如一个常见的错误类型:  

[ERROR] [1602741280.449037435, 153.231000000]: Ignoring transform from authority "unknown_publisher" with frame_id and child_frame_id  "odom" because they are the same

  类似错误大多是因为配置文件设置的不正确。 以turtlebot3配置文件turtlebot3_lds_2d.lua为例:  


include "map_builder.lua"
include "trajectory_builder.lua"
 
options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
  tracking_frame = "base_link",
  published_frame = "odom",
  odom_frame = "odom",
  provide_odom_frame = true,
  publish_frame_projected_to_2d = false,
  use_odometry = false,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 30e-3,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
…………后面省略

  其中:  

  • map_frame ="map"为 cartographer中使用的全局坐标系,也是位姿的父坐标系,应当保持默认。
  • 而tracking_frame="base_link","base_link"意为机器人中心坐标系,这个可以做修改。tracking_frame指的
  • 是由SLAM算法追踪的ROS坐标系的ID,如果在使用IMU的情况下,也可以(也最好)替换成“imu_link”。
  • published_frame="odom",这个也不固定。这个可以被设置为odom,意为里程计坐标系,也可以被设置为base_link。
  • 而odom_frame不见得启用,只有在下一个选项provide_odom_frame为true时才启用,这个一般被设为odom,也是里程计的坐标系的名称。
  • 而provide_odom_frame的作用是,使得坐标系之间经过如下转换以后再发布:published_frame->odom_frame->map_frame。如果不是true,则是 published_frame ->map_frame进行发布。

  如果published_frame和odom_frame都被设置为odom,并且provide_odom_frame=true,那么这样才会提示之前的错误:  

[ERROR] [1602741280.449037435, 153.231000000]: Ignoring transform from authority "unknown_publisher" with frame_id and child_frame_id  "odom" because they are the same

  这个错误本质上没有什么太大的影响,我更觉得这算一个Warnning,但是终端里红红的看起来很不舒服,如果要解决,则有两种办法:   1.第一种,把published_frame设置为base_link,这样两者就不是“the same”的关系了。   2.第二种,把provide_odom_frame=true改为false,关掉之间的转换即可。    

  • 继续讲解描述文件:use_odometry的意思是,如果为true,则会订阅“odom”这个topic的的nav_msgs/Odometry消息。
  • use_nav_sat = false,意为是否使用GPS数据;
  • use_landmarks,意为是否使用landmark;
  • num_laser_scans=1这个指的是雷达的数量,也就是订阅的激光雷达的topic的数量,例如在“scan”的topic上订阅sensor_msgs/LaserScan信息,或者在多个激光扫描仪上订阅话题“scan_1”,“scan_2”等等。
  • num_multi_echo_laser_scans=0,这个是个高级的传感器,其值订阅的多回波激光扫描的topic的数量,例如在一个激光扫描仪的“echoes”话题上订阅sensor_msgs/MultiEchoLaserScan。
  • num_subdivisions_per_laser_scan=1,这个指的是将每个接收到的(多回波)激光扫描分成的点云数,说白了就是把激光一帧的数据拆分成几次发出来,正常为1即可。
  • num_point_clouds=0,这个指的是要订阅的点云话题的数量,主要是在points2的topic上订阅sensor_msgs/PointCloud2。
  • lookup_transform_timeout_sec=0.2s,这个指使用tf2查找变换的超时秒数,默认都为0.2s。
  • submap_publish_period_sec=0.3s,这个指发布submap的间隔,默认为 0.3s。cartographer与其他slam最大的一个不同点就是采用了submap概念,即采用一定数量的laser scan组成submap,然后再由n个submap组成整个地图空间。
  • pose_publish_period_sec,这个不用细说了,看名字就知道了。意为发布位姿的间隔,单位为秒。
  • trajectory_publish_period_sec= 30e-3 为发布轨迹的持续时间。
  • rangefinder_sampling_ratio = 1.,odometry_sampling_ratio = 1.,fixed_frame_pose_sampling_ratio = 1., imu_sampling_ratio = 1.,landmarks_sampling_ratio = 1.,这些是观测的权重比,当某个观测不太靠谱的时候,可以把1改为较小的权重,例如0.5,从而减小对整体优化的错误影响。
  • MAP_BUILDER.use_trajectory_builder_2d = true 指的是具体用的是2D还是3D的SLAM。
  • TRAJECTORY_BUILDER_2D.use_imu_data = false 意为不使用IMU。如果没有IMU这里不要写成true。对于3D雷达没有这个选项,我猜可能是因为3D slam本身必须使用IMU? 这块我暂时不太了解,回头补充。
  • TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true,这个的含义是,是否使用实时回环检测来进行前端的扫描匹配。最好是弄成true,这样比较准确。关于这点,我借用博主李太白lx的描述:

 

如果这项为false,则扫描匹配使用的是通过前一帧位置的先验,将当前scan与之前做对比,使用 高斯牛顿法迭代求解最小二乘问题求得当前scan的坐标变换。   如果这项为true,则使用闭环检测的方法,将当前scan在一定的搜索范围内搜索,范围为设定的平移距离及角度大小,然后在将scan插入到匹配的最优位置处。这种方式建图的效果非常好,即使建图有漂移也能够修正回去,但是这个方法的计算复杂度非常高,非常耗cpu。

  当然,实际的参数并不止上述介绍的,但是大多与算法原理和调优有关,写成不同的值一般不会引起报错,因此之后将放在别的文章中进行介绍。