上一节介绍了路标Landmark数据的订阅和发布,各类数据的发布和订阅基本阐述完毕。

本节会介绍cartographer的主要配置参数,研究这些参数的使用和对算法的影响。

目录

1,map_builder.lua

2,pose_graph.lua

3,trajectory_builder.lua

4,trajectory_builder_2d.lua


首先还是得回到Ros运行demo(第二节)的launch脚本上。 launch脚本中可以看到demo所用的配置文件是【backpack_2d.lua】

而backpack_2d.lua在一开始通过include语句加载了map_builder和trajectory_builder的配置:

  1.     include "map_builder.lua"
  2.     include "trajectory_builder.lua"

所以从这两个配置文件先入手


1,map_builder.lua

从名字可以看出【map_builder.lua】是对于类MapBuilder的参数配置。具体参数如下:

  1. include "pose_graph.lua"
  2. MAP_BUILDER = {
  3. use_trajectory_builder_2d = false, --使用2d轨迹
  4. use_trajectory_builder_3d = false, --使用3d轨迹
  5. num_background_threads = 4, --核心线程数
  6. pose_graph = POSE_GRAPH, --位置图赋值
  7. collate_by_trajectory = false, --是否根据轨迹构建修正器
  8. }

2,pose_graph.lua

【map_builder.lua 】中引入了【pose_graph.lua】,【pose_graph.lua】是全局位姿优化。具体参数如下:

  1. POSE_GRAPH = {
  2. optimize_every_n_nodes = 90, --每次整体优化间隔nodes
  3. constraint_builder = {
  4. sampling_ratio = 0.3, --全局约束采样比率(nodes)
  5. max_constraint_distance = 15., --全局约束最大间距(当前node与当前submap之间的距离)
  6. min_score = 0.55, --全局约束当前最小得分(当前node与当前submap的匹配得分)
  7. global_localization_min_score = 0.6, --全局约束全局最小得分(当前node与全局submap的匹配得分)
  8. loop_closure_translation_weight = 1.1e4,--闭环检测平移权重
  9. loop_closure_rotation_weight = 1e5, --闭环检测旋转权重
  10. log_matches = true, --是否打开直方图约束
  11. fast_correlative_scan_matcher = {
  12. linear_search_window = 7., --fast_CSM匹配搜索距离
  13. angular_search_window = math.rad(30.),--fast_CSM匹配搜索角度
  14. branch_and_bound_depth = 7, --fast_CSM分支定界深度
  15. },
  16. ceres_scan_matcher = {
  17. occupied_space_weight = 20., --ceres_scan匹配占据空间权重
  18. translation_weight = 10., --ceres_scan匹配平移权重
  19. rotation_weight = 1., --ceres_scan匹配旋转权重
  20. ceres_solver_options = {
  21. use_nonmonotonic_steps = true, --是否使用梯度下降策略
  22. max_num_iterations = 10, --最大迭代次数
  23. num_threads = 1, --使用线程数
  24. },
  25. },
  26. fast_correlative_scan_matcher_3d = {
  27. branch_and_bound_depth = 8,
  28. full_resolution_depth = 3,
  29. min_rotational_score = 0.77,
  30. min_low_resolution_score = 0.55,
  31. linear_xy_search_window = 5.,
  32. linear_z_search_window = 1.,
  33. angular_search_window = math.rad(15.),
  34. },
  35. ceres_scan_matcher_3d = {
  36. occupied_space_weight_0 = 5.,
  37. occupied_space_weight_1 = 30.,
  38. translation_weight = 10.,
  39. rotation_weight = 1.,
  40. only_optimize_yaw = false,
  41. ceres_solver_options = {
  42. use_nonmonotonic_steps = false,
  43. max_num_iterations = 10,
  44. num_threads = 1,
  45. },
  46. },
  47. },
  48. matcher_translation_weight = 5e2, --匹配平移约束(当前submap与在当前submap内的某个node)
  49. matcher_rotation_weight = 1.6e3, --匹配旋转约束(当前submap与在当前submap内的某个node)
  50. optimization_problem = {
  51. huber_scale = 1e1, --Huber因子(与离群值(错误的数据)对整体的影响正相关)。
  52. acceleration_weight = 1e3, --IMU加速度的权重
  53. rotation_weight = 3e5, --IMU旋转项的权重
  54. local_slam_pose_translation_weight = 1e5, --平移约束权重(前后两个node之间的局部观测与全局优化)
  55. local_slam_pose_rotation_weight = 1e5, --旋转约束权重(前后两个node之间的局部观测与全局优化)
  56. odometry_translation_weight = 1e5, --平移约束权重(前后两个node之阿的局部观测与里程计观测)
  57. odometry_rotation_weight = 1e5, --旋转约束权重(前后两个node之阿的局部观测与里程计观测)
  58. fixed_frame_pose_translation_weight = 1e1,
  59. fixed_frame_pose_rotation_weight = 1e2,
  60. fixed_frame_pose_use_tolerant_loss = false,
  61. fixed_frame_pose_tolerant_loss_param_a = 1,
  62. fixed_frame_pose_tolerant_loss_param_b = 1,
  63. log_solver_summary = false, --是否记录Ceres全局优化的结果
  64. use_online_imu_extrinsics_in_3d = true, --是否在线标定imu的外参
  65. fix_z_in_3d = false,
  66. ceres_solver_options = {
  67. use_nonmonotonic_steps = false, --是否使用梯度下降策略
  68. max_num_iterations = 50, --最大迭代次数
  69. num_threads = 7, --使用线程数
  70. },
  71. },
  72. max_num_final_iterations = 200, --建图结束后最终优化迭代次数
  73. global_sampling_ratio = 0.003, --全局地图匹配约束采样比率(nodes)
  74. log_residual_histograms = true, --是否输出残差直方图
  75. global_constraint_search_after_n_seconds = 10., --全局匹配间隔时长
  76. -- overlapping_submaps_trimmer_2d = {
  77. -- fresh_submaps_count = 1,
  78. -- min_covered_area = 2,
  79. -- min_added_submaps_count = 5,
  80. -- },
  81. }

