编译ArduPilot固件
- 以管理员权限运行Ubuntu22.04。
[!NOTE] 本文适用编译环境为WIN11 24H2及以上版本、WSL2、ubuntu22.04。
下载ArduPilot源码
- 执行以下命令fork官方源码到子系统
git clone --recursive https://github.com/ArduPilot/ardupilot.git - 回车执行命令,等待下载完成

[!NOTE] 源代码下载及编译环境包需要良好的网络环境,否则可能卡住或者安装不完整,后续编译出现各种问题,请自行施以魔法!
- 使用命令进入ardupilot文件夹
cd ardupilot

切换分支
- 输入命令,切换到目标分支
[!NOTE] 下载的代码默认分支为master,这个分支是主分支,为最新代码;不是经过验证测试的版本,通常我们需要使用
git checkout命令切换到稳定版本的分支。根据当前最新的稳定版本切换分支,编辑教程时最新稳定版本为4.6.3分支
//根据机型选择一个命令;命令格式为:git checkout 载具类型-版本号。
| 命令 | 注释 |
|---|---|
git checkout Copter-4.6.3 |
// 切换至多轴4.6.3稳定版分支 |
git checkout Plane-4.6.3 |
// 切换至固定翼/垂起4.6.3稳定版分支 |
git checkout Rover-4.6.3 |
// 切换至无人车/无人船4.6.3稳定版分支 |
git checkout ArduSub-4.5.0 |
// 切换至潜航器4.5.0稳定版分支 |
查询当前分支
- 输入以下命令,可查询当前处于的分支
git branch

更新子模块
[!TIP] 此步骤相当重要,每次切换了版本分支,都要执行一次更新子模块的命令,否则可能会导致编译报错。
git submodule update --init --recursive
安装开发环境
sudo apt-get update
sudo apt-get upgrade -y
Tools/environment_install/install-prereqs-ubuntu.sh -y

[!NOTE] 源代码下载及编译环境包需要良好的网络环境,否则可能卡住或者安装不完整,后续编译出现各种问题,请自行施以魔法!
安装交叉编译环境
sudo apt update
sudo apt install gcc-arm-none-eabi
配置waf
./waf configure
设置配置的板子
格式为./waf configure --board 固件名称。
[!NOTE] 固件名称只有板子名称的为标准固件,带DBSHOT的固件适用于于bdshot电调;带ODID的固件为支持远程ID模块的固件。

//以编译X25 EVO支持C-RID的固件为例
./waf configure --board CUAV-X25-EVO-ODID
执行编译固件命令,生成固件。
| 机型类型 | 编译命令 |
|---|---|
| 多轴(Copter) | ./waf copter |
| 固定翼(Plane) | ./waf plane |
| 巡航车(Rover) | ./waf rover |
| 直升机(Heli) | ./waf heli |
- 等待编译执行完成,需要编译1000多个文件,完成编译后系统会显示固件文件存放位置。

- 打开固件目录,
这五个文件都是 ArduPilot 编译生成的固件文件,但它们的格式、包含的内容以及适用的烧录场景各不相同。
| 文件名 | 类型 | 用途说明 |
|---|---|---|
| arducopter | 可执行文件 | ELF 格式文件。这是编译生成的原始可执行文件,包含了调试符号(Debug Symbols)。它主要用于开发者调试(如使用 GDB 调试),体积最大,通常不直接用于烧录到飞控中。 |
| arducopter.abin | ABIN 文件 | 带头部的二进制文件。这是 ArduPilot 自定义的一种格式,在普通二进制文件前添加了头部信息。通常用于特定的固件更新机制或工具链处理。 |
| arducopter.apj | JSON 文件 | 固件描述文件。实际上是一个文本文件,里面包含了固件的元数据(如版本号、git hash、板子类型等)以及固件的二进制数据。这是 Mission Planner (MP)、QGroundControl (QGC) 等地面站软件识别和烧录的主要文件格式。 |
| arducopter.bin | BIN 文件 | 纯二进制文件。这是剥离了调试信息和文件头后的纯机器码。它通常用于DFU 模式烧录,或者通过某些特定的 Bootloader 进行更新。 |
| arducopter_with_bl.hex | HEX 文件 | 带 Bootloader 的固件。这是一个 Intel HEX 格式文件,它同时包含了 Bootloader 和 固件本身。主要用于使用 ST-Link、J-Link 等硬件调试器进行烧录,或者在飞控完全变砖(Bootloader 丢失)时进行恢复。 |
[!NOTE] 唯一识别码等信息存储于bootloader,如果从普通固件更新至支持ODID固件,需要更新ODID固件专用的bootloader,否则功能将运行异常。
固件烧录
到这里固件编译已经完成,可看固件烧录教程,将固件写入固件中。
常见问题
1、编译遇到问题,怎么办? 答:可以拍摄错误图片,上传至千问等AI助手(不推荐豆包),90%的问题,AI已经能告诉您怎么解决。
2、ArduPilot下载不下来或很慢,怎么办?
答:施以魔法,可以有效提速或者使用国内源。
3、卡在0%[Connecting to security.ubuntu.com]
答:施以魔法,可以有效提速或者使用国内源。
- 输入
Ctrl + C中断执行命令 - 输入以下指令切换到国内源
//备份原来的源列表
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
``
//使用命令直接换成阿里云的源列表(针对 Ubuntu 22.04 Jammy)
sudo bash -c 'cat > /etc/apt/sources.list <<EOF
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF'
4、WSL魔法无效?
答:开启WSL2镜像模式。
在您的windows用户目录(通常是 C:\Users\你的用户名\ )下,新建或编辑一个名为`.wslconfig`的文件。
在文件中添加内容:
[experimental]
networkingMode=mirrored
- 点击保存
-重启WSL,以管理员身份运行PowerShell,输入以下命令重启WSL。
wsl --shutdown
5、编译到一半失败,重新编译代码
如果编译失败可以在编译前执行以下命令清除配置,然后重新配置。
./waf distclean ./waf configure --board 固件名 ./waf copter ```