2. ArduPilot源码编译与固件烧录:从GitHub拉取最新代码、配置编译环境、选择板卡类型(Pixhawk/CubeOrange)、编译与烧录流程

好,咱们进入实操环节。这一章我带你走一遍完整的编译烧录流程。说实话,很多新手在这步栽跟头——不是环境配不对,就是板子选错。我自己踩过的坑,今天全给你抖出来。

核心流程速览:拉取代码 → 配置环境 → 选择板卡 → 编译 → 烧录。每一步都有讲究,别跳。

2.1 从GitHub拉取最新代码

我个人习惯用 git clone 拉取完整仓库。为什么不直接下载zip?因为后续你要切换分支、更新代码,git管理方便得多。

# 克隆主仓库
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 更新子模块(这一步很关键,很多人漏掉)
git submodule update --init --recursive

注意:子模块更新这一步,网络不好的时候容易卡死。我曾经在客户现场演示时,等了20分钟还没拉完...建议提前配好代理,或者用国内镜像源。

拉完代码后,建议切到稳定分支。我一般用 Copter-4.5.xlatest,开发版虽然新功能多,但稳定性你懂的。

git checkout Copter-4.5.x

2.2 配置编译环境

环境配置是最大的坑。ArduPilot官方推荐Ubuntu 20.04或22.04,我用的是22.04 LTS。为什么?因为依赖包更全,少折腾。

直接上官方一键安装脚本:

cd ardupilot
Tools/environment_install/install-prereqs-ubuntu.sh -y

这个脚本会装好gcc-arm-none-eabi编译器、Python依赖、wxWidgets等。跑完后记得重启终端,或者手动刷新环境变量:

. ~/.profile

我的经验:如果你用的是Windows,别硬刚WSL。我试过WSL2编译,速度慢不说,USB透传烧录还经常掉线。老老实实装双系统或者用虚拟机,省心。

验证环境是否配好:

arm-none-eabi-gcc --version
python3 --version

看到版本号输出,说明环境基本ok。

2.3 选择板卡类型

ArduPilot支持几十种飞控板。咱们课程主要用两种:Pixhawk(经典款)和 CubeOrange(性能款)。

板卡 板卡代号 处理器 RAM Flash 适用场景
Pixhawk 1 PX4-v1 STM32F427 256KB 2MB 入门、教学、轻量无人机
Pixhawk 4 PX4-v4 STM32F765 512KB 2MB 中型多旋翼、固定翼
CubeOrange CubeOrange STM32H743 1MB 2MB 高端无人机、避障算法验证

怎么选?如果你只是学避障算法,Pixhawk 1完全够用。但如果你要跑复杂的视觉避障(比如基于深度相机的),我建议上CubeOrange——内存大,处理速度快,不容易卡死。

重要:板卡代号必须写对。写错了编译出来的固件刷进去,飞控直接变砖。我见过有人把PX4-v1写成PX4-v4,结果刷完飞控不启动,折腾了一下午才发现。

2.4 编译流程

编译前,先确认你要编译哪个固件类型。咱们做避障,主要用Copter(多旋翼)。

# 以CubeOrange为例
./waf configure --board CubeOrange
./waf copter

# 以Pixhawk 1为例
./waf configure --board PX4-v1
./waf copter

第一次编译会比较慢,大概10-20分钟。后面再编译就快了,因为waf会缓存中间文件。

小技巧:编译时加 -j4 参数可以加速,比如 ./waf copter -j4。但别开太多线程,我试过 -j8,电脑直接卡死...4核处理器用 -j4 最稳。

编译成功后,你会看到类似这样的输出:

Waf: Leaving directory `/home/user/ardupilot/build/CubeOrange'
'build' finished successfully (12.345s)

固件文件在 build/<板卡代号>/bin/ 目录下,文件名是 arducopter.apjarducopter_with_bl.hex

2.5 烧录流程

烧录有两种方式:通过USB(简单)和 通过SD卡(可靠)。我一般用USB,但如果你在野外没电脑,SD卡更实用。

方式一:USB烧录(推荐)

Mission PlannerQGroundControl 烧录。步骤:

  1. 飞控用USB连电脑
  2. 打开Mission Planner,选择正确的COM口和波特率(一般是115200)
  3. 点击「初始设置」→「安装固件」
  4. 选择「自定义固件」,找到刚才编译好的 .apj 文件
  5. 点击上传,等待进度条走完

避坑指南:我曾经在烧录时拔了USB线,结果飞控bootloader损坏,只能拆机用ST-Link重新刷。所以烧录过程中千万别断电、别拔线!

方式二:SD卡烧录(无电脑场景)

.apj 文件改名为 firmware.apj,放到SD卡根目录。插入飞控,上电,飞控会自动检测并烧录。烧录完成后,记得删掉SD卡里的固件文件,否则下次上电又会重刷。

2.6 验证固件是否烧录成功

烧录完成后,重新上电。用Mission Planner连接,查看「初始设置」→「系统信息」里的固件版本。如果显示你编译的版本号(比如 4.5.0-dev),说明成功了。

也可以看飞控的LED灯:正常启动后,LED会按特定模式闪烁(比如Pixhawk的蓝色灯慢闪)。如果灯不亮或者快闪,说明固件有问题。

我的习惯:每次烧录完,我都会做一次「传感器校准」和「加速度计校准」。因为不同固件版本对传感器参数的默认值可能不同,不校准的话,飞起来容易飘。

2.7 常见编译错误及解决

编译过程中,你可能会遇到这些错误。我列几个最常见的:

错误信息 原因 解决方法
arm-none-eabi-gcc: not found 编译器没装或路径不对 重新运行 install-prereqs-ubuntu.sh
fatal error: mavlink.h: No such file or directory 子模块未更新 运行 git submodule update --init --recursive
Board 'PX4-v1' not found 板卡代号写错 检查大小写和连字符,用 ./waf list_boards 查看所有支持的板卡
Error: flash overflow 固件太大,超出Flash容量 去掉一些不需要的功能模块,或者换大Flash的板卡

补充一句:如果你遇到 flash overflow,别慌。在 ./waf configure 时加 --enable-small-footprint 参数,可以裁剪掉一些不用的功能,减小固件体积。

2.8 本章知识体系

下面这张图,帮你理清整个编译烧录的脉络:

ArduPilot编译烧录知识体系 ① 拉取代码 git clone + 子模块 ② 配置环境 安装编译器+依赖 ③ 选择板卡 Pixhawk / CubeOrange ④ 编译 ./waf configure + copter ⑤ 烧录 USB / SD卡 ⑥ 验证 版本号 + LED灯 常见问题处理 编译器未找到 子模块缺失 Flash溢出 核心原则:先验证环境,再编译,最后烧录 每一步出错,回头检查上一步

嗯,到这里,编译烧录的整套流程就讲完了。你可能会觉得步骤多,但多做几次就熟了。我刚开始也是反复折腾,后来总结出这套流程,基本一次过。

最后提醒一句:每次修改代码后,记得重新编译。别问我为什么知道——我曾经改了个参数没重新编译,直接飞出去,结果避障算法根本没生效...那叫一个尴尬。


公众号:蓝海资料掘金营,微信deep3321