2. 源码获取与编译:Git仓库克隆、子模块更新、编译环境搭建(Linux/WSL)、首次编译(SITL仿真)

好,咱们正式开始动手了。

这一章,说白了就是教你如何把 ArduPilot 的代码拉到本地,把环境搭好,然后跑起来。我见过太多新手卡在这一步——不是 Git 子模块没更新全,就是编译环境缺了某个包。嗯,别急,跟着我的节奏来,半小时内你就能看到 SITL 仿真在终端里跑起来。

2.1 获取源码:Git 仓库克隆

首先,你得有个 GitHub 账号,这个我就不多说了。我个人习惯把代码放在 ~/workspace 目录下,你随意。

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

这里有个小坑:不要用 Windows 的 Git Bash 直接克隆。我曾在 Windows 下用 Git Bash 拉过,结果换行符被自动转换,编译时一堆莫名其妙的错误。后来我改用 WSL(Windows Subsystem for Linux),一切就顺畅了。

我的建议:如果你用 Windows,请务必安装 WSL2,并在 WSL2 的 Ubuntu 环境下操作。别问我为什么,问就是血泪教训。

2.2 子模块更新:别漏了这一步

ArduPilot 依赖很多第三方库,比如 mavlinkdronekit 等。这些库以 Git 子模块的形式挂在主仓库下。你想想看,如果只克隆主仓库而不更新子模块,编译时肯定会报“找不到头文件”的错误。

git submodule update --init --recursive

这条命令会递归地拉取所有子模块。我第一次跑的时候,网络慢得让人抓狂——因为子模块里还嵌套着子模块,总大小接近 2GB。后来我学乖了,用 --depth 1 参数只拉取最新版本:

git submodule update --init --recursive --depth 1
注意:如果你在墙内,建议配置 Git 代理,或者使用国内镜像源。我曾经因为没配代理,子模块更新到一半卡住,等了半小时才发现是网络超时。

2.3 编译环境搭建(Linux / WSL)

环境搭建是重头戏。ArduPilot 官方提供了一个一键安装脚本,但我建议你手动安装,这样能清楚知道装了哪些东西。

2.3.1 安装基础依赖

sudo apt update
sudo apt install git build-essential cmake python3 python3-pip
sudo apt install libtool libtool-bin autoconf automake
sudo apt install libexpat1-dev libsdl2-dev libsdl2-image-dev
sudo apt install libfreetype6-dev libfontconfig1-dev
sudo apt install libssl-dev libcurl4-openssl-dev

嗯,这里要注意:不同 Ubuntu 版本可能包名略有差异。我用的 Ubuntu 22.04,上面这些包都能直接装。如果你用的是 20.04,可能需要额外装 python2.7(虽然官方已经不推荐了)。

2.3.2 安装 Python 依赖

ArduPilot 的编译脚本和 SITL 仿真都依赖 Python 包。我个人习惯用虚拟环境,但为了省事,这里直接全局安装:

pip3 install --user future pyserial empy
pip3 install --user dronekit pymavlink
pip3 install --user MAVProxy

你可能会问:为什么要装 MAVProxy?因为 SITL 仿真启动后,需要通过 MAVProxy 来与仿真器通信。说白了,MAVProxy 就是地面站和仿真器之间的桥梁。

2.3.3 安装交叉编译工具链(可选)

如果你只想跑 SITL 仿真,这一步可以跳过。但如果你想编译固件并烧录到 Pixhawk 等硬件上,就需要安装 ARM 交叉编译工具链:

sudo apt install gcc-arm-none-eabi gdb-arm-none-eabi
核心提示:环境搭建最怕版本冲突。我建议你严格按照 ArduPilot 官方文档的版本要求来。比如 Python 3.8+,CMake 3.16+,GCC 9+。低了可能编译不过,高了也可能有兼容问题。

2.4 首次编译:SITL 仿真

好,环境搭好了,咱们来编译 SITL 仿真。SITL 全称是 Software In The Loop,说白了就是在你的电脑上模拟一架无人机,不需要任何硬件。

2.4.1 选择飞控类型

ArduPilot 支持多种飞控类型,比如 ArduCopter(四旋翼)、ArduPlane(固定翼)、ArduRover(地面车)。咱们以最常见的四旋翼为例:

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

这里 ./waf 是 ArduPilot 的构建系统,类似于 CMake 的封装。第一次编译会比较慢,因为要编译所有依赖库。我当年第一次编译时,看着终端滚了十几分钟,还以为死机了。其实它在编译 libraries 目录下的所有模块。

2.4.2 启动仿真

编译成功后,启动 SITL 仿真:

cd ~/workspace/ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py -v ArduCopter --map --console

这条命令会启动一个带地图和控制台的仿真窗口。你会看到一个小飞机图标出现在地图上,控制台里会不断输出 GPS、姿态、高度等信息。

避坑指南:我曾经在启动仿真时遇到 No module named 'mavproxy' 的错误。原因很简单——MAVProxy 没装对。重新执行 pip3 install MAVProxy 即可。另外,如果你用的是 WSL,记得在 Windows 防火墙中放行 WSL 的网络端口,否则 MAVProxy 可能连不上仿真器。

2.4.3 验证仿真是否正常

仿真启动后,你可以用 MAVProxy 的命令行来操控无人机。比如输入 arm throttle 解锁电机,然后 takeoff 10 让无人机起飞到 10 米高度。

STABILIZE> arm throttle
STABILIZE> takeoff 10

如果一切正常,你会看到地图上的小飞机缓缓上升,控制台里显示高度从 0 变为 10。嗯,这一刻还是挺有成就感的。

2.5 本章知识体系

下面这张图帮你梳理了本章的核心逻辑:从源码获取到 SITL 仿真跑起来的完整流程。

源码获取与编译流程 步骤1:Git克隆 git clone 主仓库 步骤2:子模块更新 git submodule update 步骤3:环境搭建 安装依赖包 步骤4:编译SITL ./waf configure --board sitl 步骤5:启动仿真 sim_vehicle.py --map 步骤6:验证仿真 arm throttle / takeoff 10 关键点:子模块更新不能漏,环境依赖要完整,WSL用户注意网络配置 第2章 · 源码获取与编译

2.6 常见问题与解决

问题现象 可能原因 解决方法
子模块更新卡住 网络问题或子模块嵌套过深 使用 --depth 1 参数,或配置 Git 代理
编译时报错 No module named 'future' Python 依赖未安装 执行 pip3 install future
SITL 启动后地图空白 MAVProxy 未正确安装或端口被占用 重新安装 MAVProxy,检查 5760 端口是否被占用
WSL 下仿真无法连接 Windows 防火墙阻止了 WSL 网络 在 Windows 防火墙中放行 WSL 的入站连接

好了,到这里你已经成功把 ArduPilot 的 SITL 仿真跑起来了。接下来你可以试着用 MAVProxy 的命令飞一飞,或者用 Mission Planner 地面站连接仿真器看看数据。嗯,动手试试吧,遇到问题再回来翻翻这一章。

专注资料整理