3. 硬件选型与准备

说实话,很多初学者拿到ArduPilot源码后,第一反应就是懵。Git仓库怎么这么大?编译环境怎么搭?为什么同样的代码,别人能编译通过,我这里就报错?

我当年第一次编译ArduPilot时,光配置工具链就折腾了两天。后来带团队做项目,发现新人几乎都会在这个环节卡住。所以这一章,咱们就把「源码下载 → 工具链配置 → 固件编译 → 烧录验证」这条线彻底捋清楚。

本章核心目标:从零开始,在你的电脑上搭建一套完整的ArduPilot编译环境,并成功为一块真实的飞控板生成可运行的固件。

ArduPilot 固件编译与烧录流程 1. 源码下载 git clone 2. 工具链配置 gcc-arm-none-eabi 3. 固件编译 make / waf 飞控板选择:Pixhawk / Cube / Here / 自制板 Pixhawk 系列 PX4v1 / v2 / v3 / v4 Cube / Here 系列 CubeOrange / HerePro 自制 / 第三方板 自定义 hwdef 4. 固件烧录 USB / SD卡 / SWD / QGroundControl 验证:Mission Planner 连接

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 Orange
  • fmuv3 — 通用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烧录(最常用)

这是最推荐的方式,适合大多数用户。

  1. 用USB线连接飞控板和电脑
  2. 打开Mission Planner,选择正确的COM口和波特率(通常115200)
  3. 点击「初始设置」→「安装固件」→「加载自定义固件」
  4. 选择编译好的 .apj 文件
  5. 等待进度条走完,飞控板会自动重启

经验之谈:如果Mission Planner提示「No heartbeat received」,别慌。先检查驱动(Pixhawk用WinUSB驱动),再试试按着飞控板的「安全按钮」再上电。我遇到过好几次,其实就是Bootloader没进对。

3.4.2 通过SD卡烧录(无USB驱动时)

有些飞控板(比如老版Pixhawk)在Windows上驱动不好装,或者你手边没有USB线。这时候SD卡烧录就派上用场了。

  1. 把 .bin 文件复制到SD卡根目录,重命名为 firmware.bin
  2. SD卡插入飞控板
  3. 飞控板上电,Bootloader会自动检测并刷写
  4. 刷写完成后,飞控板会重启,记得取出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编译与烧录环境已经彻底打通了。后面的事情,就是在这个基础上做参数调优、传感器校准、飞行测试。