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)。
启动流程
启动步骤
打开三个终端,依次执行:
# 终端 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一致。