2. PX4 SITL环境搭建:Ubuntu系统准备、PX4源码编译、Gazebo与jMAVSim仿真器选择、首次启动SITL

好,咱们直接进入正题。这一章我带你亲手把PX4的SITL环境搭起来。说实话,我第一次搭这个环境的时候,光是编译就折腾了大半天,各种依赖缺失、版本冲突。后来摸清了套路,其实也就那么几步。你跟着我的节奏来,别跳步骤,基本一次过。

2.1 Ubuntu系统准备——别在Windows上硬扛

我个人习惯用Ubuntu 20.04 LTS,这是目前PX4官方支持最稳定的版本。22.04也能用,但有些依赖包需要手动处理,新手容易踩坑。

⚠ 注意: 别用虚拟机跑SITL!除非你的宿主机内存超过32GB。Gazebo和PX4同时跑起来,16GB内存的虚拟机直接卡成PPT。我建议你直接装双系统,或者用WSL2(Windows Subsystem for Linux 2)也行,但WSL2对图形界面支持还是差点意思。

装好系统后,先把软件源更新一下:

sudo apt update
sudo apt upgrade -y

然后安装基础开发工具。这里有个坑——千万别一股脑全装,有些包是互斥的。我列个清单,你照着来:

包名 用途 备注
git 版本管理 必须
cmake 构建系统 版本≥3.10
ninja-build 加速编译 比make快3倍
python3-pip Python依赖 用于后续工具链
gcc-arm-none-eabi 交叉编译链 编译固件用
sudo apt install -y \
    git cmake ninja-build \
    python3-pip python3-venv \
    gcc-arm-none-eabi \
    libeigen3-dev libopencv-dev \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev
💡 我的经验: 装完这些后,最好重启一下。有些环境变量需要重新加载,否则编译时会报"找不到某某库"的错。我曾经因为这个排查了半小时,最后发现就是没重启。

2.2 PX4源码编译——从GitHub拉下来

源码编译是SITL的核心。你想想看,仿真器本质上就是在你的电脑上跑一个虚拟的飞控,所以必须把PX4固件编译成能在x86架构上运行的版本。

先找个干净的目录,我习惯放在~/workspace下:

mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

这里有个关键点:--recursive参数不能省。PX4依赖了很多子模块,比如mavlink、uavcan等。如果不加这个参数,你编译到一半就会报错,然后还得手动git submodule update --init --recursive,麻烦得很。

拉完代码后,运行自动安装脚本:

bash ./Tools/setup/ubuntu.sh

这个脚本会帮你装好所有依赖,包括Gazebo。但注意——它装的是Gazebo 9,而我们现在推荐用Gazebo 11。所以脚本跑完后,手动升级一下:

sudo apt install -y gazebo11 libgazebo11-dev

然后开始编译SITL目标:

make px4_sitl_default gazebo

第一次编译大概需要20-30分钟,取决于你的CPU。这时候你可以去泡杯咖啡。编译过程中如果报错,90%的情况是依赖没装全。别慌,看报错信息最后几行,它会告诉你缺什么包,装上再重新make就行。

🔑 核心概念: px4_sitl_default是编译目标,告诉编译器生成SITL版本而非真实硬件版本。gazebo是仿真器后端,表示编译时包含Gazebo的接口。这两个参数缺一不可。

2.3 Gazebo与jMAVSim仿真器选择——什么时候用哪个?

PX4支持两个仿真器:Gazebo和jMAVSim。很多新手会问:到底选哪个?我直接给你结论:

  • jMAVSim:轻量级,启动快,适合快速测试飞控逻辑、调参。但它只有四旋翼模型,没有传感器噪声模拟。
  • Gazebo:重量级,功能全,支持多旋翼、固定翼、VTOL、无人车、无人船。有物理引擎、传感器仿真、光照环境。但启动慢,吃资源。

我个人的工作流是这样的:

  1. 写代码阶段 → 用jMAVSim快速验证逻辑
  2. 调参阶段 → 用Gazebo跑完整仿真
  3. 硬件在环测试 → 用Gazebo + 真实飞控

下面这个图帮你理清选择逻辑:

仿真器选型决策流程 开始SITL仿真 需要传感器仿真? 是 否 Gazebo jMAVSim 需要多机型? 多机型? 是 OK 否 💡 建议: 日常开发用jMAVSim快速迭代,集成测试和硬件在环用Gazebo。两者可以共存,互不冲突。

2.4 首次启动SITL——见证奇迹的时刻

好,一切准备就绪。我们来启动第一个SITL实例。打开终端,进入PX4目录:

cd ~/workspace/PX4-Autopilot
make px4_sitl_default gazebo

如果之前已经编译过,这次会很快,只编译改动过的文件。编译完成后,Gazebo会自动启动,你会看到一个四旋翼模型出现在草地上。

但等等——这里有个细节。Gazebo启动后,PX4 shell也会在终端里出现。这个shell就是你的虚拟飞控控制台。你可以在这里输入命令:

pxh> commander takeoff
pxh> commander land

看到无人机起飞和降落了吗?嗯,这就是SITL的魅力——你不需要任何硬件,就能跑通整个飞控逻辑。

⚠ 常见问题: 如果Gazebo启动后一片空白,或者模型沉到地底下,通常是模型路径没设置对。执行以下命令:
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/workspace/PX4-Autopilot/Tools/sitl_gazebo/models
然后重新启动。我建议把这个export加到~/.bashrc里,一劳永逸。

另外,如果你想用jMAVSim启动,命令是:

make px4_sitl_default jmavsim

你会看到一个更简洁的3D界面,启动速度比Gazebo快得多。适合快速验证代码逻辑。

💡 我的习惯: 我一般开两个终端。一个跑SITL,另一个用mavlink-router或者mavproxy.py连接仿真器的UDP端口(默认14550)。这样我可以在第二个终端里发指令、看日志,不影响仿真器的运行。

首次启动成功后,你可以试试用QGroundControl地面站连接。打开QGC,它会自动发现SITL实例。你可以在QGC里看到姿态数据、GPS信息、电池电压等——和连接真实飞控一模一样。