09 读码顺序与二次开发
9.1 建议读码顺序
不要从 Mapper.cpp 第 1 行读起。按调用链:
launch/online_async_launch.py
Lifecycle 如何 CONFIGURE/ACTIVATE;默认 YAML。config/mapper_params_online_async.yaml
和SMapper::configure、setParams对一下名字。include/slam_toolbox/slam_toolbox_common.hpp
把成员表对照 02。src/slam_toolbox_async.cpp的laserCallback(约 30 行)
整条产品链的入口。shouldProcessScan/getLocalizedRangeScan/addScanImpl/setTransformFromPosessrc/slam_toolbox_common.cpp。get_pose_helper.hpp、laser_utils.cpp的toLaserMetadata/isInverted。lib/karto_sdk/src/Mapper.cpp的Process(约 2731)和TryCloseLoop(约 1515)。solvers/ceres_solver.cpp的AddNode/AddConstraint/Compute。src/slam_toolbox_localization.cpp的addScan与localizePoseCallback。- 需要时再读 lifelong、多机、
merge_maps_kinematic、RViz 插件。
9.2 文件速查
| 想知道 | 打开 |
|---|---|
| 生命周期 | slam_toolbox_common.cpp on_* |
| 一帧何时被丢 | shouldProcessScan |
| TF 怎么算 | setTransformFromPoses、publishTransformLoop |
| 匹配公式在哪 | 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 | start/stop → lifecycle 或 launch |
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 混用。
正在加载留言…