概述

本文整理了使用 PX4 + Gazebo + MAVROS + Onboard 控制程序进行单机与多机仿真,以及对应的实测(真实飞控硬件)启动命令与注意事项。适合快速搭建与验证多机集群控制链路。包含四种场景:

  1. 单机仿真
  2. 多机仿真(PX4 SITL 多实例)
  3. 单机实测(连接真实飞控)
  4. 多机实测(多块飞控 + 多机载电脑)

环境说明

  • PX4 版本:SITL,使用 px4_sitl_default 构建。
  • Gazebo:使用 PX4 官方支持的 Gazebo (可能是 classic 或 Garden,命令中使用 gz_x500 模型)。
  • ROS 版本:ROS 2(适配 MAVROS2 / onboard 控制程序)。
  • 地面站:QGroundControl (QGC) 用于设置真实飞控的 MAV_SYS_ID

说明:多实例仿真中通过环境变量和 -i 指定 PX4 实例编号,该编号会映射为对应的 MAV 系统 ID。MAVROS 端通过 fcu_url 指定与 PX4 通信的 UDP 端口或串口。请确保端口与实例一一对应。

情况 1:单机仿真

启动 PX4 + Gazebo

1
PX4_SYS_AUTOSTART=4001 PX4_SIM_MODEL=gz_x500 ./build/px4_sitl_default/bin/px4 -i 0

启动 MAVROS + Onboard 控制

1
ros2 launch onboard_control mainTree.launch.py uav_id:=1 fcu_url:="udp://:14540@127.0.0.1:14557"

情况 2:多机仿真

启动多个 PX4 SITL 实例,并为每架无人机分配初始位姿与系统 ID。

启动 PX4 多实例

1
2
3
4
5
6
# 实例 0
PX4_SYS_AUTOSTART=4001 PX4_SIM_MODEL=gz_x500 PX4_GZ_MODEL_POSE="0,0" ./build/px4_sitl_default/bin/px4 -i 0
# 实例 1
PX4_GZ_STANDALONE=1 PX4_SYS_AUTOSTART=4001 PX4_GZ_MODEL_POSE="1,0" PX4_SIM_MODEL=gz_x500 ./build/px4_sitl_default/bin/px4 -i 1
# 实例 2
PX4_GZ_STANDALONE=1 PX4_SYS_AUTOSTART=4001 PX4_GZ_MODEL_POSE="0,1" PX4_SIM_MODEL=gz_x500 ./build/px4_sitl_default/bin/px4 -i 2

提示:PX4_GZ_MODEL_POSE 用于指定模型在 Gazebo 中的初始位置 (x,y)。PX4_GZ_STANDALONE=1 用于第二及后续实例防止与第一个实例的 Gazebo 插件冲突。

启动各自的 MAVROS + Onboard 控制

1
2
3
ros2 launch onboard_control mainTree.launch.py uav_id:=1 fcu_url:="udp://:14540@127.0.0.1:14557"
ros2 launch onboard_control mainTree.launch.py uav_id:=2 fcu_url:="udp://:14541@127.0.0.1:14558"
ros2 launch onboard_control mainTree.launch.py uav_id:=3 fcu_url:="udp://:14542@127.0.0.1:14559"

PX4 实例与端口对应关系

实例 -i MAV_SYS_ID PX4 UDP 输入端口 MAVROS fcu_url 示例 对应参数 tgt_system
0 1 14540 udp://:14540@127.0.0.1:14557 1
1 2 14541 udp://:14541@127.0.0.1:14558 2
2 3 14542 udp://:14542@127.0.0.1:14559 3

规范建议:为每个无人机使用不同的 ROS 2 namespace,避免话题与 TF 树冲突。例如:/uav1, /uav2, /uav3

注意事项

  1. 每个 PX4 实例的 -i 必须唯一,对应不同的 MAV_SYS_ID。
  2. MAVROS 的 fcu_url 端口号需与对应 PX4 的输入端口匹配。
  3. 多机仿真/实测时应区分 ROS namespace。
  4. 若出现心跳冲突,检查是否有重复的系统 ID 或端口占用。
  5. 建议在 QGC 中确认参数 MAV_SYS_ID 与仿真/控制端配置一致。

情况 3:单机实测(真实飞控)

连接真实飞控的串口(示例为 /dev/ttyACM0,波特率 57600):

1
ros2 launch onboard_control mainTree.launch.py uav_id:=1 fcu_url:="serial:///dev/ttyACM0:57600"

若使用不同接口(如 /dev/ttyUSB0),替换设备路径即可。

情况 4:多机实测

多块飞控 + 多机载电脑或同一机载电脑的多串口:

1
2
3
ros2 launch onboard_control mainTree.launch.py uav_id:=1 fcu_url:="serial:///dev/ttyACM0:57600"
ros2 launch onboard_control mainTree.launch.py uav_id:=2 fcu_url:="serial:///dev/ttyACM1:57600"
ros2 launch onboard_control mainTree.launch.py uav_id:=3 fcu_url:="serial:///dev/ttyACM2:57600"

在实测前需使用 QGC 分别设置每块飞控的 MAV_SYS_ID,保证:

  • 与对应启动命令中的 uav_id 一致
  • 集群内不重复

常见问题排查

问题 可能原因 排查建议
无法连接 MAVROS 端口号/串口不对 确认 fcu_url 与实际端口,UDP 是否被防火墙阻挡
多机互相干扰 系统 ID 重复 检查 -i / MAV_SYS_ID 设置以及 QGC 参数
话题混杂 未使用 namespace 在 launch 文件中增加 namespace 参数
位姿重叠 初始 pose 未区分 调整 PX4_GZ_MODEL_POSE 各实例坐标