优化方法(Tuning methodology)

原文网站:

优化方法

不幸的是,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_weightrotation_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
  • increaseMAP_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_ratioconstraint_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(扫描匹配)的姿态。然而,从车轮编码器测程往往有一个高不确定性的旋转。在这种情况下,旋转权值可以降低,甚至降到零。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值