44. ROS 2 与 STM32 联调¶
44.1 学习目标¶
沿着 cmd_vel 到电机、再从编码器/IMU 回到 ROS 2 的完整链路设置检查点,定位通信和单位转换问题。
联调是把已经分别检查过的 ROS 2 程序、串口链路和控制板固件连接起来,逐段确认数据能否到达下一层。调试时一次只跨过一个接口,这样才能分清故障来自 ROS 节点、协议转换、物理通信还是固件执行。
44.2 适用范围¶
使用 turn_on_wheeltec_robot 与串口底盘协议的 ROS 2 机器人。CAN 驱动可沿用同样的边界检查。
44.3 操作前检查¶
- STM32 固件已通过架空验收并可回滚。
- 串口设备别名和权限稳定。
- ROS 2 底盘节点源码与固件协议版本匹配。
44.4 工作原理¶
图中的每个箭头都是一个可单独检查的接口。常见错误包括设备端口选错、协议版本不一致、毫米每秒与米每秒漏换、角速度缩放倍数错误,以及字节序或坐标符号相反。
44.5 ROS—串口—固件链¶
从 cmd_vel 追到 STM32,再回到 ROS 2¶
底盘节点通常订阅 geometry_msgs/msg/Twist 类型的 cmd_vel,把线速度和角速度编码为串口下行帧。这里的帧是一段按协议排列的连续字节,通常包含帧头、数据字段、校验值和帧尾。STM32 返回编码器、IMU 和电压等数据后,节点解析并发布里程计、原始 IMU 和供电电压。可以按下列链路定位:
/cmd_vel
→ wheeltec_robot_node 订阅回调
→ 速度缩放、车型运动学与协议封包
→ /dev/wheeltec_controller
→ STM32
→ 串口上行帧
→ 校验、单位换算和状态更新
→ /odom、/imu/data_raw、/PowerVoltage
→ EKF、TF 与上层导航
静态源码只能证明某条路径被实现,不能证明当前机器人正在走这条路径。运行时继续核对节点、类型、发布者/订阅者和消息内容:
ros2 node info <底盘节点名>
ros2 topic info /cmd_vel --verbose
ros2 topic echo /odom --once
ros2 topic echo /imu/data_raw --once
ros2 topic echo /PowerVoltage --once
ros2 run tf2_ros tf2_echo odom_combined base_footprint
将 /odom 的 header.frame_id、child_frame_id 与节点参数比较;将 IMU 的 header.frame_id 与 TF 树比较;同时记录 ros2 topic hz 的频率。命名空间会给一组接口增加名称前缀,重映射(Remapping)则在启动时把原接口名替换为另一个名称。因此,实际话题名应以 ros2 node info 的运行结果为准。
这些命令仍不能单独证明波特率已经生效、节点确实打开了预期设备或 STM32 已正确执行帧。硬件证据至少应包括:节点打开串口的日志或设备句柄、在电机失能/架空条件下观察到零速下行帧,以及 STM32 返回帧被节点接收并转成预期话题。缺少其中任一项,只能报告 ROS 图上的静态或运行时接口证据。
代码入口与完整文件集见第 25 章的底盘启动链资源块;本节只定义 ROS、串口与固件之间的验证边界,不新增独立代码资源。
44.6 验收标准¶
- 设备别名在重插后稳定。
- ROS 速度和协议整数的缩放可手算复核。
- OLED、轮速、里程计和 IMU 符号一致。
- 停止、节点退出和通信断开都能让底盘安全停机。
- 记录中包含 ROS 包版本、固件版本和抓帧证据。
44.7 故障排查¶
| 现象 | 边界 |
|---|---|
cmd_vel 有值但无下行帧 |
ROS 节点订阅、端口或 Control 函数 |
| 下行正确但 OLED 不变 | 线缆、波特率、帧校验或固件协议 |
| 电机动作正确但 odom 错 | 上行解析、编码器方向、正运动学或单位 |
| IMU 方向错 | 板载轴定义、固件重映射或 ROS frame_id |
| 断开主控后继续运动 | 通信超时和失能逻辑缺失,停止测试 |