跳转至

27. 修改、编译并回滚机器人源码

27.1 学习目标

建立固定循环:保存基线、做单一修改、局部构建、加载新环境、运行验收、失败回滚。任何源码改动都应留下可复现记录。

27.2 适用范围

ROS 2 参数、Launch、Python 和 C/C++ 功能包。固件修改见第七篇。

27.3 操作前检查

  • 当前版本能运行,基线日志已保存。
  • 复制待改文件,记录来源工作空间。
  • 知道停止节点和恢复旧文件的方法。

27.4 工作原理

同时修改多处后,即使程序暂时能运行,也很难判断是哪项改动影响了结果。一次只改变一个假设,局部构建并复测原始症状。编译失败会直接留下错误信息,反而比含糊的运行结果容易定位。

27.5 源码修改练习

安全修改练习

第一次练习只追踪,不改协议和车型:

  1. 保存 git status、当前提交、包安装前缀和节点列表;
  2. 画出实际 Launch 包含树,并把它与实际节点列表分开记录;
  3. 记录底盘节点的串口、波特率和 frame 参数;
  4. 记录 cmd_vel、里程计、IMU、电压和 TF 的实际接口、类型和频率;
  5. 回到工作空间根,用 colcon build --packages-up-to turn_on_wheeltec_robot 验证能否重建;
  6. 新终端执行 source <工作空间>/install/setup.bash,再次确认 ros2 pkg prefix;
  7. 仅在急停可用、电机失能或架空轮子条件下启动节点;先发布零速 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 回包;
  8. 分别检查 /odom 的两个 frame 字段、IMU frame、TF 路径和传感器频率;
  9. 恢复原环境,确认基线仍可运行。

只有启动链、ROS 数据链和必要的硬件证据都闭合后,才进入第 27 章的单一修改和回滚流程。涉及车型、串口协议和底盘运动时,还要保持急停可用、从零速开始,并验证通信断开后的失能行为。

验收记录

完成导读后应留下以下记录:

项目 记录内容
环境 Ubuntu、架构、ROS_DISTRO、宿主或容器
包来源 工作空间、提交或版本日期、ros2 pkg prefix
完整性 缺失的包、URDF、驱动或配置;是否只完成静态导读
启动入口 顶层 Launch 及其包含树
底盘节点 可执行文件、串口、波特率、参数和命名空间
下行链路 cmd_vel 到串口帧的源码位置和单位
上行链路 里程计、IMU、电压和 TF 的实际名称与类型
构建验收 构建命令、退出码和加载后的包前缀
回滚 原环境或原文件的恢复方法

如果缺少任何一项,应把结论写成“待核对”或“仅完成静态导读”,不要扩大为实机兼容或可运行结论。

代码资源边界

本节练习作用于读者已经确认的工作空间,不另指定仓库目录;第 25 章的静态源码只能帮助定位,不能替代可重建基线。

27.6 验收标准

  • 修改目标和预期结果写清楚。
  • 构建只覆盖必要包。
  • 运行环境确实加载新工作空间。
  • 原始症状按预期变化,相关基础功能没有退化。
  • 回滚后行为恢复到基线。

27.7 故障排查

现象 处理
改动没有效果 查实际加载路径、安装副本和进程是否重启
回滚仍异常 检查构建产物、参数持久化和其他同时修改
编译通过但运行崩溃 查接口、参数类型、共享库和运行日志
依赖安装破坏环境 使用包管理记录或系统镜像恢复,不盲目降级全局库

章节导航

上一章:TF、URDF 与 RViz · 返回本篇 · 下一章:开机启动与进程管理