草庐IT

【cartographer_ros】八: 官方Demo参数配置和效果

CloudFlame 2023-03-28 原文

上一节介绍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_ratioconstraint_builder.sampling_ratio 以抵消大量的约束。然后我们按照上面的解释调整参数来保持较低的延迟,直到系统可靠地实时工作。

(4):全局优化中的里程计

如果使用单独的里程计源作为本地 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进行建图和定位。

有关【cartographer_ros】八: 官方Demo参数配置和效果的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  5. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  6. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  10. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

随机推荐