3. PX4 Autopilot 源码获取:从项目到本地
好,咱们正式开始动手。这一章的目标很明确——把 PX4 的源码拿到你的电脑上。别小看这一步,我见过不少新手在这栽跟头。源码拿不对,后面全是白搭。
3.1 PX4 项目到底是个啥?
PX4 不是某个公司闭门造车搞出来的。它是一个开源飞控固件,背后有全球的开发者社区在维护。说白了,它就是一套能让无人机飞起来的软件大脑。
我个人习惯把 PX4 看作一个「飞行操作系统」。它管理传感器数据、运行控制算法、处理遥控器指令。你想想看,没有它,你的四轴飞行器就是一堆电机加碳纤维板。
PX4 支持什么?我列个表,你心里有个数:
| 特性 | 说明 |
|---|---|
| 多旋翼 | 四轴、六轴、八轴,甚至更奇怪的构型 |
| 固定翼 | 常规布局、飞翼、VTOL |
| 无人车/船 | 地面和水面载具也能跑 |
| SITL 仿真 | 咱们课程的核心,纯软件跑飞控 |
| HITL 硬件在环 | 接真实硬件跑仿真 |
嗯,这里要注意:PX4 的源码是用 C++ 写的,但你不必精通 C++ 才能用。咱们做 SITL 仿真,更多是跟配置文件、启动脚本打交道。
3.2 从 GitHub 克隆源码
GitHub 是源码的老家。咱们要做的,就是把整个 PX4 仓库「克隆」到本地。
先确认你装了 Git。打开终端,敲一下:
git --version
如果没装,去 git-scm.com 下一个。我建议用默认选项安装,别乱改路径。
好,接下来是克隆命令。我个人习惯用 --recursive 参数,它能一次性把子模块也拉下来。但咱们后面会单独讲子模块更新,所以这里先不用:
git clone https://github.com/PX4/PX4-Autopilot.git
这条命令会下载整个仓库。网速好的话,几分钟搞定。网速不好……嗯,我当年在学校实验室,用教育网下了快一个小时。
git config --global http.proxy,或者直接用国内镜像源。不过镜像源可能不是最新代码,自己权衡。
下载完成后,你会看到一个 PX4-Autopilot 文件夹。进去看看:
cd PX4-Autopilot
ls -la
你会看到一堆文件和文件夹。别慌,咱们接下来拆解它。
3.3 源码目录结构解析
我第一次打开 PX4 源码时,说实话,有点懵。文件夹太多了。但后来我发现,它的结构其实很有规律。
我画了一张图,帮你快速建立整体认知:
咱们挑几个重点说说:
- src/modules:这是飞控的大脑。比如
mc_pos_control是多旋翼位置控制,ekf2是扩展卡尔曼滤波器。我在调参时,经常要改这里面的参数。 - src/drivers:硬件驱动层。你用的传感器型号不同,驱动代码也不同。SITL 仿真下,这些驱动会被虚拟驱动替代。
- boards:每个硬件平台都有自己的配置。咱们做 SITL,用的是
posix这个「虚拟板子」。 - ROMFS:这里面藏着启动脚本。比如
rcS文件,定义了飞控启动时加载哪些模块。我曾经因为改错一个启动脚本,导致仿真死活跑不起来,排查了半天。
ROMFS 下的文件,除非你清楚自己在做什么。改错了,飞控可能无法正常启动。
3.4 子模块更新——避坑指南
PX4 依赖很多第三方库。这些库以「子模块」的形式挂在主仓库下。你克隆主仓库时,子模块并不会自动下载全部内容。
检查一下子模块状态:
git submodule status
如果看到前面有 - 号,说明子模块还没初始化。这时候需要:
git submodule update --init --recursive
这条命令会递归地拉取所有子模块。网速不好的话,可能会卡住。我曾经在更新 mavlink 子模块时,因为网络问题反复失败。后来发现是公司防火墙搞的鬼。
如果你也遇到类似问题,试试:
git submodule update --init --recursive --depth 1
--depth 1 只拉取最新版本,不下载历史记录。能省不少流量和时间。
git submodule update --init --recursive。不然编译时突然报错说缺头文件,那才叫头疼。
还有一个坑:子模块的版本是固定的。主仓库会记录每个子模块应该指向哪个 commit。如果你不小心在子模块里做了修改,git status 会提示子模块「脏了」。这时候用 git submodule update --force 强制重置回去。
嗯,到这里,你的源码应该已经完整了。下一件事,就是验证它能不能用。不过那是下一章的内容了。
- PX4 是开源飞控固件,支持多旋翼、固定翼、无人车等多种载具
- 使用
git clone获取源码,注意网络环境 - 源码目录结构清晰:src 放核心代码,boards 放硬件配置,ROMFS 放启动脚本
- 子模块必须更新,否则编译会报错
- 遇到子模块下载失败,试试
--depth 1参数