Skip to content

编译ArduPilot固件

  • 以管理员权限运行Ubuntu22.04。

NOTE

本文适用编译环境为WIN11 24H2及以上版本、WSL2、ubuntu22.04。

下载ArduPilot源码

  • 执行以下命令fork官方源码到子系统
git clone --recursive https://github.com/ArduPilot/ardupilot.git
  • 回车执行命令,等待下载完成

wsl

NOTE

源代码下载及编译环境包需要良好的网络环境,否则可能卡住或者安装不完整,后续编译出现各种问题,请自行施以魔法!

  • 使用命令进入ardupilot文件夹
cd ardupilot

wsl

切换分支

  • 输入命令,切换到目标分支

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

wsl

更新子模块

TIP

此步骤相当重要,每次切换了版本分支,都要执行一次更新子模块的命令,否则可能会导致编译报错。

git submodule update --init --recursive

安装开发环境

sudo apt-get update
sudo apt-get upgrade -y
Tools/environment_install/install-prereqs-ubuntu.sh -y

wsl

NOTE

源代码下载及编译环境包需要良好的网络环境,否则可能卡住或者安装不完整,后续编译出现各种问题,请自行施以魔法!

安装交叉编译环境

sudo apt update
sudo apt install gcc-arm-none-eabi

配置waf

./waf configure

设置配置的板子

格式为./waf configure --board 固件名称

NOTE

固件名称只有板子名称的为标准固件,带DBSHOT的固件适用于于bdshot电调;带ODID的固件为支持远程ID模块的固件。

wsl

//以编译X25 EVO支持C-RID的固件为例

./waf configure --board CUAV-X25-EVO-ODID

执行编译固件命令,生成固件。

机型类型编译命令
多轴(Copter)./waf copter
固定翼(Plane)./waf plane
巡航车(Rover)./waf rover
直升机(Heli)./waf heli
  • 等待编译执行完成,需要编译1000多个文件,完成编译后系统会显示固件文件存放位置。

wsl

  • 打开固件目录,

wsl 这五个文件都是 ArduPilot 编译生成的固件文件,但它们的格式、包含的内容以及适用的烧录场景各不相同。

文件名类型用途说明
arducopter可执行文件ELF 格式文件。这是编译生成的原始可执行文件,包含了调试符号(Debug Symbols)。它主要用于开发者调试(如使用 GDB 调试),体积最大,通常不直接用于烧录到智能控制器中。
arducopter.abinABIN 文件带头部的二进制文件。这是 ArduPilot 自定义的一种格式,在普通二进制文件前添加了头部信息。通常用于特定的固件更新机制或工具链处理。
arducopter.apjJSON 文件固件描述文件。实际上是一个文本文件,里面包含了固件的元数据(如版本号、git hash、板子类型等)以及固件的二进制数据。这是 Mission Planner (MP)QGroundControl (QGC) 等地面站软件识别和烧录的主要文件格式。
arducopter.binBIN 文件纯二进制文件。这是剥离了调试信息和文件头后的纯机器码。它通常用于DFU 模式烧录,或者通过某些特定的 Bootloader 进行更新。
arducopter_with_bl.hexHEX 文件带 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

文档反馈:hongle@cuav.net