3、源码获取:从GitHub克隆ArduPilot源码、选择稳定分支、验证源码完整性

好,到了真正动手的环节了。源码获取这一步,说白了就是去 GitHub 把 ArduPilot 的代码仓库完整地拉到本地。别小看这一步,我见过不少新手在这栽跟头——分支选错了,或者拉下来的代码不完整,后面编译死活过不去,排查半天才发现是源码的问题。

我个人习惯把源码放在 ~/ardupilot 目录下,当然你也可以放别的地方,但路径里最好不要有中文和空格,免得后面 CMake 编译时出一些莫名其妙的错误。

3.1 克隆完整仓库

打开终端,执行下面这条命令:

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

嗯,这里要注意。ArduPilot 的仓库体积不小,包含了很多子模块和历史提交。如果你网络不太好,可以加上 --depth=1 参数只拉取最新的一次提交,这样速度快很多:

git clone --depth=1 https://github.com/ArduPilot/ardupilot.git

不过,--depth=1 会丢失历史记录。如果你后面需要切换分支或者查看历史提交,建议还是完整克隆。我在项目中遇到过几次需要回退到某个旧版本来复现 bug 的情况,这时候浅克隆就帮不上忙了。

小提示: 如果你在墙内,GitHub 访问慢,可以考虑使用镜像源,比如 https://hub.fastgit.xyz/ArduPilot/ardupilot.git。但镜像源的更新可能有延迟,建议还是用官方源。

3.2 选择稳定分支

仓库拉下来之后,下一步就是选分支。ArduPilot 的分支策略其实很清晰,我整理了一张表:

分支名称 用途 稳定性 我的建议
master 开发主线,最新特性 低,随时可能 break 不推荐用于 SITL 联调
Copter-4.5 等 稳定大版本分支 高,经过充分测试 首选,适合联调
stable 指向最新稳定版 高,但更新频率低 也可以,但可能不是最新

我个人习惯用稳定大版本分支,比如 Copter-4.5。为什么?因为 master 分支可能今天还能编译通过,明天就挂了。我曾经有一次用 master 分支搭好环境,第二天同事拉同样的代码就报错了,排查下来是有人刚合入了一个有问题的 commit。你想想看,这种不确定性在联调阶段是致命的。

切换到稳定分支的命令:

cd ~/ardupilot
git checkout Copter-4.5

如果你不确定有哪些稳定分支,可以执行 git branch -a 查看所有远程分支,找名字里带版本号的。

警告: 切换分支后,一定要记得更新子模块!ArduPilot 依赖了很多第三方库,比如 MAVLink、DroneKit 等。不更新子模块,编译时会报找不到头文件的错误。

3.3 更新子模块

子模块更新是很多人容易忽略的一步。执行以下命令:

git submodule update --init --recursive

这条命令会递归地初始化并更新所有子模块。加上 --recursive 是因为有些子模块自己还嵌套了子模块。这个过程可能需要一些时间,取决于你的网络速度。

我记得有一次,我帮同事排查编译错误,他信誓旦旦说已经更新了子模块,结果我一看,他只执行了 git submodule update 没加 --init,新克隆的仓库里子模块目录是空的。所以,新克隆的仓库第一次更新子模块,一定要加 --init。

3.4 验证源码完整性

源码拉下来、子模块更新完,怎么确认代码是完整的?我一般做三步检查:

  1. 检查仓库大小:执行 du -sh ~/ardupilot,正常应该在 1.5GB 以上(完整克隆)。如果只有几百 MB,说明子模块可能没拉全。
  2. 检查关键目录是否存在:比如 libraries/AP_HAL、libraries/AP_Math 这些核心库目录必须存在且非空。
  3. 检查 Git 状态:执行 git status,确保工作区是干净的,没有未跟踪或修改的文件。

下面这张图展示了源码获取的完整流程:

源码获取与验证流程图 克隆仓库 选择稳定分支 更新子模块 验证源码完整性 ✅ 源码就绪 ⚠️ 常见问题 • 网络超时 → 加 --depth=1 • 子模块为空 → 加 --init • 编译报错 → 检查分支版本

3.5 避坑指南

最后,分享几个我踩过的坑:

  • 不要用 root 用户操作:我曾经图省事用 root 克隆,结果后面编译生成的文件权限全是 root 的,普通用户没法修改,折腾了半天才改回来。
  • 注意磁盘空间:完整克隆加编译,至少需要 10GB 空闲空间。如果你用虚拟机,记得给足磁盘配额。
  • Windows 用户注意换行符:如果你在 WSL 或 Git Bash 下操作,确保 Git 配置了 autocrlf input,否则拉下来的代码换行符不对,编译会报 warning。

一句话总结: 源码获取不是简单的 git clone,分支选择、子模块更新、完整性验证这三步缺一不可。每一步都确认无误,后面的编译和联调才能顺风顺水。