上一节介绍cartographer的主要配置参数。
本节会研究一下这些参数改动,对算法的影响和效果,cartographer的调参一直是一个比较复杂的过程。
官方文档
关闭全局 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
为了调整全局 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
要调整纯定位模式,我们应该首先启用 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(扫描匹配)姿势的全局优化中。然而,车轮编码器的里程计通常在旋转中具有很高的不确定性。在这种情况下,可以减少旋转重量,甚至可以减少到零。
以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
这里推荐火种源码的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)
--一个子图插入多少个节点,根据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进行建图和定位。