PX4 SITL仿真全链路打通:Gazebo、QGC与ROS 2实战 如果你刚接触PX4八成会被这套组合拳打懵明明照着教程装了QGC、拉了源码make 了一晚上到头来 Gazebo 里飞机的螺旋桨转都不转或者飞机起来了但地面站界面干干净净。这不是你笨是现在的 PX4 生态已经不是装个软件点运行就能跑的年代了。PX4 固件、Gazebo 仿真器、XRCE-DDS 中间件、QGC 地面站这四样东西各管一段中间哪根线没接通整个系统就是瘫的。这篇教程就是把这些线一根一根捋清楚。我会从架构原理讲到实际命令再讲我跑通整个链路时踩过的坑目标是让你在一台普通 Ubuntu 电脑上用 QGC 看到仿真飞机的姿态、用 ROS 2 订阅到飞控的传感器数据并且知道这套东西换到实机上该怎么迁移。适合刚入门 PX4 的开发同学也适合那些已经被版本组合折磨到想放弃的人。1. 先搞懂数据通道PX4 1.14 后为什么要插一个 XRCE-DDS1.1 uORB、MAVLink 与 DDS 的三角关系PX4 内部有一套自研的轻量级通信机制叫 uORB飞控里的姿态、传感器、遥控器指令全都在这个内部总线上跑。它高效、实时但有个致命特点只存在于 PX4 进程内部外面的人根本看不见。往外看PX4 对外有一张标准面孔叫 MAVLink这是无人机行业最常见的通信协议。QGC 地面站能显示姿态、地图、电池电量靠的就是 MAVLink 消息。仿真器里的 Gazebo 也是通过 MAVLink 和 PX4 模拟进程交换数据的。问题出在 ROS 2 这边。ROS 2 的通信基座是 DDS一套去中心化、支持动态发现的中间件。早期想打通 PX4 和 ROS只能用 MAVROS 这类翻译官先把 MAVLink 翻译成 ROS 话题效率低、转发链路长还容易丢消息。PX4 从 v1.14 开始内置了 XRCE-DDS 客户端microdds_client让 PX4 可以直接以 DDS 参与者的身份和 ROS 2 对话。这个客户端用的是 XRCE-DDS 协议也就是约束资源环境下的 DDS可以理解成给嵌入设备用的一个 DDS 精简版。1.2 两条通道不是一回事很多新人在这里翻车我见过不少人把 MAVLink 和 DDS 当成一条路结果 Gazebo 里飞机已经飞了ROS 2 里ros2 topic list却干干净净就开始怀疑人生。其实在 PX4 SITL 仿真环境下同时跑着两条完全独立的数据通道第一条是 QGC 和仿真之间的 MAVLink 通道负责显示和控制。第二条是 ROS 2 和仿真之间的 DDS 通道负责传递传感器数据和指令。这两条通道互不干扰。你ros2 topic list看不到话题不代表飞控没起来QGC 连不上飞机也不代表仿真失败。搞清楚自己现在盯的是哪条通道排查问题就快得多。1.3 端口全景图14540 / 14550 / 8888数据要跑就得走端口端口是最容易踩坑的地方。跑这套仿真时你至少要知道三个端口端口用途常见问题14540PX4 仿真进程与 QGC 之间的 MAVLink 数据QGC 收不到数据时检查这里14550QGC 向仿真发送 MAVLink 指令被其他程序占用时 QGC 会连不上8888PX4 microdds_client 与 XRCE-DDS Agent 通信Agent 没监听这个端口时 ROS 2 无话题很多人仿真飞控起不来bind: Address already in use一出来就是 14550 被占用了。后面我会专门讲排查。2. 环境组合版本选对了等于成功一半2.1 推荐组合先说结论我目前用下来最稳的组合是组件推荐版本/分支说明操作系统Ubuntu 22.04 LTS生态支持最全面教程最多ROS 2Humble和 Ubuntu 22.04 是官方配对PX4 固件v1.14.x 稳定版如果你求稳用它GazeboGazebo Classic 11PX4 v1.14 默认配套仿真器QGCQt 编译的最新稳定版4.2版本太老会握手失败如果你非要体验新功能可以拉 PX4 main 分支那默认的仿真器就换成了 GazeboIgnition Fortress 之后的版本命令也变成了make px4_sitl gz_x500。但如果你刚入门我更建议先用 v1.14 稳定版把链路跑通再考虑迁移到新版本。原因很简单老版本踩坑的人多搜得到解决方案。2.2 PX4 工具链自助安装脚本怎么用PX4 官方仓库里带了一个环境配置脚本路径是Tools/setup/ubuntu.sh。它的作用是帮你装好编译 PX4 需要的所有系统依赖CMake、Ninja、Python 工具包、交叉编译器等。但注意它不会装 Gazebo也不会装 QGC。Gazebo 是你在需要仿真的时候用 make 命令自动拉起来的QGC 要单独下载 AppImage 或用源码编译。我第一次用这脚本时以为万事大吉结果跑 make 还是报一堆缺依赖后来才发现脚本只管飞控本身。建议执行顺序git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot bash ./Tools/setup/ubuntu.sh如果网络不好submodule 拉取可能失败git submodule update --init --recursive这条命令得常备着。2.3 到底要不要装 ROS 2这个问题得分场景。你只是想用 QGC 看看姿态、手动飞一飞仿真飞机那不需要装 ROS 2PX4 单独跑就够。你想订阅飞控传感器数据、跑视觉 SLAM、做自主决策那必须装 ROS 2 Humble还要把 XRCE-DDS Agent 跑起来。我的建议是第一次接触先别关 ROS 2 的事纯 PX4 Gazebo QGC 就能让你理解飞控的核心逻辑。等你弄明白 PX4 在干什么再引入 DDS 那套思维会清晰得多。硬着头皮一步到位反而容易一堆乱麻。安装 ROS 2 Humble 就用官方文档里的 apt 源安装方式然后注意source /opt/ros/humble/setup.bash这个不能漏。QGC 和 Gazebo 的安装其实都可以后置真正要先装的是 PX4 依赖链。2.4 Gazebo Classic 和 Fortress 的选择PX4 社区现在处于两代 Gazebo 并存的阶段Gazebo Classic 11老牌仿真器模型资源丰富PX4 v1.14 的默认选择。Gazebogz-sim新一代仿真器和 ROS 2 的集成更紧密PX4 main 分支已经默认用它。我个人的建议是新手用 Classic。不是因为新版本不好而是旧版本的故障模式已经被摸透了网上随手一搜就是答案。Fortress 对模型格式和资源路径的要求不一样报错信息也更加抽象等你解决完这些可能已经没精力学 PX4 了。3. 实操把 PX4 SITL 仿真拉起来3.1 从克隆到第一架飞机环境准备好以后真正的 SITLSoftware In The Loop软件在环仿真操作就开始了。所谓 SITL就是飞控代码不是跑在真实硬件上而是作为一个 Linux 进程在你的电脑上跑再由仿真器提供虚拟的传感器数据。最经典的启动命令是cd PX4-Autopilot make px4_sitl gazebo_x500这条命令会先编译 PX4 固件再启动 Gazebo并把 x500 四旋翼模型塞进仿真世界。注意第一次编译时间取决于你的 CPU我之前用一台普通笔记本大概十分钟左右。启动成功后你的终端里会陆续出现几条关键信息其中最重要的是这条INFO [commander] Ready for takeoff!看到这行字说明 PX4 已经认为自己的传感器有效、姿态估算正常随时可以解锁起飞了。3.2 make 命令到底拆成了什么很多人不理解make px4_sitl gazebo_x500为什么是这么个写法。拆开看就懂了px4_sitl编译目标生成的是 SITL 版本的 PX4 可执行文件也就是跑在 Linux 上的飞控。gazebo指定启动的仿真器是 Gazebo Classic。x500仿真里加载的具体机型模型这里是 x500 四旋翼。如果你想换机型比如跑固定翼就换模型名例如make px4_sitl gazebo_plane不同版本 PX4 的模型命名有差异。如果你是 v1.14 稳定版gazebo_x500是准确且保险的。如果用的是 main 分支那要换成gz_x500否则会报找不到模型。3.3 启动成功之后QGC 还没出现记着这一步是 PX4 起来了、Gazebo 起来了但 QGC 不会自己弹出来。你得另外打开 QGC。QGC 默认会自动通过 UDP 14550 端口探测本地仿真器一般几秒内就能认出 PX4 SITL。打开 QGC 后你应该能在左上角看到电池电压、姿态指示器和飞行状态界面。如果 Gazebo 里飞机在动QGC 的俯仰滚转角也会跟着动。到了这一步PX4 和 QGC 这条 MAVLink 通道已经通了。3.4 手动起飞的方式在仿真里试飞我最推荐用 QGC 的起飞机动切到任务界面点起飞滑条飞机就会自动解锁并上升到设定高度。这比用遥控器手势省心得多。如果你已经接好了 RC 遥控器模拟器比如用 USB 加密狗接真实遥控器那可以先在 QGC 里完成遥控器校准然后在 Safety 界面设置好失控保护再用内八手势解锁。仿真里大多数时候我更推荐直接软件解锁原因是很多新手在电脑前面右手杆往下一推Gazebo 里的飞机纹丝不动就开始怀疑是自己手势不对其实只是遥控器通道没映射好。4. 打通 ROS 2跑起 XRCE-DDS Agent4.1 Agent 是什么为什么 PX4 自己不够PX4 内置的 microdds_client 只是一个客户端它负责把 PX4 的 uORB 消息翻译成 XRCE-DDS 格式然后发往一个叫Agent的中间进程。Agent 收到以后再转成标准 DDS 消息ROS 2 节点才能订阅到。反过来ROS 2 发出去的指令也由 Agent 转给 microdds_client最终落回到 uORB。你可以把 Agent 想象成快递中转站PX4 是镇上的杂货铺ROS 2 是城里的大超市天上飞的 DDS 是公路Agent 就是服务区所有快递都得在服务区过一遍。4.2 安装和启动方式用源码编译是最可靠的因为 apt 里不一定有你想要的版本。我的做法git clone -b humble https://github.com/uxlfoundation/micro-ROS-Agent.git cd micro-ROS-Agent # 建议先建一个独立的 colcon 工作空间别和 ROS 2 的根空间混在一起然后编译sudo apt install python3-colcon-common-extensions colcon build source install/setup.bash启动命令ros2 run micro_ros_agent micro_ros_agent udp4 --middleware_rmw_fastrtps_cdr --port 8888这里有两个关键点一是用udp4表示 IPv4 UDP 通信二是--middleware_rmw_fastrtps_cdr强制指定 Fast DDS 作为 RMW 实现。PX4 默认集成的就是 Fast DDS如果你这时候 ROS 2 用的是 CycloneDDS两端 RMW 不一致就会出现 Agent 启动了但话题看不到的怪事。4.3 启动顺序其实有讲究我建议先启动 Agent再启动 PX4 SITL。这样 PX4 起来的时候 microdds_client 立刻就能连上 Agent不会有反复重连的等待。但如果你已经先把 PX4 跑起来了再启动 Agent问题也不大。microdds_client 有自动重连机制Agent 一上线几十秒内就会握手成功。你观察终端日志看到类似microdds_client connected to 127.0.0.1:8888的信息就说明通了。4.4 ROS 2 里怎么验证跑完 Agent 和 PX4 后另开一个终端source /opt/ros/humble/setup.bash source ~/micro_ros_agent/install/setup.bash ros2 topic list正常你会看到一大堆fmu/out/开头的 ROS 话题比如/fmu/out/vehicle_attitude /fmu/out/sensor_combined /fmu/out/vehicle_local_position /fmu/out/vehicle_status拿姿态话题试一下ros2 topic echo /fmu/out/vehicle_attitude如果屏幕上持续翻滚四元数数据就说明 ROS 2 已经能实时看到仿真飞控的自身姿态了。5. QGC 上手从连上到准备起飞5.1 新建连接还是自动连接安装 QGC 后第一次打开它会自动搜本地的 UDP 端口。大多数情况下PX4 仿真一跑起来QGC 左上角的连接状态就从灰色变成绿色。如果没变绿手动添加连接也不麻烦。QGC 的通信设置里新建一个 UDP 连接监听端口填 14550目标端口填 14540一般就通了。注意端口别写反我在这上面浪费过十分钟。另一种隐蔽情况是虚拟机。如果你在 Windows 上用 VMware 跑 UbuntuQGC 和 PX4 仿真都在虚拟机里面那一般没问题但如果你 QGC 装在 Windows 宿主PX4 在虚拟机里两者之间的网络桥接配置就要额外处理最容易直接卡在这一步。所以初学者最好全程在同一个系统里搞定所有事。5.2 仿真里的解锁逻辑QGC 连上以后界面上有个大大的Arm按钮不同版本叫法略有差异。点它飞控进入解锁准备状态再配合 Gazebo 窗口里已经加载的飞机你就能用左下角的滑条起飞了。需要提醒的是SITL 里 GPS 是仿真出来的所以 QGC 的地图可能显示飞机在某个不存在的点上这很正常。起飞是否成功看 QGC 的飞行界面高度读数变化。5.3 内八解锁到底要设置什么参数这个问题很多人在帖子里问。我要先泼一盆冷水纯 SITL 环境里你根本不需要纠结内八外八QGC 点按钮就能解锁。换成真实遥控器解锁的关键不在于某个单独的内八参数而是一整套条件遥控器完成了校准通道方向正确。RC_MAP_ARM_SWITCH参数没有被映射到某个拨杆通道。一旦映射了飞控会认为你想用拨杆解锁这时候摇杆手势就不再生效。解锁时油门必须在最低位方向舵偏航打到一侧保持一两秒。如果你检查完这几点还是不解锁先看飞行模式是否切到了可以解锁的模式比如 Position 或 Manual再查 QGC 的操纵杆故障诊断界面。实际经验里八成不是参数不对而是遥控器通道校准没做干净。5.4 用 QGC 查看仿真内部状态QGC 的价值不只在显示飞行数据。它还可以看飞控参数、实时调 PID、抓日志。在 Analzye Tools不同版本叫法可能不同里能看到日志下载功能。SITL 模式下PX4 会把飞控日志写到~/PX4-Autopilot/build/px4_sitl_default/tmp/rootfs/fs/microsd/log这里。这条路径很长但你只需要记住QGC 里的日志也能导出和真实飞控的使用习惯一致。6. 跑这套链路最容易踩的五个坑6.1 Gazebo 模型下载卡死Gazebo Classic 启动时如果当前环境没有某个模型会自动去网上下载。国内网络环境下这一卡就是五分钟起步界面看着像死机。解决办法是先手动把模型下载好放到本地。常见的做法是去模型数据库里找到x500、sun、ground_plane这几个模型下载后解压到~/.gazebo/models/目录下。之后 Gazebo 启动就不会再往外面请求资源。还有一个细节模型文件名和 Gazebo 寻找的名字必须完全一致大小写都不能错。目录名字错了照样报找不到模型。6.2 端口占用导致连接失败最常见的是 14550 被其他程序占用。你之前可能装过其他地面站软件或者上一次 QGC 退出时没有释放端口。排查命令sudo lsof -i :14550看到有进程占着先杀掉再重新启动仿真。如果是 QGC 自己没退出干净直接重启系统更省事。6.3 无图形环境或者 WSL 里的坑如果你用的是 WSL2默认没有图形界面Gazebo 会启动失败。WSL2 现在支持 WSLg可以显示窗口但性能一般。更稳的选择是装一套 Ubuntu 22.04 桌面系统或者用 Windows 宿主机上的 Gazebo但这会引入跨系统通信问题。所以再次强调新手统一起步别一开始就搞分布式。6.4 编译慢到你怀疑人生PX4 的 SITL 编译涉及大量 C 代码。给两个提升速度的思路开启 ccache 缓存sudo apt install ccache之后第二次编译快非常多。用 Ninja 做生成器PX4 默认已经配置了 Ninja所以关键是不要反复全量编译只编译改动过的部分。如果只是改了某个模块你可以直接make px4_sitl gazebo_x500不要在 make 前随便加clean除非你想从零开始。6.5 常见错误对照表现象可能原因解决思路bind: Address already in use14550 端口被占用lsof -i :14550查进程并处理QGC 连不上仿真端口不对或没开检查 UDP 14550/14540 配置ROS 2 没有 DDS 话题Agent 没启动或 RMW 不一致检查 8888 端口、统一用 Fast DDSGazebo 长时间黑屏模型下载卡住手动部署模型到~/.gazebo/models编译缺依赖ubuntu.sh 没完整跑完重跑脚本或按报错逐个安装启动报找不到型号PX4 版本和模型命名不匹配检查是gazebo_x500还是gz_x5007. 进阶视角这套链路迁到实机时要改什么7.1 仿真和真机的三大差异很多人在仿真里飞得溜一上真机就懵。因为这套链路有三大差异传感器噪声。仿真里的 GPS、IMU 数据过于理想真机里 GPS 漂移、震动噪声全来。执行器延迟。Gazebo 的电机模型是理想响应真机电机和电调存在延迟和温漂。通信环节。仿真里 PX4、Gazebo、QGC 全在一个系统不存在信号遮挡和延迟。这提醒我们一个重要原则仿真验证的是逻辑不是稳定性。解锁、起飞、降落这套基本流程可以在仿真里跑通但 PID 参数必须带真机微调。7.2 板载计算机这类架构怎么摆最近不少人问我在 RK3588 这类板载计算机上怎么开发 PX4。我见到的正规做法一般是飞控比如 Pixhawk 系列跑 PX4 固件负责姿态控制、电机驱动RK3588 作为板载计算机跑 ROS 2、视觉识别路径规划通过串口或以太网与飞控通信。在这种架构里PX4 和板载计算机之间同样可以用 XRCE-DDS 或 MAVLink 通信。PX4 把姿态、传感器数据发出来板载计算机处理完成后把期望速度或目标位置发回给飞控。QGC 作为地面站也通过同一路通信通道监控整个系统。7.3 什么可以继续保留你在这套仿真里学会的几件事迁移到实机后一点都不会浪费PX4 的编译方式和固件更新逻辑。QGC 的调参与日志分析方法。ROS 2 和 PX4 的数据接口尤其是fmu/out和fmu/in系列的话题。解锁前的安全检查清单。我自己最大的体会是这套东西的价值不在于仿真里能飞而在于它把真实开发流程完整压扁在了一台电脑上。你调试 PID、分析日志、验证传感器融合的姿态和真机操作几乎是一套逻辑。把这里的习惯养好真机上手会从容很多。