4. PX4源码下载:Git仓库克隆、分支选择、子模块更新
好,咱们正式开始动手了。源码下载这一步,看着简单,但坑其实不少。我见过太多新手在这卡住,要么下载到一半断了,要么编译时缺文件报错。说白了,就是没把Git仓库的「脾气」摸透。
PX4的源码托管在GitHub上,用的是Git做版本控制。你想想看,一个飞控系统,代码量几十万行,还依赖一大堆第三方库。如果直接点「Download ZIP」,那基本等于给自己挖坑。为什么?因为那些依赖的子模块,ZIP包根本不会帮你拉下来。
4.1 克隆主仓库
先打开终端,找个你习惯的工作目录。我个人习惯放在 ~/workspace 下面,方便管理。
cd ~/workspace
git clone https://github.com/PX4/PX4-Autopilot.git
这条命令会把整个PX4主仓库拉到本地。注意,这里用的是HTTPS协议。如果你配置过SSH key,也可以用SSH地址,速度会快一些。
克隆完成后,你会看到一个 PX4-Autopilot 文件夹。进去看看:
cd PX4-Autopilot
git branch -a
这条命令会列出所有分支。嗯,这里要注意,你看到的列表会很长,因为PX4维护了很多历史版本分支。
4.2 分支选择:选对版本少踩坑
分支选择是个学问。PX4的分支策略大致分三类:
| 分支类型 | 命名示例 | 适用场景 |
|---|---|---|
| 稳定版 | v1.13.x, v1.14.x | 产品级开发、教学 |
| 开发版 | main | 尝鲜、贡献代码 |
| 特性分支 | pr-xxx, feature-xxx | 特定功能测试 |
我建议初学者直接选稳定版分支。比如当前最新的稳定版是v1.14.x:
git checkout v1.14.0
为什么?因为main分支天天在变,今天能编译的代码,明天可能就报错了。我在项目里吃过这个亏——早上拉的最新代码,下午客户要演示,结果编译不过,急得满头汗。从那以后,凡是给客户交付,我必用稳定版分支。
如果你想看某个版本有哪些标签:
git tag -l "v1.14*"
标签是更精确的版本锁定。比如 v1.14.0 就是官方发布的正式版本,比分支更可靠。
4.3 子模块更新:最容易忽略的一步
好,仓库克隆了,分支也切了。现在能编译了吗?别急,还差关键一步——子模块更新。
PX4依赖了很多第三方库,比如 mavlink、uavcan、eigen 等等。这些库不是直接放在主仓库里的,而是以「子模块」的形式引用。说白了,就是Git仓库里套着其他Git仓库。
如果你不更新子模块,编译时就会报错,说找不到某某头文件。我第一次遇到这问题时,还以为是编译器坏了,折腾了半天才发现是子模块没拉。
更新子模块的命令:
git submodule update --init --recursive
这条命令做了三件事:
--init:初始化子模块配置文件--recursive:递归更新所有嵌套的子模块- 不加参数的话,只更新已初始化的子模块
执行完后,你会看到终端刷出一堆信息,像这样:
Submodule 'src/lib/eigen' (https://gitlab.com/libeigen/eigen.git) registered for path 'src/lib/eigen'
Submodule 'src/lib/mavlink' (https://github.com/mavlink/mavlink.git) registered for path 'src/lib/mavlink'
...
Cloning into 'src/lib/eigen'...
Cloning into 'src/lib/mavlink'...
这个过程取决于你的网速。有些子模块比较大,比如gtest,可能要等一会儿。
git submodule update --init --recursive。因为不同分支依赖的子模块版本可能不同。
4.4 验证下载是否完整
子模块更新完后,怎么确认一切正常?我一般用两个方法:
- 检查子模块状态:
git submodule status,看看有没有显示「-」开头的行。如果有,说明那个子模块没拉下来。 - 查看关键目录:比如
src/lib/mavlink里面应该有文件,不是空文件夹。
如果发现某个子模块没拉成功,可以单独更新它:
git submodule update --init src/lib/mavlink
嗯,这里要提醒一下:有些子模块的仓库在国外,偶尔会超时。如果遇到这种情况,多试几次,或者换个时间段再试。
4.5 我的个人工作流
最后,分享一下我平时怎么做的。这套流程我用了两年,没出过问题:
# 1. 克隆(只做一次)
git clone https://github.com/PX4/PX4-Autopilot.git
# 2. 切到稳定分支
cd PX4-Autopilot
git checkout v1.14.0
# 3. 更新子模块
git submodule update --init --recursive
# 4. 确认状态
git submodule status
每次切分支后,我习惯先跑一遍 git submodule status 看看有没有异常。如果有红色或负号开头的行,就说明子模块版本不对,需要重新更新。
好了,源码下载这块就这些。记住:克隆、切分支、更新子模块,三步缺一不可。尤其是子模块更新,最容易忽略,也最容易出问题。
这张图把整个流程串起来了。你照着走一遍,基本不会出问题。如果中间卡住了,多半是网络问题,换个时间再试就行。