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会显示每个源文件的编译进度。
-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 本章知识体系
下面这张图总结了源码编译的完整流程,你可以对照着检查自己走到哪一步了:
整个流程走下来,你就能得到一个可以在电脑上直接运行的SITL仿真程序。我个人觉得,编译这一步虽然看起来繁琐,但只要你按顺序来,基本不会出大问题。真遇到报错也别怕,仔细看错误信息,大部分问题都能自己解决。