3. 固件编译与烧录:从源码到飞控的完整链路

这一章,我们聊聊怎么把 PX4 源码变成能跑在飞控板上的固件。说白了,就是让代码「活」起来。

很多新手觉得编译固件很神秘,其实拆开来看就三步:拿到源码、搭好环境、按下编译。但每一步都有坑,我踩过的坑可不少。

3.1 源码获取:从 GitHub 拉取正确的分支

PX4 的源码托管在 GitHub 上,主仓库是 PX4/Firmware。但注意,测绘用途我建议拉取稳定版,别追最新。

核心命令:

git clone https://github.com/PX4/Firmware.git --recursive
cd Firmware
git checkout v1.13.3   # 我习惯用这个版本,测绘参数支持最稳

为什么要加 --recursive?因为 PX4 依赖很多子模块,比如 mavlink、uavcan。不加这个参数,编译到一半报错找不到头文件,你就得回来补拉。

我的经验:国内网络拉子模块经常超时。我一般用代理,或者提前把 .gitmodules 里的 URL 换成国内镜像。别等到编译报错才处理,那会浪费半小时。

3.2 编译环境搭建:Ubuntu 下的完整配置

PX4 官方推荐 Ubuntu 20.04 或 22.04。我两台都用过,20.04 更稳,22.04 对新硬件支持好一些。

环境搭建分三步走:

  1. 安装基础依赖——编译器、CMake、Python 工具链
  2. 安装 ARM 交叉编译链——给 Pixhawk 这类 STM32 飞控用
  3. 安装仿真依赖——如果你要做 SITL 仿真测试

直接上脚本:

# 1. 基础依赖
sudo apt update
sudo apt install git zip cmake build-essential genromfs ninja-build exiftool -y

# 2. Python 工具链
sudo apt install python3-pip python3-dev python3-venv -y
pip3 install --user kconfiglib jsonschema

# 3. ARM 交叉编译链(重点)
sudo apt install gcc-arm-none-eabi gdb-arm-none-eabi -y

# 4. 仿真依赖(可选,但建议装)
sudo apt install protobuf-compiler libprotobuf-dev libxml2-dev -y

我曾经踩过的坑:Ubuntu 自带的 gcc-arm-none-eabi 版本可能太老。PX4 v1.13 要求 GCC 版本 >= 9.3。装完后用 arm-none-eabi-gcc --version 检查一下。版本不够?去 ARM 官网下载最新版,手动解压到 /opt 目录,然后配环境变量。

3.3 自定义参数编译:让固件带上你的配置

测绘场景下,我们经常需要修改默认参数。比如把 EKF2_AID_MASK 改成 24(仅使用 GPS+气压计),或者把 GPS_DELAY 设成 200ms。

每次烧录完再通过 QGC 改参数,效率太低。我习惯直接把参数写进固件。

方法很简单:在 Firmware/ROMFS/px4fmu_common/init.d-posix/ 目录下,找到对应的 airframe 配置文件,比如 10016_plane_测绘。在文件末尾加上:

# 自定义测绘参数
param set EKF2_AID_MASK 24
param set GPS_DELAY 200
param set SENS_FLOW_MAXHGT 50
param set MPC_XY_VEL_MAX 8

然后重新编译,这些参数就会作为默认值烧进飞控。省去了每次手动配置的麻烦。

小技巧:如果你有多个测绘无人机,可以把参数文件单独抽出来,编译时用 make px4_fmu-v5_default CONFIG=my_mapping 指定配置。这样不同飞机用不同参数文件,互不干扰。

3.4 固件烧录方法:把编译好的固件写进飞控

编译完成后,在 Firmware/build/px4_fmu-v5_default/ 目录下会生成 px4_fmu-v5_default.px4 文件。这就是我们要烧录的固件。

烧录方式有三种,我按推荐度排序:

方法 工具 适用场景 我的评价
QGC 地面站 QGroundControl 日常升级、现场调试 最简单,USB 连上就能刷
命令行烧录 make px4_fmu-v5_default upload 开发调试、批量烧录 我最常用,一键搞定
SWD/JLink J-Flash / OpenOCD 变砖恢复、Bootloader 更新 救急用,平时不用碰

命令行烧录的具体操作:

# 确保飞控通过 USB 连接,并进入 DFU 模式
# 大部分 Pixhawk 按住安全按钮再上电即可进入 DFU

cd Firmware
make px4_fmu-v5_default upload

系统会自动检测 DFU 设备,烧录完成后飞控会自动重启。

注意:烧录过程中不要拔 USB 线,不要断电。我曾经手贱拔过一次,飞控变砖,最后用 JLink 才救回来。嗯,那次之后我烧录时都盯着进度条走完才松口气。

3.5 本章知识体系:编译烧录全流程

下面这张图把整个流程串起来了。你跟着走一遍,基本不会出错。

PX4 固件编译与烧录全流程 1. 源码获取 git clone + checkout 2. 环境搭建 依赖 + 交叉编译链 3. 参数配置 修改 airframe 文件 4. 编译固件 make px4_fmu-v5_default 5. 烧录固件 upload / QGC / JLink 6. 验证与测试 检查参数 / 传感器状态 💡 核心原则 先拉稳定分支 → 搭好环境再编译 → 参数写进固件 → 烧录后务必验证

3.6 常见问题与避坑指南

  • 编译报错:找不到 uavcan 头文件——八成是子模块没拉全。运行 git submodule update --init --recursive 补拉。
  • 烧录失败:DFU 设备未识别——检查 USB 线,有些线只能充电不能传数据。换线试试。
  • 飞控变砖:灯不亮、连不上 QGC——别慌。用镊子短接飞控上的 BOOT0 和 3.3V 引脚,再上电,进入 DFU 模式重新烧录。
  • 参数没生效:烧完还是默认值——检查你修改的 airframe 文件是否被正确编译进去了。可以在 build/ 目录下搜索你的参数名确认。

我的建议:第一次编译固件,别急着改参数。先用默认配置编译一次,烧录进去确认飞控能正常工作。然后再改参数、重新编译。这样出了问题,你能快速定位是编译环境的问题,还是参数配置的问题。