3. ArduPilot代码结构总览

说实话,很多初学者在ArduPilot上栽的第一个跟头,不是代码看不懂,而是环境没搭好。我见过太多人花了两三天折腾虚拟机、装依赖、下源码,最后编译报错一脸懵。其实这事没那么玄乎,只要把几个关键步骤理清楚,半小时就能跑通。

这一章,我就带你一步步把开发环境搭起来。咱们的目标很明确:能在Linux上成功编译ArduPilot固件。至于用什么编辑器、配什么终端主题,那是个人审美问题,我不纠结。

核心要点:开发环境搭建 = 操作系统 + 工具链 + 源码。这三样东西的顺序不能乱,缺一不可。

3.1 为什么选择Linux?

ArduPilot官方推荐Ubuntu 20.04 LTS或22.04 LTS。你可能会问:Windows不行吗?我试过,能跑,但坑太多。交叉编译、串口权限、Python脚本兼容性……每个环节都可能出幺蛾子。

我个人习惯用Ubuntu 22.04 LTS,因为它的软件源更新,Python 3.10默认安装,省去不少麻烦。如果你手头只有Windows机器,建议装个虚拟机(VMware或VirtualBox),分配4核CPU、8GB内存,硬盘给60GB就够用。

小技巧:虚拟机里装Ubuntu时,记得勾选“安装第三方软件”,否则Wi-Fi驱动和显卡驱动可能不全。我曾经因为这个折腾了一下午。

3.2 基础环境配置

装好系统后,第一件事是更新软件源。打开终端,执行:

sudo apt update
sudo apt upgrade -y

然后安装ArduPilot编译所需的依赖包。官方维护了一个脚本,但我更推荐手动装,因为你能清楚知道每个包是干什么的。

sudo apt install -y git
sudo apt install -y python3-pip
sudo apt install -y python3-dev
sudo apt install -y build-essential
sudo apt install -y pkg-config
sudo apt install -y libtool
sudo apt install -y autoconf
sudo apt install -y automake
sudo apt install -y cmake
sudo apt install -y g++
sudo apt install -y gcc
sudo apt install -y gdb

嗯,这里要注意:gcc和g++的版本不能太老。Ubuntu 22.04默认带的gcc-11,完全够用。如果你用Ubuntu 18.04,gcc版本是7.x,编译某些模块会报错。

接下来安装Python依赖:

pip3 install --user future
pip3 install --user pyserial
pip3 install --user empy
pip3 install --user pexpect
pip3 install --user numpy
pip3 install --user opencv-python
pip3 install --user matplotlib

注意:不要用sudo pip3 install,否则会污染系统Python环境。加--user参数,装到用户目录下,安全又干净。

3.3 交叉编译工具链安装

ArduPilot要编译成能在飞控MCU上运行的固件,比如STM32F4、STM32H7。这就需要用交叉编译工具链——在PC上编译,生成ARM架构的机器码。

ArduPilot官方推荐使用ARM GNU Toolchain。我习惯用gcc-arm-none-eabi-10.3-2021.10版本,稳定且兼容性好。

安装步骤:

  1. 下载工具链:wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
  2. 解压到/opt目录:sudo tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt
  3. 添加环境变量:编辑~/.bashrc,在末尾加上export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin
  4. 使配置生效:source ~/.bashrc
  5. 验证安装:arm-none-eabi-gcc --version

如果看到版本号输出,说明工具链装好了。我曾经遇到一个问题:解压后忘记加执行权限,结果编译时提示“Permission denied”。所以建议顺手跑一下:

sudo chmod +x /opt/gcc-arm-none-eabi-10.3-2021.10/bin/*

3.4 ArduPilot源码下载

源码托管在GitHub上。我们用git克隆到本地:

cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

克隆完成后,需要更新子模块。ArduPilot依赖很多第三方库,比如AP_Common、AP_Math、libraries等。这些库以子模块形式管理。

git submodule update --init --recursive

这个过程可能比较慢,取决于你的网络。我建议用代理或者换个时间段下载。如果中途断了,重新执行上面的命令就行,git会断点续传。

避坑指南:我曾经在克隆时忘了加--recursive参数,结果编译时一堆头文件找不到。后来养成习惯:每次clone完,立刻执行子模块更新。

3.5 编译第一个固件

环境搭好了,源码也下了,咱们来编译一个固件试试手。以CubeOrange飞控为例:

cd ~/ardupilot
./waf configure --board CubeOrange
./waf plane

解释一下:

  • ./waf configure:配置编译环境,指定目标板型
  • ./waf plane:编译固定翼固件(ArduPlane)

第一次编译会比较慢,因为要编译所有依赖库。我的机器(i7-12700H,32GB内存)大概需要5分钟。如果一切顺利,你会看到:

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

编译产物在build/CubeOrange/bin/目录下,文件名是arduplane.hex。这个文件就是可以烧录到飞控的固件。

常见错误及解决:

  • “Python not found”:检查Python3是否安装,或者python3命令是否软链接到python
  • “arm-none-eabi-gcc not found”:检查环境变量是否配置正确,重新source ~/.bashrc
  • “ModuleNotFoundError: No module named 'future'”:重新执行pip3 install --user future

3.6 知识体系总览

为了让你对整个开发环境搭建有个全局认识,我画了一张流程图:

ArduPilot 开发环境搭建流程 Ubuntu 22.04 LTS 系统依赖:git, python3, build-essential, cmake Python包:future, pyserial, empy, numpy ARM GCC 工具链:gcc-arm-none-eabi git clone + submodule + waf编译 关键提醒 • 不要用sudo pip3 • 子模块必须更新 • 环境变量要source

3.7 验证环境是否完整

编译成功后,我建议你做一个快速验证清单:

检查项 命令 预期结果
git版本 git --version git version 2.34.1 或更高
Python版本 python3 --version Python 3.10.x
ARM GCC版本 arm-none-eabi-gcc --version 10.3.1 20210824
waf可用性 ./waf --version waf 2.0.24
子模块状态 git submodule status 所有子模块显示commit hash,无“-”前缀

如果以上五项全部通过,恭喜你,开发环境搭建完成。你可以开始修改代码、添加功能、调试飞控了。

最后提醒:如果你用的是Windows + WSL2,记得把源码放在Linux文件系统下(比如~/ardupilot),不要放在/mnt/c/下。WSL2访问Windows文件系统有IO性能问题,编译速度会慢3-5倍。我当初没注意这个,白白浪费了一个下午。