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),一切就顺畅了。
2.2 子模块更新:别漏了这一步
ArduPilot 依赖很多第三方库,比如 mavlink、dronekit 等。这些库以 Git 子模块的形式挂在主仓库下。你想想看,如果只克隆主仓库而不更新子模块,编译时肯定会报“找不到头文件”的错误。
git submodule update --init --recursive
这条命令会递归地拉取所有子模块。我第一次跑的时候,网络慢得让人抓狂——因为子模块里还嵌套着子模块,总大小接近 2GB。后来我学乖了,用 --depth 1 参数只拉取最新版本:
git submodule update --init --recursive --depth 1
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
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 仿真跑起来的完整流程。
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 地面站连接仿真器看看数据。嗯,动手试试吧,遇到问题再回来翻翻这一章。