27. 修改、编译并回滚机器人源码¶
27.1 学习目标¶
建立固定循环:保存基线、做单一修改、局部构建、加载新环境、运行验收、失败回滚。任何源码改动都应留下可复现记录。
27.2 适用范围¶
ROS 2 参数、Launch、Python 和 C/C++ 功能包。固件修改见第七篇。
27.3 操作前检查¶
- 当前版本能运行,基线日志已保存。
- 复制待改文件,记录来源工作空间。
- 知道停止节点和恢复旧文件的方法。
27.4 工作原理¶
同时修改多处后,即使程序暂时能运行,也很难判断是哪项改动影响了结果。一次只改变一个假设,局部构建并复测原始症状。编译失败会直接留下错误信息,反而比含糊的运行结果容易定位。
27.5 源码修改练习¶
安全修改练习¶
第一次练习只追踪,不改协议和车型:
- 保存
git status、当前提交、包安装前缀和节点列表; - 画出实际 Launch 包含树,并把它与实际节点列表分开记录;
- 记录底盘节点的串口、波特率和 frame 参数;
- 记录
cmd_vel、里程计、IMU、电压和 TF 的实际接口、类型和频率; - 回到工作空间根,用
colcon build --packages-up-to turn_on_wheeltec_robot验证能否重建; - 新终端执行
source <工作空间>/install/setup.bash,再次确认ros2 pkg prefix; - 仅在急停可用、电机失能或架空轮子条件下启动节点;先发布零速
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}",再根据节点日志和串口工具确认零速帧与 STM32 回包; - 分别检查
/odom的两个 frame 字段、IMU frame、TF 路径和传感器频率; - 恢复原环境,确认基线仍可运行。
只有启动链、ROS 数据链和必要的硬件证据都闭合后,才进入第 27 章的单一修改和回滚流程。涉及车型、串口协议和底盘运动时,还要保持急停可用、从零速开始,并验证通信断开后的失能行为。
验收记录¶
完成导读后应留下以下记录:
| 项目 | 记录内容 |
|---|---|
| 环境 | Ubuntu、架构、ROS_DISTRO、宿主或容器 |
| 包来源 | 工作空间、提交或版本日期、ros2 pkg prefix |
| 完整性 | 缺失的包、URDF、驱动或配置;是否只完成静态导读 |
| 启动入口 | 顶层 Launch 及其包含树 |
| 底盘节点 | 可执行文件、串口、波特率、参数和命名空间 |
| 下行链路 | cmd_vel 到串口帧的源码位置和单位 |
| 上行链路 | 里程计、IMU、电压和 TF 的实际名称与类型 |
| 构建验收 | 构建命令、退出码和加载后的包前缀 |
| 回滚 | 原环境或原文件的恢复方法 |
如果缺少任何一项,应把结论写成“待核对”或“仅完成静态导读”,不要扩大为实机兼容或可运行结论。
代码资源边界
本节练习作用于读者已经确认的工作空间,不另指定仓库目录;第 25 章的静态源码只能帮助定位,不能替代可重建基线。
27.6 验收标准¶
- 修改目标和预期结果写清楚。
- 构建只覆盖必要包。
- 运行环境确实加载新工作空间。
- 原始症状按预期变化,相关基础功能没有退化。
- 回滚后行为恢复到基线。
27.7 故障排查¶
| 现象 | 处理 |
|---|---|
| 改动没有效果 | 查实际加载路径、安装副本和进程是否重启 |
| 回滚仍异常 | 检查构建产物、参数持久化和其他同时修改 |
| 编译通过但运行崩溃 | 查接口、参数类型、共享库和运行日志 |
| 依赖安装破坏环境 | 使用包管理记录或系统镜像恢复,不盲目降级全局库 |