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