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.x 或 latest,开发版虽然新功能多,但稳定性你懂的。
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.apj 或 arducopter_with_bl.hex。
2.5 烧录流程
烧录有两种方式:通过USB(简单)和 通过SD卡(可靠)。我一般用USB,但如果你在野外没电脑,SD卡更实用。
方式一:USB烧录(推荐)
用 Mission Planner 或 QGroundControl 烧录。步骤:
- 飞控用USB连电脑
- 打开Mission Planner,选择正确的COM口和波特率(一般是115200)
- 点击「初始设置」→「安装固件」
- 选择「自定义固件」,找到刚才编译好的
.apj文件 - 点击上传,等待进度条走完
避坑指南:我曾经在烧录时拔了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 本章知识体系
下面这张图,帮你理清整个编译烧录的脉络:
嗯,到这里,编译烧录的整套流程就讲完了。你可能会觉得步骤多,但多做几次就熟了。我刚开始也是反复折腾,后来总结出这套流程,基本一次过。
最后提醒一句:每次修改代码后,记得重新编译。别问我为什么知道——我曾经改了个参数没重新编译,直接飞出去,结果避障算法根本没生效...那叫一个尴尬。
公众号:蓝海资料掘金营,微信deep3321