1. ArduPilot概述与开发环境搭建

ArduPilot 是目前应用最广泛的开源自动驾驶仪固件项目之一,它并不是单一固件,而是一套可运行在多类飞控硬件上的自动驾驶软件栈。理解它的历史脉络、版本分支与硬件支持范围,是后续编译、刷写与调参的前提。本节从“它是什么、有哪些分支、跑在什么硬件上”讲到“如何在 Ubuntu 上把编译环境搭起来并验证通过”。

一、ArduPilot 的由来与定位

ArduPilot 项目最早可追溯到 2007 年前后的 Arduino 无人机实验,最初基于 Arduino 平台实现固定翼与多旋翼的稳定控制。随着功能扩展,它逐步脱离 Arduino 硬件限制,演化为基于 ChibiOS 实时操作系统的现代飞控固件。今天的 ArduPilot 支持多旋翼(Copter)、固定翼(Plane)、垂直起降(VTOL)、无人车(Rover)、无人船(Boat)、潜艇(Sub)以及天线跟踪器(AntennaTracker)等多种载具类型,同一套代码库通过不同构建目标生成对应固件。

它的核心价值在于:开源可审计、支持硬件广、参数体系庞大且文档完善、社区活跃。对开发者而言,ArduPilot 提供了完整的源码、构建系统(waf)、参数定义与日志分析工具链,可以在此基础上做二次开发、定制机型或研究控制算法。

二、版本分支:Stable、Beta 与 Master

ArduPilot 的代码分支管理比较清晰,常见的有三类:

  • Stable(稳定版):经过充分测试、适合实际飞行与生产的版本,命名如 Copter-4.5.x、Plane-4.5.x。日常使用与调参优先选择稳定版。
  • Beta(测试版):包含即将进入稳定版的新功能,适合愿意参与测试、能接受一定风险的开发者。
  • Master(开发主线):最新开发代码,功能最全但稳定性最低,主要用于开发者提交补丁与验证新特性。

版本号通常由“载具类型 + 主版本 + 次版本 + 修订号”构成,例如 Copter-4.5.1。选择分支时,应根据用途决定:飞行验证选 Stable,功能尝鲜选 Beta,源码开发选 Master。

三、支持的硬件平台

ArduPilot 官方支持大量飞控板,常见的有 Pixhawk 系列(Pixhawk 1/2/4、Pixhawk 6X 等)、Cube 系列(Cube Orange、Cube Yellow)、Matek、Holybro、CUAV 等厂商的板卡。这些板卡大多基于 STM32 系列 MCU,运行 ChibiOS 实时系统。此外,ArduPilot 还支持部分 Linux 平台(如 Raspberry Pi 配合 Navio2)以及 SITL 软件在环仿真,后者可在没有硬件的情况下运行完整固件逻辑。

不同硬件对应不同的构建目标(如 fmuv3、CubeOrange、Pixhawk6X),编译时需要指定正确的目标板,否则生成的固件无法在目标硬件上运行。

ArduPilot 版本分支与硬件平台关系 版本分支 Stable 稳定版 Beta 测试版 Master 开发主线 载具类型 Copter 多旋翼 Plane 固定翼 VTOL 垂直起降 Rover / Boat / Sub AntennaTracker 硬件平台 Pixhawk 系列 Cube 系列 Matek / Holybro / CUAV Linux + Navio2 SITL 软件仿真 构建目标(waf 配置) ./waf configure --board CubeOrange → ./waf copter Ubuntu 编译环境 git · gcc-arm-none-eabi · python3 · pip · waf

四、Ubuntu 下搭建编译环境

ArduPilot 官方推荐在 Ubuntu 20.04 或 22.04 LTS 上编译。以下步骤以 Ubuntu 22.04 为例,命令可直接在终端执行。

1. 安装基础工具与交叉编译器

sudo apt update
sudo apt install -y git gcc-arm-none-eabi python3 python3-pip python3-dev
sudo apt install -y build-essential ccache g++ make

其中 gcc-arm-none-eabi 是 ARM Cortex-M 的交叉编译器,用于把源码编译成 STM32 可执行的固件;python3 与 pip 用于运行 waf 构建脚本和安装依赖。

2. 克隆 ArduPilot 源码

git clone --recurse-submodules https://github.com/ArduPilot/ardupilot.git
cd ardupilot

--recurse-submodules 会同时拉取 mavlink、gtest 等子模块,缺少子模块会导致编译失败。若网络较慢,可先克隆主仓库再执行 git submodule update --init --recursive。

3. 安装 Python 依赖

pip3 install --user -r requirements.txt

该文件包含 pymavlink、future、lxml 等构建与工具依赖。若提示权限问题,可加 --user 安装到用户目录。

4. 配置并编译

./waf configure --board CubeOrange
./waf copter

第一条命令指定目标板为 CubeOrange,第二条编译 Copter 固件。编译成功后,固件位于 build/CubeOrange/bin/arducopter.apj。若只想验证环境是否可用,可先编译 SITL:

./waf configure --board sitl
./waf copter

SITL 不依赖硬件,编译通过即说明工具链、Python 依赖与源码均正常。

提示:首次编译时间较长(约 5~15 分钟,取决于机器性能)。使用 ccache 可显著加速后续重复编译。若出现 “arm-none-eabi-gcc: not found”,说明交叉编译器未安装或未加入 PATH。

五、环境验证与常见问题

编译完成后,可用以下方式确认环境是否真正可用:

  • 执行 arm-none-eabi-gcc --version,应输出版本号(如 10.3.1)。
  • 执行 python3 --version,应为 3.8 及以上。
  • 执行 ./waf --version,应输出 waf 版本。
  • 编译 SITL 后运行 sim_vehicle.py -v ArduCopter,若能看到 MAVProxy 控制台并输出 “EKF2 IMU0 initial yaw” 等初始化日志,说明仿真环境可用。

常见问题包括:子模块未拉取导致 mavlink 头文件缺失;pip 依赖版本冲突;交叉编译器路径未配置。遇到编译报错时,优先检查 git submodule status 与 pip3 list,再根据错误信息定位。

注意:不要用系统自带的 gcc 直接编译飞控固件,必须使用 arm-none-eabi-gcc。SITL 目标才使用本机 gcc。