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版本,稳定且兼容性好。
安装步骤:
- 下载工具链:
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 - 解压到
/opt目录:sudo tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt - 添加环境变量:编辑
~/.bashrc,在末尾加上export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin - 使配置生效:
source ~/.bashrc - 验证安装:
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 知识体系总览
为了让你对整个开发环境搭建有个全局认识,我画了一张流程图:
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倍。我当初没注意这个,白白浪费了一个下午。