2. 固件编译与烧录:从源码到飞控的完整链路
这一章,我们聊聊怎么把 ArduPilot 的源码变成能跑在飞控板上的固件。说白了,就是让代码「活」起来。
很多新手觉得编译固件是件很玄乎的事。其实没那么复杂。我刚开始接触 ArduPilot 时,也对着终端窗口发过呆。后来踩了几个坑,慢慢就摸出门道了。
核心流程就三步:拿源码 → 搭环境 → 编译烧录。每一步都有讲究,我们一个一个说。
2.1 源码获取:从 GitHub 拉取 ArduPilot
ArduPilot 的源码托管在 GitHub 上。我个人习惯用 git clone 命令,而不是直接下载 ZIP 包。为什么?因为后续更新方便,切换分支也快。
# 克隆主仓库(推荐)
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
# 更新子模块(这一步不能省)
git submodule update --init --recursive
小技巧:如果你网络不好,可以加个 --depth=1 参数,只拉取最新版本,省流量也省时间。
拉完代码后,记得切到稳定分支。我见过有人直接在 master 分支上编译,结果遇到一些实验性的 bug。建议用 Copter-4.5.x 或 Plane-4.5.x 这类稳定分支。
git checkout Copter-4.5.7
2.2 编译环境搭建:Windows 与 Linux 双线作战
环境搭建是很多人卡壳的地方。我两种系统都用过,说说我的感受。
2.2.1 Linux 环境(推荐)
Linux 下编译最省心。Ubuntu 22.04 是我用得最多的版本。ArduPilot 官方提供了一个一键安装脚本,省了不少事。
# 安装基础依赖
sudo apt update
sudo apt install git python3-pip python3-venv
# 运行官方安装脚本
cd ardupilot
Tools/environment_install/install-prereqs-ubuntu.sh -y
# 重新登录终端,让环境变量生效
source ~/.profile
嗯,这里要注意:脚本执行时间比较长,取决于你的网速。它会安装交叉编译工具链、Python 包、以及一些底层库。我曾经在旧笔记本上跑这个脚本,等了快半小时。
2.2.2 Windows 环境(备选)
Windows 下我推荐用 WSL2(Windows Subsystem for Linux)。直接在 Windows 上装 Cygwin 或 MSYS2 也能编译,但坑比较多。
- 安装 WSL2 和 Ubuntu 22.04 发行版
- 在 WSL2 终端中执行上面的 Linux 安装脚本
- 把源码放在 WSL2 的文件系统内(别放 Windows 盘,会有权限问题)
避坑指南:我曾经把源码放在 /mnt/c/ 下编译,结果链接阶段报了一堆权限错误。后来老老实实放在 ~/ardupilot 下,问题就解决了。
2.3 使用 ardupilot_builder 编译特定机型固件
环境搭好了,接下来就是编译。ArduPilot 官方推荐用 ardupilot_builder 这个工具。它本质上是一个 Python 脚本,帮你管理编译配置。
2.3.1 安装 ardupilot_builder
pip install --user ardupilot-builder
装完之后,终端里就能用 ardupilot_builder 命令了。
2.3.2 编译特定机型
假设你要给 Pixhawk 4 编译一个四旋翼固件。命令是这样的:
ardupilot_builder copter --board Pixhawk4
如果你用的是 Cube Orange,那就改成:
ardupilot_builder copter --board CubeOrange
第一次编译会下载一些依赖,之后就会快很多。我实测过,Pixhawk4 的固件编译大概需要 3-5 分钟。
个人经验:编译时加个 -j4 参数,可以加快速度。比如 ardupilot_builder copter --board Pixhawk4 -j4。不过如果你的电脑内存小于 8GB,建议用 -j2,否则容易卡死。
2.3.3 常用板卡与编译命令对照
| 飞控板 | 编译命令 | 固件类型 |
|---|---|---|
| Pixhawk 4 | ardupilot_builder copter --board Pixhawk4 |
四旋翼 |
| Cube Orange | ardupilot_builder copter --board CubeOrange |
四旋翼 |
| Pixhawk 1 | ardupilot_builder plane --board Pixhawk1 |
固定翼 |
| Navio2 | ardupilot_builder rover --board Navio2 |
地面车 |
| Here4 | ardupilot_builder sub --board Here4 |
水下潜航器 |
编译完成后,固件文件会放在 ardupilot/build/<板卡名>/bin/ 目录下。文件名一般是 arducopter.apj 或 arduplane.apj。
2.4 通过 Mission Planner 或 QGC 烧录固件
固件编译好了,怎么写到飞控板里?两种主流地面站都能干这事。
2.4.1 使用 Mission Planner 烧录
- 用 USB 线连接飞控和电脑
- 打开 Mission Planner,选择正确的 COM 口和波特率(一般是 115200)
- 点击顶部菜单 初始设置 → 安装固件
- 选择 加载自定义固件,找到你编译好的
.apj文件 - 点击确认,等待烧录完成
注意:烧录过程中不要断开 USB 线,也不要给飞控断电。我曾经手贱拔了一次线,结果飞控变砖了,只能重新刷 bootloader 才救回来。
2.4.2 使用 QGroundControl 烧录
- 连接飞控,打开 QGC
- 点击左上角 Q 图标 → 车辆设置
- 选择 固件 选项卡
- 点击 选择固件文件,选中你的
.apj文件 - 点击 开始升级
QGC 的界面更现代一些,但核心逻辑和 Mission Planner 一样。我个人更习惯用 Mission Planner,因为它的参数树浏览起来更直观。
2.5 本章知识体系总览
下面这张图,把整个流程串起来了。你跟着箭头走一遍,心里就有数了。
2.6 常见问题与避坑指南
- 编译报错找不到 Python 包:检查一下是不是在虚拟环境里。退出虚拟环境,或者重新安装
ardupilot-builder。 - 烧录后飞控没反应:先确认固件类型对不对。四旋翼飞控刷了固定翼固件,肯定起不来。
- USB 连接不上:换根数据线。有些线只能充电,不能传数据。我遇到过好几次这种问题。
- 编译速度太慢:用
-j4参数,或者换台性能好点的电脑。
最后说一句:第一次编译成功时,那种成就感是很爽的。别怕出错,多试几次就熟了。实在搞不定,去 ArduPilot 的讨论区搜一搜,基本都能找到答案。