主题模式
C30D 底板小车:ROS2 桥接与通信验证
本页介绍车辆 IP 与 ROS2 ID 映射、wheelswarm_bridge 编译启动,以及从 WiFi 到 ROS2 话题的分层验证流程。
1. ROS2 车辆 IP 与 ID 映射
1.1 ROS2 工作空间
本文按 Docker/运行环境中的工作空间路径设置:
bash
export WS=/home/linuxbrew/swarmlab_simulator_ws仓库中的对应源码目录为:
text
~/aiswarmlab/aiswarmlab/source/swarmlab_simulator_ws实际部署路径不同时,应将 WS 修改为容器或主机中真正用于构建和运行的 ROS2 工作空间。每个新终端都需要执行:
bash
source /opt/ros/humble/setup.bash
source "$WS/install/setup.bash"不要混用不同工作空间的 src 和 install。如果修改的是 A 工作空间源码,却 source 了 B 工作空间的 install/setup.bash,运行的仍可能是旧配置。
1.2 编辑 vehicles.yaml
配置文件位于:
text
$WS/src/wheelswarm_bridge/config/vehicles.yaml单车示例:
yaml
udp_port: 8888
online_timeout: 5.0
auto_register: true
vehicles:
- id: 2
mapped_id: 2
name: robot_02
ip: 192.168.1.45
protocol: stm32_wheeltec
robot_type: ackermann_robot
control_interface: velocity_twist
enabled: true其中 ip 必须填写第 2.2 节记录的 WiFi 模块源 IP,不能填写地面站的 UDP 目标 IP。
1.3 字段说明
| 字段 | 含义 |
|---|---|
udp_port | 桥接节点监听端口,必须与 WiFi 模块目标端口一致 |
online_timeout | 超过该时间没有有效状态包时判定车辆离线 |
auto_register | 是否允许未知源 IP 临时自动注册 |
id | 车辆物理/配置 ID |
mapped_id | ROS2 逻辑 ID,决定 /robot_2/... 中的编号 |
name | 车辆名称 |
ip | WiFi 模块发送 UDP 包时的源 IP |
protocol | 小车协议解析器,当前使用 stm32_wheeltec |
robot_type | 机器人类型 |
control_interface | 控制接口,当前使用 velocity_twist |
enabled | 是否启用该车,并为其启动相应处理节点 |
mapped_id 必须唯一。正式运行时建议为每辆车配置固定 IP、id 和 mapped_id,不要长期依赖自动注册。

1.4 自动注册注意事项
auto_register: true 可以在调试阶段发现未写入配置的源 IP,但自动生成的编号可能不是期望编号。例如 mapped_id: 2 已被占用时,新 IP 可能成为 /robot_1 或 /robot_3。
如果车辆出现在错误的 robot_N 下:
- 使用
tcpdump确认该车的源 IP; - 在
vehicles.yaml中添加静态条目; - 确认
mapped_id唯一; - 重新构建并重启桥接。
2. 编译并启动 wheelswarm_bridge
2.1 安装 ROS2 依赖
ackermann_msgs 是 ROS2 消息包,不应使用 pip 安装。ROS2 Humble 下执行:
bash
sudo apt update
sudo apt install ros-humble-ackermann-msgs也可以统一安装工作空间依赖:
bash
cd "$WS"
source /opt/ros/humble/setup.bash
rosdep install --from-paths src --ignore-src -r -y2.2 构建桥接包
bash
cd "$WS"
source /opt/ros/humble/setup.bash
colcon build --packages-select wheelswarm_bridge --symlink-install
source install/setup.bash修改 vehicles.yaml 后也建议重新执行上述构建,确保安装目录中的配置同步更新。
2.3 确认包可见
bash
ros2 pkg prefix wheelswarm_bridge
ros2 pkg executables wheelswarm_bridge如果显示找不到包:
bash
source /opt/ros/humble/setup.bash
source "$WS/install/setup.bash"若仍找不到,检查 colcon build 是否成功以及当前 WS 是否正确。
2.4 启动前检查端口和旧进程
bash
ss -lunp | grep ':8888'
ps -ef | grep '[b]ridge_node'同一主机上的 UDP 8888 同一时间只应由一个桥接进程使用。多个进程绑定或复用同一端口时,数据可能被不同进程分走,造成丢帧、车辆反复上下线或控制异常。
2.5 手动启动桥接与 EKF
bash
cd "$WS"
source /opt/ros/humble/setup.bash
source install/setup.bash
ros2 launch wheelswarm_bridge bridge.launch.py正常情况下该 launch 会:
- 启动
bridge_node,监听0.0.0.0:8888; - 读取
vehicles.yaml; - 将有效状态帧发布为 ROS2 话题;
- 按启用车辆启动 EKF;
- 把
/robot_{id}/cmd_vel转换为 UDP 控制帧发回该车。
2.6 启动成功检查
另开终端:
bash
source /opt/ros/humble/setup.bash
source "$WS/install/setup.bash"
ros2 node list | grep -E 'bridge|ekf'
ros2 topic list | grep -E 'robot_|vehicle_info'以 mapped_id: 2 为例,正常情况下至少应看到:
text
/bridge_node
/ekf_node_robot_2
/robot_2/velocity
/robot_2/imu
/robot_2/battery
/vehicle_info检查数据是否持续发布:
bash
ros2 topic hz /robot_2/velocity
ros2 topic echo /vehicle_info
ros2 topic echo /robot_2/velocity
ros2 topic echo /robot_2/imu
ros2 topic echo /robot_2/battery状态帧通常以约 20 Hz 发布,现场频率以实际固件为准。

