编译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.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 ```

results matching ""

    No results matching ""