3. 硬件选型与准备
说实话,很多初学者拿到ArduPilot源码后,第一反应就是懵。Git仓库怎么这么大?编译环境怎么搭?为什么同样的代码,别人能编译通过,我这里就报错?
我当年第一次编译ArduPilot时,光配置工具链就折腾了两天。后来带团队做项目,发现新人几乎都会在这个环节卡住。所以这一章,咱们就把「源码下载 → 工具链配置 → 固件编译 → 烧录验证」这条线彻底捋清楚。
本章核心目标:从零开始,在你的电脑上搭建一套完整的ArduPilot编译环境,并成功为一块真实的飞控板生成可运行的固件。
3.1 源码下载:选对分支,省一半时间
ArduPilot的源码托管在GitHub上,仓库地址是 https://github.com/ArduPilot/ardupilot。但我不建议你直接点「Download ZIP」——那样你会失去版本控制能力,后续想切分支、打补丁都很麻烦。
我个人习惯用 git clone --recursive,因为ArduPilot依赖多个子模块(比如 mavlink、uavcan),不加 --recursive 的话,后面编译时会疯狂报错。
# 标准克隆方式(推荐)
git clone --recursive https://github.com/ArduPilot/ardupilot.git
cd ardupilot
# 如果已经克隆了但没拉子模块
git submodule update --init --recursive
选分支的小技巧:稳定版用 Copter-4.5.x 或 Plane-4.5.x,开发版用 master。我在项目中遇到过,有人直接拿master分支上飞机,结果飞控参数结构变了,地面站不兼容……嗯,从那以后我坚持用稳定分支做产品。
3.2 编译工具链配置:别让环境卡住你
ArduPilot主要用 waf 构建系统,底层依赖ARM交叉编译器。说白了,就是你的电脑(x86架构)要能生成飞控板(ARM架构)能跑的机器码。
3.2.1 安装ARM编译器
官方推荐 gcc-arm-none-eabi,版本建议 9-2020-q2-update 或更高。我踩过坑:用太老的编译器(比如4.9版本),编译出来的固件在Pixhawk上跑着跑着就死机了。
| 操作系统 | 安装命令 / 方式 |
|---|---|
| Ubuntu / Debian | sudo apt install gcc-arm-none-eabi |
| macOS | brew install armmbed/formulae/arm-none-eabi-gcc |
| Windows | 下载 GNU MCU Eclipse 或 ARM 官方安装包 |
装完后验证一下:
arm-none-eabi-gcc --version
# 输出应该类似:arm-none-eabi-gcc (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1
3.2.2 配置Python环境
ArduPilot的waf构建系统依赖Python 3。我建议用虚拟环境隔离,避免和系统Python打架。
# 创建虚拟环境(在ardupilot目录外)
python3 -m venv ardupilot_env
source ardupilot_env/bin/activate
# 安装依赖
pip install future pyserial empy
注意:如果你在Ubuntu 20.04上遇到 ModuleNotFoundError: No module named 'em',那是因为系统自带的 empy 版本不对。用 pip install empy==3.3.4 可以解决。我曾经在这个问题上浪费了整整一个下午……
3.3 固件编译:waf 构建系统实战
ArduPilot从3.x版本开始全面转向waf。相比老旧的make系统,waf的并行编译和依赖管理强太多了。
3.3.1 配置编译目标
首先,你需要告诉waf你要编译哪个飞控板、哪个固件类型。格式是:
./waf configure --board <板型>
常用的板型有:
Pixhawk1— 最早的Pixhawk(FMUv2)Pixhawk4— Pixhawk 4(FMUv5)CubeOrange— Cube Orangefmuv3— 通用FMUv3(很多国产飞控用这个)sitl— 软件在环仿真(不烧录,用于测试)
# 以Pixhawk 4为例
./waf configure --board Pixhawk4
配置成功后,waf会下载对应的工具链和头文件。这个过程可能有点慢,耐心等。
3.3.2 执行编译
配置完成后,编译就简单了:
# 编译所有固件(Copter、Plane、Rover等)
./waf copter
# 只编译特定固件
./waf --target bin/arducopter
编译完成后,固件文件在 build/<板型>/bin/ 目录下。比如:
ls build/Pixhawk4/bin/
# arducopter.apj arducopter.hex arducopter.bin
三种固件格式的区别:
.apj— ArduPilot固件包,带元数据,推荐用Mission Planner烧录.hex— Intel HEX格式,适合用QGroundControl或命令行烧录.bin— 纯二进制,一般用于SD卡启动或Bootloader升级
3.4 固件烧录:把代码写进飞控板
编译出固件只是第一步,怎么把它写进飞控板才是关键。不同飞控板、不同场景,烧录方式不一样。
3.4.1 通过USB/Mission Planner烧录(最常用)
这是最推荐的方式,适合大多数用户。
- 用USB线连接飞控板和电脑
- 打开Mission Planner,选择正确的COM口和波特率(通常115200)
- 点击「初始设置」→「安装固件」→「加载自定义固件」
- 选择编译好的
.apj文件 - 等待进度条走完,飞控板会自动重启
经验之谈:如果Mission Planner提示「No heartbeat received」,别慌。先检查驱动(Pixhawk用WinUSB驱动),再试试按着飞控板的「安全按钮」再上电。我遇到过好几次,其实就是Bootloader没进对。
3.4.2 通过SD卡烧录(无USB驱动时)
有些飞控板(比如老版Pixhawk)在Windows上驱动不好装,或者你手边没有USB线。这时候SD卡烧录就派上用场了。
- 把
.bin文件复制到SD卡根目录,重命名为firmware.bin - SD卡插入飞控板
- 飞控板上电,Bootloader会自动检测并刷写
- 刷写完成后,飞控板会重启,记得取出SD卡(否则下次上电又会刷一遍)
3.4.3 通过SWD/JTAG烧录(开发调试用)
如果你是做飞控板开发,或者固件刷死了(俗称「变砖」),就需要用SWD调试器直接烧录Bootloader或固件。
# 使用OpenOCD + ST-Link/V2
openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg \
-c "program build/Pixhawk4/bin/arducopter.hex verify reset exit"
这种方式需要硬件连接:SWDIO、SWCLK、GND、3.3V。我建议初学者先别碰这个,除非你真的把飞控刷死了。
3.5 常见编译/烧录问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
编译报错 fatal error: mavlink.h: No such file |
子模块未更新 | git submodule update --init --recursive |
编译报错 arm-none-eabi-gcc: not found |
编译器未安装或未加入PATH | 检查安装路径,或 export PATH=$PATH:/path/to/gcc-arm/bin |
| 烧录后飞控板无反应 | Bootloader损坏或固件不匹配 | 重新烧录Bootloader,或换用 .hex 格式 |
| Mission Planner连接不上 | 驱动问题或波特率不对 | 安装Zadig驱动,或尝试自动波特率检测 |
重要提醒:烧录固件前,一定要确认飞控板的硬件版本。比如Pixhawk 1(FMUv2)和Pixhawk 4(FMUv5)的固件不能混用。我曾经帮一个朋友排查问题,他拿着Pixhawk 4的固件硬刷到Pixhawk 1上,结果飞控直接变砖,最后只能上SWD救砖。
3.6 验证:固件是否真的跑起来了?
固件烧录完成后,别急着装桨起飞。先做几个基本验证:
- LED状态:正常启动后,飞控板上的LED应该按特定模式闪烁(比如Copter是红蓝交替)
- Mission Planner连接:能连上,能看到姿态数据、GPS信息
- 传感器校准:加速度计、陀螺仪、磁力计数据正常
- RC输入:遥控器接收机绑定后,Mission Planner上能看到通道值变化
如果以上都正常,恭喜你——你的ArduPilot编译与烧录环境已经彻底打通了。后面的事情,就是在这个基础上做参数调优、传感器校准、飞行测试。