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 的情况,这时候浅克隆就帮不上忙了。
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 查看所有远程分支,找名字里带版本号的。
3.3 更新子模块
子模块更新是很多人容易忽略的一步。执行以下命令:
git submodule update --init --recursive
这条命令会递归地初始化并更新所有子模块。加上 --recursive 是因为有些子模块自己还嵌套了子模块。这个过程可能需要一些时间,取决于你的网络速度。
我记得有一次,我帮同事排查编译错误,他信誓旦旦说已经更新了子模块,结果我一看,他只执行了 git submodule update 没加 --init,新克隆的仓库里子模块目录是空的。所以,新克隆的仓库第一次更新子模块,一定要加 --init。
3.4 验证源码完整性
源码拉下来、子模块更新完,怎么确认代码是完整的?我一般做三步检查:
- 检查仓库大小:执行
du -sh ~/ardupilot,正常应该在 1.5GB 以上(完整克隆)。如果只有几百 MB,说明子模块可能没拉全。 - 检查关键目录是否存在:比如
libraries/AP_HAL、libraries/AP_Math这些核心库目录必须存在且非空。 - 检查 Git 状态:执行
git status,确保工作区是干净的,没有未跟踪或修改的文件。
下面这张图展示了源码获取的完整流程:
3.5 避坑指南
最后,分享几个我踩过的坑:
- 不要用 root 用户操作:我曾经图省事用 root 克隆,结果后面编译生成的文件权限全是 root 的,普通用户没法修改,折腾了半天才改回来。
- 注意磁盘空间:完整克隆加编译,至少需要 10GB 空闲空间。如果你用虚拟机,记得给足磁盘配额。
- Windows 用户注意换行符:如果你在 WSL 或 Git Bash 下操作,确保 Git 配置了
autocrlf input,否则拉下来的代码换行符不对,编译会报 warning。
一句话总结: 源码获取不是简单的 git clone,分支选择、子模块更新、完整性验证这三步缺一不可。每一步都确认无误,后面的编译和联调才能顺风顺水。