04 运行模式
模式子类只改“回调里何时处理、走哪条 Process*”。公共层不变。
4.1 异步建图 AsynchronousSlamToolbox
文件:src/slam_toolbox_async.cpp。
laserCallback:取 odom → getLaser → shouldProcessScan → 立刻 addScan。
- 匹配/回环慢时,回调堵住 executor,后续扫描由
MessageFilter按scan_queue_size(应设 1)丢掉。 - 不会“越积越多”,所以在线建图用这个。
- 反序列化拒绝
LOCALIZE_AT_POSE。
Launch:launch/online_async_launch.py → async_slam_toolbox_node + mapper_params_online_async.yaml。
4.2 同步建图 SynchronousSlamToolbox
文件:src/slam_toolbox_sync.cpp。
laserCallback:同样取 odom / laser / shouldProcess,然后 q_.push(PosedScan)。
on_activate 额外起 run():
1 | 100 Hz 循环 |
- 录包离线、或要求尽量不丢帧时用。
- 在线跑同步且 CPU 不够,队列会无限涨。
- 服务
slam_toolbox/clear_queue清空队列。 reset会先清队列再调基类 reset。
addScan 基类会再锁一次 smapper_mutex_;同步路径直接调 addScanImpl,锁在 run() 里已经拿着。
4.3 定位 LocalizationSlamToolbox
文件:src/slam_toolbox_localization.cpp。
on_configure:
processor_type_ = PROCESS_LOCALIZATION- 关交互模式、拆掉
MapSaver(定位不存图)
on_activate 额外:
- 订
/initialpose(与 AMCL / RViz “2D Pose Estimate” 同接口) - 服务
slam_toolbox/clear_localization_buffer
loadPoseGraphByParams:若给了 map_file_name,按 LOCALIZE_AT_POSE 反序列化。map_start_at_dock 在定位里明确不支持(会 warn)。
覆盖的 addScan:
- 若当前是 LOCALIZATION 且已有
process_near_pose_,先改成PROCESS_NEAR_REGION(响应/initialpose) PROCESS_NEAR_REGION:把扫描位姿设成给定 pose,ProcessAgainstNodesNearBy(..., addScanToLocalizationBuffer=true),然后回到 LOCALIZATION,并更新reprocessing_transform_PROCESS_LOCALIZATION:ProcessLocalization,不更新 reprocessing- 成功则只更新 TF 和
pose,不dataset_->Add
serialize_map 在定位模式直接报错。反序列化必须是 LOCALIZE_AT_POSE。
官方 README 也写了:定位对里程计质量要求高,新手仍可用 AMCL。
4.4 实验性 Lifelong
文件:src/experimental/slam_toolbox_lifelong.cpp。
启动会 warn:实验性。思路是继续往图里加节点的同时,按 扫描重叠 IoU 给旧节点打分,低于 lifelong_node_removal_score 的删掉,让计算量有上界。
关键参数:lifelong_minimum_score、lifelong_iou_match、lifelong_node_removal_score、lifelong_overlap_score_scale、lifelong_search_use_tree。
产品上更稳妥的做法:用普通建图把图画完,再切定位,不要在边缘设备上开 lifelong。
4.5 建图/定位切换
MapAndLocalizationSlamToolbox 继承 Localization,允许运行时在 mapping / localization 之间切。参数 localization_on_configure 决定 configure 时落在哪边。给 Nav2 里“先建图后定位”的同一进程用。
4.6 去中心化多机
decentralized_multirobot_slam_toolbox_node:每台车独立跑一份 toolbox,交换 LocalizedLaserScan,在共享全局系里对齐位姿图。细节见源码 docs/decentralized_multi_robot_slam.md。第一阶段不必碰。
4.7 怎么选
| 场景 | 节点 |
|---|---|
| 室内车第一次建图 | async + mapping YAML |
| 用 bag 离线出高精度图 | sync + offline YAML |
已有 .posegraph,日常跑 |
localization + map_file_name |
| 要给 AMCL 一张 pgm | 建图时调 save_map,或 map_saver_cli |
| 继续在旧图上补扫 | async/sync + deserialize_map(START_AT_GIVEN_POSE) |
正在加载留言…