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 对新硬件支持好一些。
环境搭建分三步走:
- 安装基础依赖——编译器、CMake、Python 工具链
- 安装 ARM 交叉编译链——给 Pixhawk 这类 STM32 飞控用
- 安装仿真依赖——如果你要做 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 本章知识体系:编译烧录全流程
下面这张图把整个流程串起来了。你跟着走一遍,基本不会出错。
3.6 常见问题与避坑指南
- 编译报错:找不到
uavcan头文件——八成是子模块没拉全。运行git submodule update --init --recursive补拉。 - 烧录失败:DFU 设备未识别——检查 USB 线,有些线只能充电不能传数据。换线试试。
- 飞控变砖:灯不亮、连不上 QGC——别慌。用镊子短接飞控上的 BOOT0 和 3.3V 引脚,再上电,进入 DFU 模式重新烧录。
- 参数没生效:烧完还是默认值——检查你修改的 airframe 文件是否被正确编译进去了。可以在
build/目录下搜索你的参数名确认。
我的建议:第一次编译固件,别急着改参数。先用默认配置编译一次,烧录进去确认飞控能正常工作。然后再改参数、重新编译。这样出了问题,你能快速定位是编译环境的问题,还是参数配置的问题。