跳转到正文

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"

不要混用不同工作空间的 srcinstall。如果修改的是 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_idROS2 逻辑 ID,决定 /robot_2/... 中的编号
name车辆名称
ipWiFi 模块发送 UDP 包时的源 IP
protocol小车协议解析器,当前使用 stm32_wheeltec
robot_type机器人类型
control_interface控制接口,当前使用 velocity_twist
enabled是否启用该车,并为其启动相应处理节点

mapped_id 必须唯一。正式运行时建议为每辆车配置固定 IP、idmapped_id,不要长期依赖自动注册。

vehicles.yaml 单车配置示例

1.4 自动注册注意事项

auto_register: true 可以在调试阶段发现未写入配置的源 IP,但自动生成的编号可能不是期望编号。例如 mapped_id: 2 已被占用时,新 IP 可能成为 /robot_1/robot_3

如果车辆出现在错误的 robot_N 下:

  1. 使用 tcpdump 确认该车的源 IP;
  2. vehicles.yaml 中添加静态条目;
  3. 确认 mapped_id 唯一;
  4. 重新构建并重启桥接。

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 -y

2.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 会:

  1. 启动 bridge_node,监听 0.0.0.0:8888
  2. 读取 vehicles.yaml
  3. 将有效状态帧发布为 ROS2 话题;
  4. 按启用车辆启动 EKF;
  5. /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 发布,现场频率以实际固件为准。

ROS2 小车节点和话题列表

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 桥接并确认车辆状态话题持续更新后,继续进行 运动控制与地面站