Cartographer 使用方式与典型场景
四、使用方式与典型场景
Cartographer 的日常使用围绕三件事:建图、保存、纯定位。下面给出两个可以直接改参数跑的配置示例。
示例一,一份精简的 2D 建图 Lua 配置骨架。把它放在 cartographer_ros/configuration_files 下,再用 roslaunch 引用。注意 Lua 里的 include 会把官方默认配置先加载进来,你只需要覆盖关心的那几项:
include "map_builder.lua"
include "trajectory_builder.lua"
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "imu_link",
published_frame = "base_link",
odom_frame = "odom",
provide_odom_frame = true,
publish_frame_projected_to_2d = true,
use_odometry = true,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 1,
num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1,
num_point_clouds = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1.,
landmarks_sampling_ratio = 1.,
}
MAP_BUILDER.use_trajectory_builder_2d = true
MAP_BUILDER.num_background_threads = 4
TRAJECTORY_BUILDER_2D.min_range = 0.12
TRAJECTORY_BUILDER_2D.max_range = 8.0
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.0
TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1
TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.025
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 60
TRAJECTORY_BUILDER_2D.motion_filter.max_time_seconds = 5.0
TRAJECTORY_BUILDER_2D.motion_filter.max_distance_meters = 0.2
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = 0.02
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.55
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.6
return options
示例二,加载已有地图做纯定位。做法是把建图得到的 pbstream 通过 launch 参数加载,并把 TRAJECTORY_BUILDER.pure_localization 置为 true,同时把回环搜索范围收窄。纯定位模式下系统不再扩建地图,只估计位姿,CPU 占用显著下降。对应的启动命令形如:
roslaunch cartographer_ros demo_backpack_2d_localization.launch \
load_state_filename:=$HOME/map.pbstream \
bag_filename:=$HOME/run2.bag
为纯定位优化的配置片段,关键在于收紧搜索窗口以提升速度,并提高定位门限以保证可靠性:
TRAJECTORY_BUILDER.pure_localization_trimmer = {
max_submaps_to_keep = 3,
}
POSE_GRAPH.optimize_every_n_nodes = 20
POSE_GRAPH.constraint_builder.sampling_ratio = 0.3
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.65
POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher.linear_search_window = 7.
POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher.angular_search_window = math.rad(30.)
适用与不适用场景的对照如下。
| 场景类型 | 是否合适 | 说明 |
|---|---|---|
| 室内平坦地面 2D 建图 | 非常合适 | Cartographer 的主场,扫地机、AGV 首选 |
| 大型商场、机场多层平面 | 合适 | 回环能力强,注意分层时坐标系要分开 |
| 室外无结构场地 | 不合适 | 2D 激光缺少垂直结构,扫描匹配无从对齐 |
| 需要三维结构重建 | 需用 3D 模式 | 3D 模式计算量大,需多线雷达与较强算力 |
| 玻璃幕墙、镜面大厅 | 需谨慎 | 激光穿透或镜面反射会产生虚假点,需配合超声波或视觉 |
| 地面崎岖、坡度大 | 不合适 | 2D 假设平面运动,颠簸会造成子图错位 |
| 动态人流密集 | 一般 | 行人腿会在栅格上留下拖影,需靠回环与优化慢慢清除 |

