原文网站:
优化方法
不幸的是,cartographer调参非常困难。系统有许多参数,其中许多参数相互影响。本调优指南试图通过具体的例子来解释一种原则性的方法。
内置工具
cartographer为SLAM评估提供了内置的工具,对于测量local SLAM质量特别有用。这些工作是与 core cartographer library一起发布的独立可执行文件,因此是独立的,但与漫cartographer_ros
兼容。因此,请前往cartographer阅读文档评估站点cartographer阅读文档评估站点.,以获得概念概述和如何在实践中使用这些工具的指南。
这些工具假设您已经将SLAM状态序列化到.pbstream
文件。通过使用cartographer ROS
调用assets_writer
来序列化状态——有关更多信息,请参阅 Exploiting the map generated by Cartographer ROS.一节。
案例:调整local SLAM
对于本例,涉及提交到cartographer中的Rename ‘submap_transforms’ to follow terminology. 和和提交到cartographer_rosdds a binary that can generate PGM/YAML from a .pbstream. 开始,利用数据集中的包b2-2016-04-27-12-31-41。
在我们的初始配置中,我们看到一些在袋中提前滑落。背包经过德国博物馆的一个斜坡,这违反了二维平面的假设。在激光扫描数据中可以看到,与之相矛盾的信息被传递到SLAM。但这种下滑也表明,我们过于相信点云的匹配,而对其他传感器的忽略相当强烈。我们的目标是通过调优来改善这种情况。
如果我们只查看这个特定的submap,,则错误完全包含在这个submap,中。我们也看到,随着时间的推移,global SLAM发现了一些奇怪的事情,并在一定程度上纠正了它。不过,被破坏的submap,将永远被破坏。
由于这里的问题是submap内部的滑动,所以这是一个Local SLAM问题。因此,让我们关闭global SLAM以避免在调优时造成混乱。
POSE_GRAPH.optimize_every_n_nodes = 0
Correct size of submaps
submap的大小是通过TRAJECTORY_BUILDER_2D.submaps.num_range_data
来配置的。查看本例中的submaps时,它们已经很好地适应了这两个约束,因此我们假设这个参数已经调好了。
Tuning the CeresScanMatcher
在我们的例子中, scan matcher可以自由地向前和向后移动匹配,而不会影响分数。我们想惩罚这种情况下,使扫描匹配支付更多的偏离之前它得到。参数TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight
和rotation_weight
值越大,将结果从先前的位置移开的代价就越大,换句话说:扫描匹配必须在另一个位置生成更高的分数才能被接受。
为了教学的目的,让我们使偏离前真的昂贵:
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1e3
这使优化器(optimizer)可以相当宽松地覆盖扫描匹配器(scan matcher)结果。这一结果导致的姿态接近之前,但不一致的深度传感器和明显打破。Experimenting with this value yields a better result at 2e2
在这里,扫描匹配器使用旋转来稍微打乱结果。
将rotation_weight
设置为4e2
会得到一个合理的结果。
Verification(认证)
为了确保我们没有对这个特定的问题进行调优,我们需要对收集到的其他数据运行配置。在本例中,新参数确实显示了滑动,例如在b2-2016-04-05-14-44-52.bag
的开头。把translation_weight
降低到1e2
。这种设置对于我们想要修复的情况更糟糕,但是不再出现滑动。在将它们检入之前,我们将所有的权值标准化,因为它们只有相对意义。这个调优的结果是PR 428PR 428。一般来说,总是尝试针对平台进行调整,而不是特定的包。
Special Cases(特殊案例)
默认配置和上面的调优步骤主要关注质量。只有在我们达到了良好的质量后,我们才能进一步考虑特殊情况.
Low Latency(低延时)
通过低延迟,我们的意思是在接收到传感器输入后不久,通常在一秒内,就可以获得一个优化的局部位姿,而且全局优化没有积压。在线算法(如机器人定位)需要低延迟。在前台操作的Local SLAM直接影响延迟。Global SLAM建立了一个后台任务队列。当全局SLAM无法保持队列时,漂移可能会无限累积,因此需要调优全局SLAM以便实时工作。
有许多 options可以调优不同的组件以获得更快的速度,我们将它们从推荐的、简单的组件中按顺序列出,并将它们排列到更具侵入性的组件中。
建议一次只探索一个选项,从第一个选项开始。配置参数记录在Cartographer文档中。
为了调优global SLAM以获得更低的延迟,我们减少了它的计算负载,直到与实时输入保持一致。在这个阈值以下,我们不会进一步降低它,而是试图获得尽可能好的质量。为了减少global SLAM延迟,我们可以:
- decrease
optimize_every_n_nodes
- increase
MAP_BUILDER.num_background_threads
up to the number of cores - decrease
global_sampling_ratio
- decrease
constraint_builder.sampling_ratio
- increase
constraint_builder.min_score
- for the adaptive voxel filter(s), decrease
.min_num_points
,
.max_range
, increase.max_length
- increase
voxel_filter_size
,submaps.resolution
, decreasesubmaps.num_range_data
- decrease search windows sizes,
.linear_xy_search_window
,
.linear_z_search_window
,.angular_search_window
- increase
global_constraint_search_after_n_seconds
- decrease
max_num_iterations
调优local SLAM以降低延迟,我们可以
- increase
voxel_filter_size
- increase
submaps.resolution
- for the adaptive voxel filter(s), decrease
.min_num_points
,
.max_range
, increase.max_length
- decrease
max_range
(especially if data is noisy) decrease
submaps.num_range_data
注意,较大的体素会轻微增加扫描匹配分数,作为副作用,因此分数阈值应该相应地增加。
Pure Localization in a Given Map(在给定地图中的纯定位)
纯定位不同于构图。首先,我们期望local和global SLAM的延迟更低。第二,global SLAM通常会在作为地图的冻结轨迹与当前轨迹之间发现大量的相互约束。
为了调优 pure localization,我们首先应该启用TRAJECTORY_BUILDER.pure_localization = true
,并且极力减少POSE_GRAPH.optimize_every_n_nodes
接收频繁的结果。有了这些设置,global SLAM通常会太慢而无法跟上。下一步,我们将大力减少global_sampling_ratio
和constraint_builder.sampling_ratio
用于补偿大量的约束。然后,如前所述,我们调优以降低延迟,直到系统实时可靠地工作。
如果您在pure_localization
中运行,submaps.resolution
分辨率应该与所运行的.pbstream中的子映射的分辨率匹配。使用不同的分辨率目前还没有经过测试,可能无法正常工作。
Odometry in Global Optimization(全局优化中的里程计)
如果使用单独的里程计源作为local SLAM的输入(use_odometry = true
),我们还可以调优global SLAM以从这些额外信息中获益。
在优化过程中,总共有四个参数允许我们调整local 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
我们可以根据我们对local SLAM或里程计的信任程度来设置这些权重。默认情况下,里程计是加权到 global optimization 类似于本地slam(扫描匹配)的姿态。然而,从车轮编码器测程往往有一个高不确定性的旋转。在这种情况下,旋转权值可以降低,甚至降到零。