3. 分层验证完整通信链路
出现问题时不要同时修改多个参数,应从底层到上层逐层验证。
3.1 第一层:WiFi 联网
通过模块启动日志或路由器后台确认:
- 已连接正确 SSID;
- 已取得局域网 IP;
- 地面站和模块位于可互通网段;
- 路由器未开启客户端隔离。
3.2 第二层:UDP 到达地面站
bash
sudo tcpdump -ni any -vv udp port 8888应持续看到从小车源 IP 到地面站 8888 的 UDP 数据。
3.3 第三层:协议帧有效
桥接只会发布通过长度、帧头帧尾和校验验证的数据。典型状态帧特征:
text
长度:24 字节
帧头:0x7B
帧尾:0x7D
校验:字节 0 到 21 的 XOR如果 tcpdump 有数据,但 /robot_2/velocity 没有数据,重点检查:
- C30D 和 WiFi 模块是否都为
921600 8N1; - UDP 包是否确实为 24 字节;
- 帧头、帧尾和 XOR 校验是否正确;
- 是否使用了与当前固件匹配的
stm32_wheeltec协议; - 串口高波特率下供电和接线是否稳定。
3.4 第四层:车辆 IP 映射
bash
ros2 topic echo /vehicle_info确认源 IP 对应的车辆被映射到正确 mapped_id。如果出现了错误编号,修正 vehicles.yaml 后重启桥接。
3.5 第五层:ROS2 状态话题
bash
ros2 topic hz /robot_2/velocity
ros2 topic hz /robot_2/imu
ros2 topic echo /robot_2/battery持续有数据表示“小车 -> WiFi -> UDP -> 桥接 -> ROS2”的上行链路已经打通。
3.6 第六层:下行控制链路
发布低速控制时,同时抓包:
bash
sudo tcpdump -ni any -vv udp port 8888应看到地面站向小车源 IP 和源端口发送 UDP 控制帧。当前控制帧通常为 11 字节。
3.7 第七层:EKF 和动捕
桥接正常后检查动捕位姿:
bash
ros2 topic list | grep pose
ros2 topic hz /robot_2/pose
ros2 topic echo /robot_2/pose检查 EKF 输出:
bash
ros2 topic hz /robot_2/odom
ros2 topic echo /robot_2/odom地面站对真实车辆的发现主要依赖 /robot_{id}/velocity 的活跃度。只有 /pose 而没有速度话题时,车辆可能无法被识别为真实小车。
完成 ROS2 桥接并确认车辆状态话题持续更新后,继续进行 运动控制与地面站。
