slam_toolbox 运行模式

04 运行模式

模式子类只改“回调里何时处理、走哪条 Process*”。公共层不变。

4.1 异步建图 AsynchronousSlamToolbox

文件:src/slam_toolbox_async.cpp

laserCallback:取 odom → getLasershouldProcessScan立刻 addScan

  • 匹配/回环慢时,回调堵住 executor,后续扫描由 MessageFilterscan_queue_size(应设 1)丢掉。
  • 不会“越积越多”,所以在线建图用这个。
  • 反序列化拒绝 LOCALIZE_AT_POSE

Launch:launch/online_async_launch.pyasync_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
2
3
4
100 Hz 循环
若未暂停 PROCESSING:
出队 → getLaser → addScanImpl
队列 >10:打警告,建议停车等处理完
  • 录包离线、或要求尽量不丢帧时用。
  • 在线跑同步且 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

  1. 若当前是 LOCALIZATION 且已有 process_near_pose_,先改成 PROCESS_NEAR_REGION(响应 /initialpose
  2. PROCESS_NEAR_REGION:把扫描位姿设成给定 pose,ProcessAgainstNodesNearBy(..., addScanToLocalizationBuffer=true),然后回到 LOCALIZATION,并更新 reprocessing_transform_
  3. PROCESS_LOCALIZATIONProcessLocalization,不更新 reprocessing
  4. 成功则只更新 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_scorelifelong_iou_matchlifelong_node_removal_scorelifelong_overlap_score_scalelifelong_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)

文章互动

阅读 --

留言

0 条留言

正在加载留言…