PX4+Gazebo+MAVROS+Onboard 多机仿真与实测启动指南
概述
本文整理了使用 PX4 + Gazebo + MAVROS + Onboard 控制程序进行单机与多机仿真,以及对应的实测(真实飞控硬件)启动命令与注意事项。适合快速搭建与验证多机集群控制链路。包含四种场景:
- 单机仿真
- 多机仿真(PX4 SITL 多实例)
- 单机实测(连接真实飞控)
- 多机实测(多块飞控 + 多机载电脑)
环境说明
- 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 | # 实例 0 |
提示:
PX4_GZ_MODEL_POSE用于指定模型在 Gazebo 中的初始位置 (x,y)。PX4_GZ_STANDALONE=1用于第二及后续实例防止与第一个实例的 Gazebo 插件冲突。
启动各自的 MAVROS + Onboard 控制
1 | ros2 launch onboard_control mainTree.launch.py uav_id:=1 fcu_url:="udp://:14540@127.0.0.1:14557" |
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。
注意事项
- 每个 PX4 实例的
-i必须唯一,对应不同的 MAV_SYS_ID。 - MAVROS 的
fcu_url端口号需与对应 PX4 的输入端口匹配。 - 多机仿真/实测时应区分 ROS namespace。
- 若出现心跳冲突,检查是否有重复的系统 ID 或端口占用。
- 建议在 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 | ros2 launch onboard_control mainTree.launch.py uav_id:=1 fcu_url:="serial:///dev/ttyACM0: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 各实例坐标 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dreamer Island!




