slam_toolbox 读码与二次开发

09 读码顺序与二次开发

9.1 建议读码顺序

不要从 Mapper.cpp 第 1 行读起。按调用链:

  1. launch/online_async_launch.py
    Lifecycle 如何 CONFIGURE/ACTIVATE;默认 YAML。
  2. config/mapper_params_online_async.yaml
    SMapper::configuresetParams 对一下名字。
  3. include/slam_toolbox/slam_toolbox_common.hpp
    把成员表对照 02
  4. src/slam_toolbox_async.cpplaserCallback(约 30 行)
    整条产品链的入口。
  5. shouldProcessScan / getLocalizedRangeScan / addScanImpl / setTransformFromPoses
    src/slam_toolbox_common.cpp
  6. get_pose_helper.hpplaser_utils.cpptoLaserMetadata / isInverted
  7. lib/karto_sdk/src/Mapper.cppProcess(约 2731)和 TryCloseLoop(约 1515)。
  8. solvers/ceres_solver.cppAddNode / AddConstraint / Compute
  9. src/slam_toolbox_localization.cppaddScanlocalizePoseCallback
  10. 需要时再读 lifelong、多机、merge_maps_kinematic、RViz 插件。

9.2 文件速查

想知道 打开
生命周期 slam_toolbox_common.cpp on_*
一帧何时被丢 shouldProcessScan
TF 怎么算 setTransformFromPosespublishTransformLoop
匹配公式在哪 Mapper.cpp ScanMatcher::MatchScan(声明在 Mapper.h
回环阈值 TryCloseLoop + YAML loop_match_*
存图格式 serialization.hpp
参数进 Karto slam_mapper.cpp configure
定位窗口淘汰 AddScanToLocalizationBuffer

9.3 二次开发切面

需求 不要做
换 topic / 坐标系 / 分辨率 YAML 改源码
启停、存图、切图 调 service 继承节点复制一份
ISlam 适配器 映射 serialize/deserialize/pause/reset/pose Mapper.cpp
雷达外参、倒置 URDF + 确认 LaserAssistant 日志 改 Karto 匹配
定位初值 /initialpose 自写全局重定位(除非 AMCL 也不够)
换优化器 solver_plugin 重写 LM
匹配在走廊滑 先查退化、补轮速/IMU;最后才动 ScanMatcher 一上来改相关网格

第一阶段继续:系统包或本树原样跑,用 service 做管理层。

ISlam 建议对应:

1
2
3
4
5
start/stop     → lifecycle 或 launch
save_map → serialize_map(产品图)+ save_map(pgm 可选)
load_map → deserialize_map
getPose → /pose 或查 TF map←base
getState → 看 /map 是否在更、有无 Lost(需自己根据 pose 协方差定义)

9.4 和本仓库其它文档

  • 产品主线:../../docs/SLAM开发知识.md
  • 学习模块 E3:../../docs/学习知识模块.md
  • 较短速览:../../docs/slam_toolbox源码分析.md(指向本目录)

9.5 编译这份源码

步骤、Humble 补丁、overlay 和冒烟见 10-编译与测试.md

系统 apt 已是 2.6.10 时,编 2.10 必须 overlay,不要和系统 launch 混用。

文章互动

阅读 --

留言

0 条留言

正在加载留言…