3,trajectory_builder.lua

从名字可以看出【trajectory_builder.lua】是对于类TrajectoryBuilder的参数配置。具体参数如下:

  1. include "trajectory_builder_2d.lua"
  2. include "trajectory_builder_3d.lua"
  3. TRAJECTORY_BUILDER = {
  4. trajectory_builder_2d = TRAJECTORY_BUILDER_2D, --2d轨迹赋值
  5. trajectory_builder_3d = TRAJECTORY_BUILDER_3D, --3d轨迹赋值
  6. -- pure_localization_trimmer = {
  7. -- max_submaps_to_keep = 3,
  8. -- },
  9. collate_fixed_frame = true, --是否通过固定帧修正
  10. collate_landmarks = false, --是否通过反光板修正
  11. }

4,trajectory_builder_2d.lua

【trajectory_builder_2d.lua 】中引入了【trajectory_builder_2d.lua】【trajectory_builder_3d.lua】,两个配置内容是大致类似的,但各自有些特有参数。这里主要说明2D轨迹的参数【trajectory_builder_2d.lua】。具体参数如下:

  1. TRAJECTORY_BUILDER_2D = {
  2. use_imu_data = true, --是否使用imu数据
  3. min_range = 0., --激光的最近距离
  4. max_range = 30., --激光的最远距离
  5. min_z = -0.8, --激光的最小高度
  6. max_z = 2., --激光的最大高度
  7. missing_data_ray_length = 5., --激光的默认数值
  8. num_accumulated_range_data = 1, --单个Node节点累积激光帧数
  9. voxel_filter_size = 0.025, --激光的网格滤波大小
  10. adaptive_voxel_filter = { --自适应滤波
  11. max_length = 0.5, --网格滤波的大小
  12. min_num_points = 200, --最小点云数据
  13. max_range = 50., --最远点云距离
  14. },
  15. loop_closure_adaptive_voxel_filter = { --闭环检测自适应滤波
  16. max_length = 0.9,
  17. min_num_points = 100,
  18. max_range = 50.,
  19. },
  20. use_online_correlative_scan_matching = false, --是否使用CSM激光匹配
  21. real_time_correlative_scan_matcher = { --快速CSN激光匹配
  22. linear_search_window = 0.1, --平移搜索范围
  23. angular_search_window = math.rad(20.), --角度搜索范围
  24. translation_delta_cost_weight = 1e-1, --平移代价权重
  25. rotation_delta_cost_weight = 1e-1, --旋转代价权重
  26. },
  27. ceres_scan_matcher = { --ceres优化激光匹配
  28. occupied_space_weight = 1., --占据空间权重
  29. translation_weight = 10., --平移权重
  30. rotation_weight = 40., --旋转权重
  31. ceres_solver_options = {
  32. use_nonmonotonic_steps = false, --是否使用梯度下降策略
  33. max_num_iterations = 20, --最大迭代次数
  34. num_threads = 1, --使用线程数
  35. },
  36. },
  37. motion_filter = { --移动滤波
  38. max_time_seconds = 5., --2帧激光最小间隔
  39. max_distance_meters = 0.2, --2帧激光最小距离
  40. max_angle_radians = math.rad(1.), --2帧激光最小角度
  41. },
  42. -- TODO(schwoere,wohe): Remove this constant. This is only kept for ROS.
  43. imu_gravity_time_constant = 10., --imu的重力常数
  44. pose_extrapolator = {
  45. use_imu_based = false, --是否使用3d初始化位姿预估器
  46. constant_velocity = {
  47. imu_gravity_time_constant = 10., --imu的重力常数
  48. pose_queue_duration = 0.001, --位姿时间间隔
  49. },
  50. imu_based = {
  51. pose_queue_duration = 5., --位姿时间间隔
  52. gravity_constant = 9.806, --重力常数
  53. pose_translation_weight = 1., --位姿偏移权重
  54. pose_rotation_weight = 1., --位姿旋转权重
  55. imu_acceleration_weight = 1., --IMU加速度权重
  56. imu_rotation_weight = 1., --IMU旋转权重
  57. odometry_translation_weight = 1., --里程计平移权重
  58. odometry_rotation_weight = 1., --里程计旋转权重
  59. solver_options = {
  60. use_nonmonotonic_steps = false;
  61. max_num_iterations = 10;
  62. num_threads = 1;
  63. },
  64. },
  65. },
  66. submaps = {
  67. num_range_data = 90, --子图中Node的数量
  68. grid_options_2d = {
  69. grid_type = "PROBABILITY_GRID", --概率栅格地图
  70. resolution = 0.05, --分辨率
  71. },
  72. range_data_inserter = {
  73. range_data_inserter_type = "PROBABILITY_GRID_INSERTER_2D",
  74. probability_grid_range_data_inserter = {
  75. insert_free_space = true, --是否改变改变占用网格中的概率。
  76. hit_probability = 0.55, --hit(占用) 时的概率
  77. miss_probability = 0.49, --miss(空闲) 时的概率
  78. },
  79. tsdf_range_data_inserter = {
  80. truncation_distance = 0.3,
  81. maximum_weight = 10.,
  82. update_free_space = false,
  83. normal_estimation_options = {
  84. num_normal_samples = 4,
  85. sample_radius = 0.5,
  86. },
  87. project_sdf_distance_to_scan_normal = true,
  88. update_weight_range_exponent = 0,
  89. update_weight_angle_scan_normal_to_ray_kernel_bandwidth = 0.5,
  90. update_weight_distance_cell_to_hit_kernel_bandwidth = 0.5,
  91. },
  92. },
  93. },
  94. }

