3、环境搭建(下):Gazebo与QGroundControl安装、固件源码下载与编译、首次启动SITL仿真验证
上一章我们把 Ubuntu 和基础工具链搞定了。这一章更实在——把仿真环境真正跑起来。
说实话,我第一次搭这套环境的时候,光编译就卡了整整一个下午。后来发现是依赖没装全,make 到一半报错,又得从头来。所以这一章我会把每一步的坑都指出来,你跟着走,基本不会翻车。
3.1 安装 Gazebo 仿真器
Gazebo 是 PX4 SITL 的主力仿真后端。它负责模拟传感器、物理碰撞、地形和光照。说白了,你的飞控代码在 Gazebo 里看到的,就是一套虚拟的 IMU、GPS、气压计和摄像头。
安装命令很简单,一行搞定:
sudo apt install gazebo11 libgazebo11-dev
装完之后验证一下:
gazebo --version
如果看到类似 Gazebo multi-robot simulator, version 11.x.x 的输出,就说明装好了。
嗯,这里要注意——Gazebo 启动时会加载一堆模型文件,第一次运行会比较慢。我建议你提前把模型缓存拉下来:
git clone https://github.com/osrf/gazebo_models.git ~/.gazebo/models
这样后面启动仿真就不会卡在下载模型上了。
3.2 安装 QGroundControl 地面站
QGC 是 PX4 生态里最常用的地面站。它负责显示飞行数据、发送指令、查看日志。SITL 仿真时,QGC 会通过 UDP 连接到虚拟飞控,就像连接一台真飞机一样。
安装步骤:
- 下载 AppImage 文件:
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage - 赋予执行权限:
chmod +x QGroundControl.AppImage - 安装串口依赖:
sudo usermod -a -G dialout $USER(然后注销重新登录) - 运行:
./QGroundControl.AppImage
我第一次用 QGC 时,发现它默认会检查固件版本。仿真模式下,这个检查有时会弹警告。别慌,直接点忽略就行。
3.3 下载 PX4 固件源码
固件源码是 SITL 仿真的核心。我们用的是 PX4 Autopilot 官方仓库。
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
--recursive 参数很重要。它会同时拉取所有子模块——包括 mavlink、uavcan、ecl 等依赖库。如果漏了这一步,编译时会报一堆找不到头文件的错误。
我个人习惯在克隆完成后,再执行一次子模块更新,确保版本对齐:
git submodule update --init --recursive
然后切换到稳定版本。我建议用最新的 release 分支,而不是 main 分支。main 分支可能包含未完全验证的代码:
git checkout v1.13.3
3.4 编译固件
编译是整套流程里最容易出问题的一步。不过别怕,只要依赖装对了,基本就是等进度条走完。
先装编译依赖:
sudo apt install ninja-build exiftool ninja-build protobuf-compiler libeigen3-dev genromfs xmlstarlet libgstreamer-plugins-base1.0-dev
然后开始编译 SITL 目标:
make px4_sitl_default gazebo
这个命令会做三件事:
- 编译 PX4 飞控固件(SITL 版本)
- 生成 Gazebo 的飞机模型
- 建立飞控与仿真器的通信接口
我第一次编译时,等了大概 20 分钟。如果你的机器配置一般,可能更久。中间如果报错,多半是缺少某个依赖包。别慌,看报错信息里提示的包名,用 apt 装上再重新 make 就行。
make px4_sitl_default gazebo -j4 来并行编译。数字 4 表示用 4 个核心。根据你的 CPU 核心数调整,别设太大,否则容易把电脑搞卡死。
3.5 首次启动 SITL 仿真
编译成功后,启动仿真只需要一行命令:
make px4_sitl_default gazebo
等等,这和编译命令一样?对。PX4 的 make 系统会先检查是否需要重新编译,如果源码没变,就直接启动仿真。
启动后你会看到:
- 终端里飞控的 NuttShell 启动日志
- Gazebo 窗口弹出,显示一架四旋翼停在跑道上
- QGC 自动连接,显示飞机位置和姿态
如果 QGC 没有自动连接,检查一下 UDP 端口设置。SITL 默认在 127.0.0.1:14550 发送 mavlink 数据。QGC 的通信链接里要添加这个地址。
~/.gazebo/models 目录是否存在,以及网络是否通畅。我遇到过好几次因为公司网络限制,模型下载失败导致仿真崩溃。
3.6 验证仿真是否正常工作
仿真启动后,别急着关。做几个简单的验证:
- 检查飞控状态:在终端输入
commander status,应该看到Preflight或Standby状态。 - 查看传感器数据:输入
sensor_combined status,能看到 IMU 和 GPS 数据在更新。 - 在 QGC 里解锁:点击右上角的滑块,切换到
Armed状态。电机应该开始旋转(在 Gazebo 里能看到螺旋桨转动)。 - 发送起飞指令:在 QGC 里点击
Takeoff,飞机应该缓缓升空。
如果以上步骤都正常,恭喜你——SITL 仿真环境搭建成功了。
我记得第一次看到虚拟飞机在 Gazebo 里飞起来的时候,还挺有成就感的。虽然只是几行代码和一堆模型文件,但背后是整个 PX4 飞控栈在真实运行。这种感觉,比看 PPT 学理论强多了。
3.7 本章知识体系
下面这张图总结了本章的核心流程和组件关系:
3.8 常见问题与避坑
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 编译报错:找不到头文件 | 子模块未更新 | 执行 git submodule update --init --recursive |
| Gazebo 启动后黑屏 | 模型文件缺失 | 手动下载模型到 ~/.gazebo/models |
| QGC 无法连接 | UDP 端口不匹配 | 检查 QGC 通信链接是否设置为 127.0.0.1:14550 |
| 飞机起飞后剧烈抖动 | PID 参数未调优 | SITL 默认参数偏保守,可尝试增大 MC_ROLL_P 等参数 |
fatal error: mavlink/v2.0/... 之类的错误,八成是子模块没拉全。我曾经因为网络中断导致子模块下载不完整,排查了半小时才发现是这个问题。所以,--recursive 和 submodule update 这两步,千万别省。