3、ArduPilot源码编译:Git仓库克隆、waf编译工具使用、SITL目标编译

源码编译,说白了就是把ArduPilot的源代码变成你能在电脑上直接运行的仿真程序。这一步是SITL环境搭建的核心,也是很多人容易卡住的地方。我刚开始接触时也踩过不少坑,今天就把这些经验一次性说清楚。

3.1 克隆ArduPilot仓库

先得把代码从GitHub上拉下来。我个人习惯用SSH方式,省得每次输密码。不过HTTPS方式更通用,看你的网络环境。

# 使用HTTPS(推荐新手)
git clone https://github.com/ArduPilot/ardupilot.git

# 使用SSH(需要配置过SSH Key)
git clone git@github.com:ArduPilot/ardupilot.git

克隆完成后,记得切到稳定分支。我见过有人直接在主分支上编译,结果遇到一些未发布的bug,折腾半天。

cd ardupilot
git checkout Copter-4.5.7  # 选一个你需要的稳定版本
小技巧: 如果你网络不好,可以加 --depth=1 参数只拉取最新版本,能省不少时间。但注意,这样会丢失历史记录,后续切分支会受限。

3.2 更新子模块

ArduPilot依赖很多第三方库,比如MAVLink、DroneKit这些。这些库以子模块的形式管理。嗯,这里要注意:子模块必须更新,否则编译会报错。

git submodule update --init --recursive

这个命令会下载所有依赖库。我第一次跑的时候等了快20分钟,因为有些库在国外服务器上,速度很慢。如果你也遇到这种情况,可以试试换国内镜像源。

避坑指南: 我曾经因为网络中断导致子模块下载不完整,编译时疯狂报错。后来养成习惯,每次更新完子模块都检查一下 git submodule status,确保所有模块都显示正确的commit ID。

3.3 waf编译工具介绍

ArduPilot用的编译工具叫waf,不是常见的make或cmake。waf是一个基于Python的构建系统,说白了就是帮你管理编译流程的脚本工具。

我个人觉得waf比makefile直观多了,配置都在一个 wscript 文件里,改起来很方便。先看看waf的基本用法:

# 查看waf版本
./waf --version

# 查看所有可用的编译目标
./waf list_boards

# 配置编译环境
./waf configure --board sitl

这里 --board sitl 指定了编译目标为SITL仿真环境。如果你要编译真实硬件,比如Pixhawk,就换成 --board Pixhawk1。

命令 作用 常用场景
./waf configure 配置编译环境,检测依赖 首次编译或切换板型后
./waf build 执行编译 修改代码后重新编译
./waf clean 清理编译产物 遇到奇怪错误时尝试
./waf list_boards 列出所有支持的板型 不确定板型名称时

3.4 配置SITL编译环境

配置这一步很关键,waf会检查你的系统有没有装齐所有依赖。如果缺东西,它会直接报错并告诉你缺什么。

./waf configure --board sitl

正常输出应该像这样:

Setting top to                           : /home/user/ardupilot
Setting out to                           : /home/user/ardupilot/build
Checking for 'gcc' (C compiler)          : /usr/bin/gcc
Checking for 'g++' (C++ compiler)        : /usr/bin/g++
Checking for program 'python3'           : /usr/bin/python3
Checking for program 'git'               : /usr/bin/git
Checking for 'mavgen'                    : /home/user/.local/bin/mavgen
...
Configuration completed successfully.

如果看到 Configuration completed successfully,说明环境没问题。如果报错,别慌,看它提示缺什么,用apt或pip装上就行。

常见依赖缺失:
  • python3-dev — 用 sudo apt install python3-dev 安装
  • libxml2-dev — 用 sudo apt install libxml2-dev 安装
  • libxslt1-dev — 用 sudo apt install libxslt1-dev 安装

3.5 编译SITL目标

配置通过后,就可以开始编译了。编译SITL目标用这个命令:

./waf build --target bin/arducopter

这里 --target bin/arducopter 指定只编译Copter的SITL可执行文件。如果你需要其他机型,比如Plane或Rover,就换成对应的目标名。

机型 编译目标 生成文件
Copter bin/arducopter build/sitl/bin/arducopter
Plane bin/arduplane build/sitl/bin/arduplane
Rover bin/ardurover build/sitl/bin/ardurover
Sub bin/ardusub build/sitl/bin/ardusub

编译过程大概需要5-15分钟,取决于你的电脑性能。我第一次编译时,看到满屏的编译信息还以为出错了,其实那是正常的。waf会显示每个源文件的编译进度。

加速编译: 如果你有多核CPU,可以用 -j 参数并行编译。比如 ./waf build -j4 用4个线程同时编译,能快不少。我一般用 -j$(nproc) 自动检测CPU核心数。

3.6 验证编译结果

编译完成后,检查一下生成的文件:

ls -la build/sitl/bin/arducopter

如果看到可执行文件,说明编译成功了。我习惯再跑一下版本检查:

./build/sitl/bin/arducopter --version

正常会输出类似 ArduCopter V4.5.7 (d1f2a3b4) 的信息,包含版本号和Git commit ID。

避坑指南: 我曾经编译成功后直接运行,结果报错说找不到某些库文件。后来发现是环境变量没配好。建议把 build/sitl/bin 加到PATH里,或者运行时用绝对路径。

3.7 本章知识体系

下面这张图总结了源码编译的完整流程,你可以对照着检查自己走到哪一步了:

ArduPilot SITL 源码编译流程 1. 克隆Git仓库 2. 更新子模块 3. waf configure 4. waf build 5. 验证可执行文件 💡 关键点: • 每一步都依赖上一步成功,不要跳过 • 遇到错误先看waf提示,它通常会说清楚缺什么 • 编译失败时先 ./waf clean 再重试

整个流程走下来,你就能得到一个可以在电脑上直接运行的SITL仿真程序。我个人觉得,编译这一步虽然看起来繁琐,但只要你按顺序来,基本不会出大问题。真遇到报错也别怕,仔细看错误信息,大部分问题都能自己解决。