以上就是cartographer中的主要配置参数,这里只是简单的介绍说明,要更加深入的了解还需要到实际案例中使用或者查看其在代码中的功能作用。

【完】


下一节就结合demo案例一起说明,在Ros中使用这些参数时实际的配置及效果。

【cartographer_ros】七: 主要配置参数说明的更多相关文章

  1. 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍  <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...

  2. MySql配置参数很全的Mysql配置参数说明

    MySql配置参数 很全的Mysql配置参数说明 1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很 ...

  3. Connect to Database Using Custom params链接数据库配置参数说明

    使用RF的关键字Connect to Database Using Custom params链接数据库,对应的参数说明: a)     第一个参数我使用的是cx_Oracle,就写这个 b)     ...

  4. CentOS Linux系统下安装Redis过程和配置参数说明

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/102.html?1455869303 安装过程: 代码如下: wget h ...

  5. Hadoop学习之--Capaycity Scheduler配置参数说明

    以下列举出来的是capacity关于queue和user资源使用量相关的参数说明: mapred.capacity-scheduler.queue.xxx.capacity: 队列的资源容量百分比,所 ...

  6. nginx性能配置参数说明:

    nginx的配置:main配置段说明一.正常运行的必备配置: 1.user username [groupname]; 指定运行worker进程的用户和组 2.pid /path/to/pidfile ...

  7. Hystrix使用说明,配置参数说明

    一.什么情况下会触发fallback方法? 名字 描述 触发fallback EMIT 值传递 NO SUCCESS 执行完成,没有错误 NO FAILURE 执行抛出异常 YES TIMEOUT 执 ...

  8. Kafka配置参数说明

    配置文件目录:/usr/local/kafka/config配置文件server.propertis参数说明:broker.id=0每一个broker在集群中的唯一标识,要求是正数,当该服务器的IP地 ...

  9. Nginx配置参数说明

    一.主配置段1.正常运行必备的配置#运行用户和组,组身份可以省略user nginx nginx; #指定nginx守护进程的pid文件pid path/to/nginx.pid; #指定所有work ...

