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分支天天在变,今天能编译的代码,明天可能就报错了。我在项目里吃过这个亏——早上拉的最新代码,下午客户要演示,结果编译不过,急得满头汗。从那以后,凡是给客户交付,我必用稳定版分支。

注意: 不要直接基于main分支做产品开发。除非你做好了随时修bug的心理准备。

如果你想看某个版本有哪些标签:

git tag -l "v1.14*"

标签是更精确的版本锁定。比如 v1.14.0 就是官方发布的正式版本,比分支更可靠。

4.3 子模块更新:最容易忽略的一步

好,仓库克隆了,分支也切了。现在能编译了吗?别急,还差关键一步——子模块更新。

PX4依赖了很多第三方库,比如 mavlinkuavcaneigen 等等。这些库不是直接放在主仓库里的,而是以「子模块」的形式引用。说白了,就是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 验证下载是否完整

子模块更新完后,怎么确认一切正常?我一般用两个方法:

  1. 检查子模块状态git submodule status,看看有没有显示「-」开头的行。如果有,说明那个子模块没拉下来。
  2. 查看关键目录:比如 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 看看有没有异常。如果有红色或负号开头的行,就说明子模块版本不对,需要重新更新。

避坑指南: 我曾经在v1.12.x和v1.13.x之间来回切换,忘了更新子模块,结果编译时疯狂报错。后来写了个小脚本,把切换分支和更新子模块绑在一起,再也没出过问题。

好了,源码下载这块就这些。记住:克隆、切分支、更新子模块,三步缺一不可。尤其是子模块更新,最容易忽略,也最容易出问题。

PX4源码下载流程 步骤1:克隆主仓库 git clone https://github.com/PX4/PX4-Autopilot.git 步骤2:分支选择 稳定版:v1.14.x(推荐) 开发版:main(尝鲜) 步骤3:子模块更新 git submodule update --init --recursive 验证:git submodule status ⚠️ 常见陷阱 1. 直接下载ZIP 缺少子模块 2. 切分支后忘更新 子模块版本不匹配 3. 网络超时导致 子模块拉取不完整 4. 用main分支做产品 稳定性无保障 ✅ 正确做法 稳定版分支 + 子模块完整更新 + 状态验证

这张图把整个流程串起来了。你照着走一遍,基本不会出问题。如果中间卡住了,多半是网络问题,换个时间再试就行。

专注资料整理