3、环境搭建(下):Gazebo与QGroundControl安装、固件源码下载与编译、首次启动SITL仿真验证

上一章我们把 Ubuntu 和基础工具链搞定了。这一章更实在——把仿真环境真正跑起来。

说实话,我第一次搭这套环境的时候,光编译就卡了整整一个下午。后来发现是依赖没装全,make 到一半报错,又得从头来。所以这一章我会把每一步的坑都指出来,你跟着走,基本不会翻车。

3.1 安装 Gazebo 仿真器

Gazebo 是 PX4 SITL 的主力仿真后端。它负责模拟传感器、物理碰撞、地形和光照。说白了,你的飞控代码在 Gazebo 里看到的,就是一套虚拟的 IMU、GPS、气压计和摄像头。

版本选择:PX4 官方推荐 Gazebo 9 或 Gazebo 11。我建议直接上 Gazebo 11,兼容性更好,而且后续的 ROS 2 集成也方便。

安装命令很简单,一行搞定:

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 连接到虚拟飞控,就像连接一台真飞机一样。

安装步骤:

  1. 下载 AppImage 文件:wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage
  2. 赋予执行权限:chmod +x QGroundControl.AppImage
  3. 安装串口依赖:sudo usermod -a -G dialout $USER(然后注销重新登录)
  4. 运行:./QGroundControl.AppImage
权限问题:如果不加 dialout 组,QGC 可能无法识别串口设备。虽然 SITL 仿真用不到真串口,但后续实飞时这一步是必须的。我建议现在就配好,省得后面再折腾。

我第一次用 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
版本选择建议:v1.13.x 是目前最稳定的长期支持版本。v1.14 虽然新,但有些仿真模型还没完全适配。如果你是为了学习,v1.13 足够用了。

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 窗口一片漆黑,或者飞机沉到地底下,通常是模型文件没加载成功。检查一下 ~/.gazebo/models 目录是否存在,以及网络是否通畅。我遇到过好几次因为公司网络限制,模型下载失败导致仿真崩溃。

3.6 验证仿真是否正常工作

仿真启动后,别急着关。做几个简单的验证:

  1. 检查飞控状态:在终端输入 commander status,应该看到 Preflight 或 Standby 状态。
  2. 查看传感器数据:输入 sensor_combined status,能看到 IMU 和 GPS 数据在更新。
  3. 在 QGC 里解锁:点击右上角的滑块,切换到 Armed 状态。电机应该开始旋转(在 Gazebo 里能看到螺旋桨转动)。
  4. 发送起飞指令:在 QGC 里点击 Takeoff,飞机应该缓缓升空。

如果以上步骤都正常,恭喜你——SITL 仿真环境搭建成功了。

我记得第一次看到虚拟飞机在 Gazebo 里飞起来的时候,还挺有成就感的。虽然只是几行代码和一堆模型文件,但背后是整个 PX4 飞控栈在真实运行。这种感觉,比看 PPT 学理论强多了。

3.7 本章知识体系

下面这张图总结了本章的核心流程和组件关系:

SITL 仿真环境搭建流程 Gazebo 仿真器 QGroundControl PX4 固件源码 SITL 编译 仿真启动验证 核心逻辑: Gazebo 提供物理环境 → QGC 提供人机交互 → PX4 固件提供飞控逻辑 → 三者通过 mavlink 通信

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 这两步,千万别省。