随机推荐

  1. Spring从入门到源码—IOC基本使用(二)

    1.spring_helloworld 使用maven的方式来构建项目(Mavaen) 添加对应的pom依赖 pom.xml <dependencies> <!-- https:// ...

  2. 推荐系统 TOP K 评价指标

    目录 符号说明 示例数据 一.Hit Rate 二.Recall 三.NDCG 符号说明 \(top\_k\): 当前用户预测分最高的k个items,预测分由高到低排序 $pos$: 当前用户实际点击 ...

  3. WorkCount

    此项目码云链接 软件测试方法和技术第二次作业 1 作业内容 根据WordCount的需求描述,先编程实现,再编写单元测试,最后撰写博客.至少完成需求中的基本功能. 2 WordCount需求说明 Wo ...

  4. 【CSAPP】Attack Lab实验笔记

    attacklab这节玩的是利用一个字符串进行缓冲区溢出漏洞攻击,就小时候想象中黑客干的事儿. 做题的时候好几次感叹这些人的脑洞,"这都可以攻击?还能这么注入?这还可能借力打力?" ...

  5. 干货 | 亿级Web系统负载均衡几种实现方式

    一个执着于技术的公众号 负载均衡(Load Balance)是集群技术(Cluster)的一种应用技术.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web ...

  6. 多线程07:async、future、packaged_task、promise

    async.future.packaged_task.promise 本节内容需要包含头文件:#include <future> 一.std::async. std::future 创建后 ...

  7. 零基础学Java第三节(基本输入输出)

    本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...

  8. awk内建函数

    内建函数 length() 获得字符串长度 cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 25 ...

  9. PostGIS 扩展创建失败原因调查

    Issue 升级 PostgreSQL 9.1 的一个集群,由于该集群用到了 PostGIS,在升级 PostgreSQL 时也需要升级一下 PostGIS.PostGIS 相关软件安装好后,在 Po ...

  10. 112_Power Pivot 销售订单按 sku 订单类型特殊分类及占比相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 经过了一个双十一后,天天面对的都是订单.于是有了关于销售订单按sku类型分类的需求. 说明:(暂且不讨论这样分类 ...