2. PX4 SITL 与 ROS2 联合仿真启动

任务说明

本案例在 Ubuntu 环境下启动 PX4 SITL(Gazebo 仿真),运行 Micro XRCE-DDS Agent,使 PX4 的 uORB 话题桥接到 ROS2,然后用 ROS2 命令行观察传感器与状态话题。核心链路:PX4 SITL → uXRCE-DDS Client → Micro XRCE-DDS Agent → ROS2 话题。

环境与依赖

  • Ubuntu 22.04,已安装 ROS2 Humble(source /opt/ros/humble/setup.bash)。
  • PX4-Autopilot 源码已编译(make px4_sitl 可运行)。
  • Micro XRCE-DDS Agent 已安装(MicroXRCEAgent 可执行)。
  • Gazebo(PX4 自带 gz 仿真目标,无需单独安装 gazebo_ros)。

启动流程

PX4 SITL (Gazebo 仿真) uXRCE-DDS Client (内置) UDP 8888 Micro XRCE -DDS Agent 监听 8888 ROS2 话题 /fmu/out/...

启动步骤

打开三个终端,依次执行:

# 终端 1:启动 Micro XRCE-DDS Agent,监听 UDP 8888
MicroXRCEAgent udp4 -p 8888

# 终端 2:启动 PX4 SITL(Gazebo 机型)
cd ~/PX4-Autopilot
make px4_sitl gz_x500

# 终端 3:加载 ROS2 环境并观察话题
source /opt/ros/humble/setup.bash
ros2 topic list

验证方法

在终端 3 中执行以下命令,观察桥接是否生效:

# 列出所有桥接话题,应出现 /fmu/out/ 前缀的话题
ros2 topic list | grep fmu

# 查看传感器话题(如电池状态)
ros2 topic echo /fmu/out/battery_status --once

# 查看姿态话题
ros2 topic echo /fmu/out/vehicle_attitude --once

# 查看话题发布频率
ros2 topic hz /fmu/out/sensor_combined

判定通过条件:ros2 topic list 中出现 /fmu/out/ 系列话题;ros2 topic echo 能持续输出消息内容;ros2 topic hz 显示稳定频率(如 sensor_combined 约 250Hz)。若话题列表为空,检查 Agent 是否在 PX4 启动前已运行,以及 UDP 8888 端口是否被占用。

常见问题

  • 话题为空:确认 Agent 先于 PX4 启动,或重启 PX4 触发客户端重连。
  • 端口冲突:ss -ulnp | grep 8888 检查占用,必要时换端口并同步修改 PX4 参数 XRCE_DDS_CFG。
  • ROS2 找不到话题:确认已 source /opt/ros/humble/setup.bash,且 ROS_DOMAIN_ID 一致。