参考官网 Tuning methodology
参数的物理含义
TRAJECTORY_BUILDER_nD.min_range
TRAJECTORY_BUILDER_nD.max_range
激光雷达数据的有效范围,需根据传感器参数和机器人工作场景确定。
TRAJECTORY_BUILDER_2D.missing_data_ray_length
当传感器数据超出有效范围最大值时,按此值来处理。默认配置为8m,小于最大距离30m。
TRAJECTORY_BUILDER_2D.max_z
TRAJECTORY_BUILDER_2D.min_z
将3D多线激光雷达的z轴数据,投影至平面,当做2D激光雷达使用。
TRAJECTORY_BUILDER_nD.num_accumulated_range_data
积累到这个数量的点云信息后,执行一次匹配scan_match,将有效点云插入局部地图InsertIntoSubmap().
匹配频率越高(累积数值小)映射畸变越小,每一scan数据越多,越利于匹配。
TRAJECTORY_BUILDER_nD.voxel_filter_size
由于激光雷达的基于原点旋转扫描采样,距离近的障碍物采集数据密集,距离远的障碍物采集点稀疏,为保证远近障碍物权重一致,需做处理。
采用体素滤波器进行降采样机制,使得局部稠密的点变得稀疏。此值越小,得到的数据越稠密,但是计算量越高;此值越大,丢失数据越多,但计算更快。
思考:针对不同性能(分辨率不同,采集频率不同)的激光雷达,这个数值如何设置?
TRAJECTORY_BUILDER_nD.*adaptive_voxel_filter.max_length
TRAJECTORY_BUILDER_nD.*adaptive_voxel_filter.min_num_points
自适应体素滤波器adaptive voxel filter参数配置,自适应得出的参数在配置参数范围内。
TRAJECTORY_BUILDER_2D.use_imu_data
TRAJECTORY_BUILDER_nD.imu_gravity_time_constant
2D SLAM 可选 IMU;3D SLAM 必选 IMU。
CeresScanMatcher:用于高质量的传感器场合;
RealTimeCorrelativeScanMatcher:用于传感器质量较差场合,该算法拥有类似于回环检测的特点,具有环境鲁棒性,但耗费计算资源。
TRAJECTORY_BUILDER_nD.ceres_scan_matcher.translation_weight
TRAJECTORY_BUILDER_nD.ceres_scan_matcher.rotation_weight
这里的权重是指:PoseExtrapolator或者RealTimeCorrelativeScanMatcher的权重;
注意:权重参数无量纲,不同参数的权重不可以相互比较。
TRAJECTORY_BUILDER_nD.ceres_scan_matcher.ceres_solver_options.use_nonmonotonic_steps
含义:bool量,启动非单调置信区域;
TRAJECTORY_BUILDER_nD.ceres_scan_matcher.ceres_solver_options.max_num_iterations
含义:最大迭代步数;
TRAJECTORY_BUILDER_nD.ceres_scan_matcher.ceres_solver_options.num_threads
含义:线程数;
为了防止一个submap中插入太多scan数据,加入motion filter,在移动不明显时丢弃点云数据。
全部条件不超出以下条件,则丢弃。
有效帧的判断阈值参数入下:
TRAJECTORY_BUILDER_nD.motion_filter.max_time_seconds
时间间隔
TRAJECTORY_BUILDER_nD.motion_filter.max_distance_meters
平移距离
TRAJECTORY_BUILDER_nD.motion_filter.max_angle_radians
旋转角度
Submaps有一定数量的range data构成。Submaps越小,内部漂移越小;Submaps越大,越有利于全局定位的回环检测。
TRAJECTORY_BUILDER_nD.submaps.num_range_data
通常为PROBABILITY_GRID格式,可选Truncated Signed Distance Fields (TSDF)格式。
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.grid_type
栅格地图的最小单元odds是依据hits、misses进行更新栅格概率,权重可配置
TRAJECTORY_BUILDER_2D.submaps.range_data_inserter.probability_grid_range_data_inserter.hit_probability
TRAJECTORY_BUILDER_2D.submaps.range_data_inserter.probability_grid_range_data_inserter.miss_probability
2D地图仅有一个分辨率配置项
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.resolution
全局定位优化在后台运行,执行“the optimization problem” 和 “sparse pose adjustment”两项任务,以达到修整submaps之间相对位姿关系的目的。
当一个数量的trajectory nodes被插入地图后,就执行一次全局优化。
POSE_GRAPH.optimize_every_n_nodes
当该参数设置为0时,禁用全局优化功能,仅在调试local slam时才使用。
POSE_GRAPH.constraint_builder.max_constraint_distance
POSE_GRAPH.fast_correlative_scan_matcher.linear_search_window
POSE_GRAPH.fast_correlative_scan_matcher*.angular_search_window
以上这些范围,不是回环检测的匹配范围。
POSE_GRAPH.constraint_builder.sampling_ratio
通过将采样实现限制约束条件的数量和计算量,此值过低会使得约束失效,无法正确回环检测,此值过高或增加计算符合,影响实时性。
POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher.branch_and_bound_depth
使用FastCorrelativeScanMatcher最初步的帧匹配,依赖参数branch_and_bound_depth。
POSE_GRAPH.constraint_builder.min_score
POSE_GRAPH.constraint_builder.ceres_scan_matcher
当FastCorrelativeScanMatcher初步匹配的结果分数高于min_score时,才进入下一步的Ceres Scan Matcher处理。
POSE_GRAPH.constraint_builder.loop_closure_translation_weight
POSE_GRAPH.constraint_builder.loop_closure_rotation_weight
POSE_GRAPH.matcher_translation_weight
POSE_GRAPH.matcher_rotation_weight
POSE_GRAPH.optimization_problem.*_weight
POSE_GRAPH.optimization_problem.ceres_solver_options
在机器人定位场景中,低延时非常重要。
Local SLAM,在前台实时运行,对延迟影响很大;
Global SLAM,运行在后台,处理一系列的子地图,若不能保证实时性,则各子地图间的关系会发生漂移。
降低 global SLAM 延迟, 可采取如下措施:
降低Local SLAM延时,可采取如下措施:
参考Pure Localization in a Given Map段落
在配置文件中使能纯定位功能
TRAJECTORY_BUILDER.pure_localization = true
降低POSE_GRAPH.optimize_every_n_nodes,可增加定位频率;
降低global_sampling_ratio,constraint_builder.sampling_ratio,可降低回环检测频率;
可参考 lower latency(低延时设置);
注意事项:
启动纯定位功能后,submaps.resolution的值需要与加载的地图文件.pbstream分辨率一致。
若系统中有里程计存在,则可通过配置 use_odometry = true 将里程计作为输入。
一共有4个参数配置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
如果外部模块提供了里程信息,则cartographer无需提供里程,则设置:
provide_odom_frame = false;
机器人里程计单元会发布里程信息: odom -> base_foot_print。但是由于长时间的运行后,里程信息会发生漂移,需要修整map -> odom 的关系。
cartographer 会实时跟踪估算base_link相对于map的关系;因为base_foot_print与base_link为固定关系,所以可修正odom相对于map的关系,达到里程计校准的目的。