3. PX4 SITL 环境搭建:Ubuntu 下的编译、Gazebo 联调与 QGC 连接
好,咱们进入实战环节。这一章,我带你亲手把 PX4 SITL 环境搭起来。说白了,就是让你的电脑变成一个虚拟的无人机,能跑飞控代码,能看 3D 仿真画面,还能用地面站控制它。
很多新手在这一步容易卡住。不是编译报错,就是 Gazebo 黑屏,要么 QGC 连不上。别急,我把常见的坑都踩过一遍,咱们一步步来。
本章目标:在 Ubuntu 20.04/22.04 上,完成 PX4 固件编译、Gazebo 仿真器启动、QGroundControl 连接,最终实现“一键起飞”的 SITL 仿真。
3.1 环境准备:Ubuntu 与依赖安装
我建议你用一个干净的 Ubuntu 系统。虚拟机也行,但性能会打折扣。我自己的习惯是用 Ubuntu 22.04,配合 PX4 v1.14 以上的版本,兼容性最好。
先更新系统,然后安装基础依赖。别跳过这步,我见过有人直接编译,结果缺了十几个包,折腾半天。
sudo apt update
sudo apt upgrade -y
sudo apt install -y \
git zip cmake build-essential genromfs ninja-build \
libncurses5-dev libxml2-dev libssl-dev \
libgstreamer-plugins-base1.0-dev \
python3-pip python3-dev python3-venv \
protobuf-compiler libprotobuf-dev \
qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools \
libeigen3-dev libopencv-dev
小提示:如果你用的是 Ubuntu 20.04,记得把 Python 版本确认一下。PX4 的编译脚本对 Python 3.8+ 支持最好。我遇到过 Python 3.6 导致编译到一半报错的情况。
3.2 获取 PX4 源码与编译
源码从 GitHub 拉取。我个人习惯用 --recursive 参数,一次性把子模块都拉下来,省得后面再补。
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
拉完代码后,运行自动安装脚本。它会帮你装好 Gazebo、MAVSDK 等工具链。
bash ./Tools/setup/ubuntu.sh
这个过程可能持续 10-20 分钟,取决于你的网速。它会安装 Gazebo 9/11(看你 Ubuntu 版本),以及一些 Python 依赖。
安装完成后,重启一下终端,或者重新加载环境变量:
source ~/.bashrc
然后,我们来编译 PX4 固件。先试试编译一个标准的目标机,验证工具链是否正常。
make px4_sitl_default
第一次编译会比较慢,因为要下载交叉编译工具链。看到类似下面的输出,就说明编译成功了:
[100%] Linking CXX executable px4
px4 starting.
注意:如果编译过程中出现 fatal error: 'mavlink/v2.0/...' 之类的错误,说明子模块没拉全。执行 git submodule update --init --recursive 补一下。
3.3 Gazebo 仿真器联调
编译通过后,我们来启动 Gazebo 仿真。PX4 提供了一个很方便的 make 目标,直接帮你启动 SITL 和 Gazebo。
make px4_sitl gazebo
你会看到终端里 PX4 飞控启动,同时 Gazebo 窗口弹出来,显示一架 Iris 四旋翼停在跑道上。
为什么会这样?make px4_sitl gazebo 这个命令,实际上做了三件事:
- 启动 PX4 SITL 实例(模拟飞控硬件)
- 启动 Gazebo 客户端(显示 3D 场景)
- 建立 PX4 与 Gazebo 之间的 MAVLink 通信
我刚开始做仿真时,总以为 Gazebo 和 PX4 是分开启动的。其实它们通过 UDP 端口 14560 通信。你可以用 netstat -tulpn 查看端口占用情况。
如果你想换机型,比如固定翼或者垂直起降机,可以这样:
make px4_sitl gazebo_plane # 固定翼
make px4_sitl gazebo_standard_vtol # 垂直起降
避坑指南:我曾经在 Gazebo 启动后,发现飞机一直往下掉,根本飞不起来。后来发现是 Gazebo 的物理引擎没加载地面模型。解决办法是检查 ~/.gazebo/models 目录,确保有地面模型。如果缺失,运行 gazebo --verbose 看日志,手动下载模型。
3.4 QGroundControl 连接
仿真跑起来了,但怎么控制飞机呢?这时候需要地面站——QGroundControl(简称 QGC)。
QGC 通过 UDP 连接到 PX4 SITL。默认情况下,PX4 SITL 会在本机的 14550 端口监听 MAVLink 数据。
下载 QGC 的 AppImage 版本,直接运行:
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage
chmod +x QGroundControl.AppImage
./QGroundControl.AppImage
启动后,QGC 会自动检测到本地的 SITL 实例。你会看到右上角显示“连接中”,然后变成“已连接”。
如果没连上,检查一下网络设置。QGC 默认监听 UDP 14550,而 PX4 SITL 默认也是这个端口。如果端口被占用,可以手动指定:
make px4_sitl gazebo PX4_SIM_UDP=14551
然后在 QGC 的“通信设置”里,添加一个 UDP 连接,端口设为 14551。
验证连接:在 QGC 里,点击“起飞”按钮。如果 Gazebo 里的飞机开始上升,说明整个链路通了。恭喜你,SITL 环境搭建成功!
3.5 整体架构:一张图看懂
为了让你更清楚整个系统的数据流,我画了一张架构图。它展示了 PX4 SITL、Gazebo 和 QGC 三者之间的关系。
3.6 常见问题与排查
环境搭建过程中,你可能会遇到一些问题。我把最常见的几个列出来,附上解决办法。
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| Gazebo 黑屏,只有地面 | 模型文件未下载完成 | 运行 gazebo --verbose 查看日志,手动下载缺失模型 |
| QGC 显示“未连接” | 端口冲突或防火墙拦截 | 检查 14550 端口占用,或关闭防火墙测试 |
| 编译报错:找不到头文件 | 子模块未更新 | 执行 git submodule update --init --recursive |
| 飞机起飞后剧烈抖动 | PID 参数未调优 | SITL 默认参数偏保守,可尝试增大阻尼系数 |
重要提醒:如果你在虚拟机里运行 Gazebo,记得开启 3D 加速。否则 Gazebo 的帧率会很低,飞机控制会变得很奇怪。我踩过这个坑,当时以为是代码问题,折腾了两天才发现是虚拟机显卡没配置好。
3.7 验证:让飞机飞起来
环境搭好了,我们来验证一下。在 QGC 里,切换到“任务”模式,点击“起飞”按钮。设置一个 10 米的高度,然后确认。
你会看到 Gazebo 里的飞机开始旋转螺旋桨,然后缓缓上升。同时,QGC 的仪表盘上会显示高度、速度、GPS 坐标等信息。
如果一切正常,恭喜你!你已经拥有了一个完整的 PX4 SITL 仿真环境。接下来,你可以在这个环境里测试飞控逻辑、调试参数、甚至模拟故障场景。
我的习惯:每次修改飞控代码后,我都会先在 SITL 里跑一遍起飞-悬停-降落流程。这比直接上真机安全得多,也能快速发现逻辑错误。