2. ArduPilot基础

这一章,我们聊聊怎么把 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 也能编译,但坑比较多。

  1. 安装 WSL2 和 Ubuntu 22.04 发行版
  2. 在 WSL2 终端中执行上面的 Linux 安装脚本
  3. 把源码放在 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 烧录

  1. 用 USB 线连接飞控和电脑
  2. 打开 Mission Planner,选择正确的 COM 口和波特率(一般是 115200)
  3. 点击顶部菜单 初始设置 → 安装固件
  4. 选择 加载自定义固件,找到你编译好的 .apj 文件
  5. 点击确认,等待烧录完成

注意:烧录过程中不要断开 USB 线,也不要给飞控断电。我曾经手贱拔了一次线,结果飞控变砖了,只能重新刷 bootloader 才救回来。

2.4.2 使用 QGroundControl 烧录

  1. 连接飞控,打开 QGC
  2. 点击左上角 Q 图标 → 车辆设置
  3. 选择 固件 选项卡
  4. 点击 选择固件文件,选中你的 .apj 文件
  5. 点击 开始升级

QGC 的界面更现代一些,但核心逻辑和 Mission Planner 一样。我个人更习惯用 Mission Planner,因为它的参数树浏览起来更直观。

2.5 本章知识体系总览

下面这张图,把整个流程串起来了。你跟着箭头走一遍,心里就有数了。

固件编译与烧录流程 固件编译与烧录核心流程 1. 源码获取 2. 编译环境搭建 3. 编译固件 4. 烧录到飞控 5. 验证与测试 关键点 • 使用稳定分支 • 子模块必须更新 • 推荐 Linux 环境 常见板卡 • Pixhawk 4 • Cube Orange • Navio2 / Here4 烧录工具 • Mission Planner • QGroundControl • 均支持自定义固件

2.6 常见问题与避坑指南

  • 编译报错找不到 Python 包:检查一下是不是在虚拟环境里。退出虚拟环境,或者重新安装 ardupilot-builder。
  • 烧录后飞控没反应:先确认固件类型对不对。四旋翼飞控刷了固定翼固件,肯定起不来。
  • USB 连接不上:换根数据线。有些线只能充电,不能传数据。我遇到过好几次这种问题。
  • 编译速度太慢:用 -j4 参数,或者换台性能好点的电脑。

最后说一句:第一次编译成功时,那种成就感是很爽的。别怕出错,多试几次就熟了。实在搞不定,去 ArduPilot 的讨论区搜一搜,基本都能找到答案。