2. 开发环境搭建:Ubuntu下的PX4固件编译环境、QGC地面站与仿真环境配置

说实话,做嵌入式飞控开发,环境搭建往往是第一道坎。我见过太多人卡在这一步,明明代码逻辑没问题,编译就是过不去。说白了,环境没配好,后面全是白搭。

这一章,我就带你一步步把PX4的编译环境、QGC地面站和Gazebo仿真环境全部搞定。嗯,都是我在项目中反复验证过的流程,你照着来就行。

2.1 系统准备与基础依赖

我个人习惯用 Ubuntu 20.04 LTS,这是目前PX4官方支持最稳定的版本。当然,22.04也行,但有些依赖包版本需要手动调整。

⚠️ 注意: 不要用WSL1,WSL2勉强能用但USB透传有问题。建议直接双系统或实体机安装。

先更新系统,这是老生常谈了:

sudo apt update
sudo apt upgrade -y

然后安装基础编译工具链:

sudo apt install -y \
    git zip cmake build-essential \
    ninja-build exiftool \
    python3-pip python3-dev \
    astyle libxml2-utils \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev

这里有个坑——exiftool 很多人会漏掉,但PX4的固件签名需要它。我曾经有一次编译完刷进去飞控不认,查了半天才发现是签名校验失败。

2.2 PX4固件编译环境

2.2.1 克隆源码

我建议你创建一个专用工作目录,别散得到处都是:

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

--recursive 这个参数很重要,它会一并拉取所有子模块。如果你忘了加,后面编译会报一堆莫名其妙的错误。

2.2.2 安装ARM交叉编译工具链

飞控固件是ARM架构的,所以需要交叉编译器。PX4官方提供了一个自动化脚本:

make px4_sitl_default

第一次运行这个命令,它会自动检测并安装缺失的工具链。但说实话,这个脚本有时候会卡在网络问题上。我建议你手动装:

sudo apt install -y gcc-arm-none-eabi gdb-multiarch

验证一下版本:

arm-none-eabi-gcc --version

输出应该类似 arm-none-eabi-gcc (GNU Arm Embedded Toolchain) 10.3-2021.10。如果版本太老,后面编译某些新模块会报错。

2.2.3 编译固件

先试试编译仿真版本,这个不需要硬件:

cd ~/px4_workspace/PX4-Autopilot
make px4_sitl_default gazebo

第一次编译会比较慢,大概10-20分钟,取决于你的机器配置。编译成功后你会看到类似这样的输出:

[100%] Built target px4
SITL: Starting gazebo...
💡 小技巧: 如果你只需要编译特定机型,比如 make px4_fmu-v5_default 对应Pixhawk 4,make px4_fmu-v6x_default 对应Pixhawk 6X。别每次都全量编译,浪费时间。

编译实际飞控固件时,用这个命令:

make px4_fmu-v5_default

生成的固件在 build/px4_fmu-v5_default/px4_fmu-v5_default.px4。这个文件就是你要刷到飞控里的。

2.3 QGC地面站配置

QGroundControl(QGC)是PX4最常用的地面站。我建议用 每日构建版,稳定版功能更新太慢。

2.3.1 安装QGC

下载AppImage文件:

cd ~/Downloads
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage
chmod +x QGroundControl.AppImage

然后把它放到一个固定位置,比如 ~/Applications/:

mkdir -p ~/Applications
mv QGroundControl.AppImage ~/Applications/

第一次运行需要安装一些依赖:

sudo usermod -a -G dialout $USER
sudo apt install -y libfuse2

然后重启一下,或者重新登录让用户组生效。

2.3.2 连接飞控

用USB线连接飞控,运行QGC:

~/Applications/QGroundControl.AppImage

正常情况下,QGC会自动识别飞控。如果没识别,检查一下:

  • USB线是不是数据线(有些充电线不能用)
  • 飞控有没有上电(光靠USB供电有时不够)
  • ls /dev/ttyACM* 看看设备有没有出现
⚠️ 注意: 如果你同时开了多个QGC实例,或者之前有残留进程,可能会占用串口。用 sudo lsof /dev/ttyACM0 查一下谁在用。

2.4 Gazebo仿真环境

Gazebo是PX4官方推荐的仿真器。说实话,我刚开始用的时候也觉得它笨重,但后来发现它的物理引擎确实准,尤其是做测绘航线仿真时,地形跟随效果很真实。

2.4.1 安装Gazebo

如果你已经用 make px4_sitl_default gazebo 编译过,Gazebo应该已经自动装好了。但为了保险,可以手动确认:

sudo apt install -y gazebo11 libgazebo11-dev

验证安装:

gazebo --version

输出类似 Gazebo multi-robot simulator, version 11.x.x。

2.4.2 启动仿真

最简单的启动方式:

cd ~/px4_workspace/PX4-Autopilot
make px4_sitl_default gazebo

这会启动一个默认的iris四旋翼模型,停在某个坐标点。你可以用QGC连接它——QGC会自动发现仿真环境中的飞控。

如果你想指定起飞位置,比如模拟某个测绘区域:

make px4_sitl_default gazebo PX4_SITL_LAT=39.9042 PX4_SITL_LON=116.4074

这是北京天安门的坐标。你想想看,做测绘航线规划时,用真实坐标仿真,后面实际飞的时候几乎不用改参数。

2.4.3 常用仿真命令

命令 说明
make px4_sitl_default gazebo 启动默认iris四旋翼仿真
make px4_sitl_default gazebo-classic 启动旧版Gazebo(某些机型需要)
make px4_sitl_default gazebo_typhoon_h480 启动六旋翼Typhoon H480模型
make px4_sitl_default gazebo_plane 启动固定翼模型

2.5 整体环境结构

下面这张图,是我画的环境搭建整体架构。你看一眼,心里就有数了:

PX4开发环境架构图 PX4 开发环境整体架构 用户代码 / 模块 QGC 地面站 MAVSDK / ROS 2 PX4 中间件 (uORB / MAVLink) 参数系统 | 日志系统 | 模块管理器 PX4 固件 (ARM) 实际飞控硬件 Gazebo 仿真器 SITL 软件在环 💡 说明: 编译环境负责生成固件(ARM)和仿真二进制(SITL);QGC通过MAVLink与飞控通信; Gazebo提供物理仿真环境,支持多机型、多地形、多传感器模拟。

2.6 常见问题与避坑

环境搭建过程中,有几个坑我踩过不止一次,列出来你注意一下:

  • Python版本冲突: PX4依赖Python 3.8+,但某些工具链需要Python 3.6。我建议用 virtualenv 隔离环境。
  • 磁盘空间不足: 完整编译一次大概占5-8GB,加上Gazebo模型库,轻松超过20GB。给虚拟机分配至少40GB。
  • 网络问题: git submodule update 经常超时。可以用 git submodule update --init --recursive --depth 1 减少拉取量。

✅ 验证环境是否搭好:

  1. 运行 make px4_sitl_default gazebo,看到Gazebo窗口弹出
  2. 启动QGC,看到仿真飞控自动连接(显示"Vehicle 1 connected")
  3. 在QGC里点"Arm"按钮,电机应该转起来

三步都通过,说明环境完全OK。后面就可以开始写代码了。

嗯,环境搭建就到这里。别嫌麻烦,这一步做好了,后面开发会顺畅很多。我曾经在一个项目里因为环境问题折腾了两天,后来发现只是少装了一个库。你按这个流程走,应该半小时就能搞定。