上一节介绍cartographer的主要配置参数。
本节会研究一下这些参数改动,对算法的影响和效果,cartographer的调参一直是一个比较复杂的过程。
1,官方调参文档
官方文档
(1):调整本地 SLAM
关闭全局 SLAM 以免干扰本地调优:
POSE_GRAPH.optimize_every_n_nodes = 0
设置正确的子图大小:
TRAJECTORY_BUILDER_2D.submaps.num_range_data
调整CeresScanMatcher,使偏离先验的代价变得高昂:
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 2e2 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 4e2(2):低延迟
为了调整全局 SLAM 以降低延迟,我们减少其计算负载,直到始终跟上实时输入。 低于此阈值,我们不会进一步降低它,而是尝试达到最佳质量。
为了减少全局 SLAM 延迟,我们可以:
降低 optimize_every_n_nodes 增加 MAP_BUILDER.num_background_threads 降低 global_sampling_ratio 降低 constraint_builder.sampling_ratio 增加 constraint_builder.min_score 对于自适应体素滤波器, 降低 .min_num_points, .max_range, 增加 .max_length 增加 voxel_filter_size, submaps.resolution, 降低 submaps.num_range_data 降低 search windows sizes, .linear_xy_search_window, .linear_z_search_window, .angular_search_window 增加 global_constraint_search_after_n_seconds 降低 decrease max_num_iterations
要调整局部 SLAM 以降低延迟,我们可以:
增加 voxel_filter_size 增加 submaps.resolution 对于自适应体素滤波器, 降低 .min_num_points, .max_range, 增加 .max_length 降低 max_range (尤其是如果数据有噪声的话) 降低 submaps.num_range_data(3):纯定位
要调整纯定位模式,我们应该首先启用 TRAJECTORY_BUILDER.pure_localization = true 并大幅度减少 POSE_GRAPH.optimize_every_n_nodes 以接收频繁的结果。 有了这些设置,全局 SLAM 通常会太慢,跟不上。
作为下一步,我们大幅度降低global_sampling_ratio 和 constraint_builder.sampling_ratio 以抵消大量的约束。然后我们按照上面的解释调整参数来保持较低的延迟,直到系统可靠地实时工作。
如果使用单独的里程计源作为本地 SLAM ( ) 的输入,我们还可以调整全局 SLAM 以从这些附加信息中受益。
use_odometry = true
总共有四个参数允许我们在优化中调整局部 SLAM 和里程计的各个权重:
POSE_GRAPH.optimization_problem.local_slam_pose_translation_weight POSE_GRAPH.optimization_problem.local_slam_pose_rotation_weight POSE_GRAPH.optimization_problem.odometry_translation_weight POSE_GRAPH.optimization_problem.odometry_rotation_weight
我们可以根据我们对本地 SLAM 或里程计的信任程度来设置这些权重。默认情况下,里程计被加权到类似于局部 slam(扫描匹配)姿势的全局优化中。然而,车轮编码器的里程计通常在旋转中具有很高的不确定性。在这种情况下,可以减少旋转重量,甚至可以减少到零。
2:常用的参数
以revo_lds.lua为例:
MAP_BUILDER.use_trajectory_builder_2d = true TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35 TRAJECTORY_BUILDER_2D.min_range = 0.3 TRAJECTORY_BUILDER_2D.max_range = 8. TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1. TRAJECTORY_BUILDER_2D.use_imu_data = false TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1 TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10. TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1 POSE_GRAPH.optimization_problem.huber_scale = 1e2 POSE_GRAPH.optimize_every_n_nodes = 35 POSE_GRAPH.constraint_builder.min_score = 0.65
3:调参效果
这里推荐火种源码的Cartographer调参
分析了下面参数单独调参后的效果变化和资源消耗
submap.num_range_data real_time_correlative_scan_matcher.rotation_delta_cost_weiht bool use_online_correlative_scan_matching Ceres.POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher.branch_and_bound_depth real_time_correlative_scan_matcher.real_time_correlative_scan_matcher.linear_search_window real_time_correlative_scan_matcher.real_time_correlative_scan_matcher.angular_search_window real_time_correlative_scan_matcher( translation_delta_cost_weight)/(rotation_delta_cost_weight)
4:调参总结
--一个子图插入多少个节点,根据laser和运动速度进行具体的调整 TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35. --雷达的最大最小距离,根据雷达硬件设定 TRAJECTORY_BUILDER_2D.min_range = 0.3 TRAJECTORY_BUILDER_2D.max_range = 100. --使用多高以上的点云,单线的时候不要设置,多线防止打到地面上的点干扰建图 TRAJECTORY_BUILDER_2D.min_z = 0.2 --体素滤波参数 TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.02 --ceres地图的扫描,平移,旋转的权重,影响建图效果,其他基本上是影响计算量等 --扫描匹配点云和地图匹配程度,值越大,点云和地图匹配置信度越高 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.occupied_space_weight = 10. --残差平移、旋转分量,值越大,越不相信和地图匹配的效果,而是越相信先验位姿的结果 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1. --如果imu不好,接入后地图旋转厉害,可以将这里的旋转权重减小 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 1. -- 2倍的num_range_data以上 POSE_GRAPH.optimize_every_n_nodes = 70. -- 如果添加的约束与潜在约束的比例低于此比例,则将添加约束 POSE_GRAPH.constraint_builder.sampling_ratio = 0.3 -- 在子图附近考虑姿势的阈值,大于这个值将被略过 POSE_GRAPH.constraint_builder.max_constraint_distance = 15. -- 回环检测阈值,如果不稳定有错误匹配,可以提高这两个值,场景重复可以降低或者关闭回环 POSE_GRAPH.constraint_builder.min_score = 0.55 POSE_GRAPH.constraint_builder.global_localization_min_score = 0.60
【完】
在前面的文章中,介绍了数据的发布,和参数配置,下一节就开始介绍使用自己的数据,在cartographer进行建图和定位。



