4. PX4源码编译:从克隆到生成固件

好,咱们进入正题。源码编译这一步,说白了就是把PX4的源代码变成能在仿真器或真实硬件上跑的东西。很多新手在这一步容易卡住,其实捋顺了也就那么几个环节。

4.1 克隆PX4 Firmware仓库

先得把代码拉下来。我个人习惯把PX4源码放在 ~/src 目录下,这样好管理。

cd ~/src
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

这里有个关键点——--recursive 参数。PX4依赖很多子模块,比如mavlink、uavcan这些。不加这个参数,你拉下来的代码是不完整的,编译时肯定报错。

注意: 如果你忘了加 --recursive,别慌,在仓库目录下执行 git submodule update --init --recursive 也能补上。不过这个过程可能比较慢,建议一开始就加好。

我曾经在项目里遇到过一个问题:同事拉完代码直接编译,报了一堆头文件找不到的错误。排查了半天,最后发现就是子模块没拉全。嗯,从那以后我每次克隆都会检查子模块状态。

4.2 了解make编译目标

代码拉下来了,接下来就是编译。PX4用make来管理编译流程,但它的目标命名规则有点绕。你想想看,一个目标名里包含了硬件平台、机架类型、编译配置三部分信息。

举个例子:

make px4_sitl_default gazebo

这个目标拆开来看:

部分 含义 说明
px4_sitl 硬件平台 SITL = Software In The Loop,软件在环仿真
default 编译配置 默认配置,包含标准传感器和驱动
gazebo 仿真后端 指定使用Gazebo作为仿真环境

常用的编译目标我整理了一下:

目标名称 用途 适用场景
px4_sitl_default gazebo SITL + Gazebo仿真 最常用的仿真组合
px4_sitl_default jmavsim SITL + jMAVSim仿真 轻量级仿真,适合快速测试
px4_fmu-v5_default Pixhawk 4固件 真实硬件编译
px4_fmu-v3_default Pixhawk 1固件 老版本硬件
小技巧: 想查看所有可用的编译目标?执行 make list_config_targets,会列出所有支持的硬件和仿真配置。

4.3 开始编译:SITL目标

咱们做仿真,最常用的就是 px4_sitl_default gazebo。执行编译:

make px4_sitl_default gazebo

第一次编译会比较慢,因为要下载依赖、编译所有模块。我的机器大概需要15-20分钟。你想想看,PX4的代码量不小,加上Gazebo的接口库,编译时间自然长。

编译过程中你会看到类似这样的输出:

[  1%] Built target git_submodule
[  5%] Building CXX object src/modules/commander/CMakeFiles/commander.dir/commander.cpp.o
...
[100%] Linking CXX executable px4
[100%] Built target px4

看到 [100%] Built target px4 就说明编译成功了。这时候在 build/px4_sitl_default/bin/ 目录下会生成 px4 可执行文件。

核心验证: 编译成功后,执行 ./build/px4_sitl_default/bin/px4 --help 应该能看到版本信息和参数说明。这是最直接的固件生成验证方法。

4.4 固件生成验证

编译完了,怎么确认固件是好的?我一般做三步验证:

  1. 检查可执行文件是否存在:ls -la build/px4_sitl_default/bin/px4,文件大小应该在几十MB左右。
  2. 运行版本检查:./build/px4_sitl_default/bin/px4 --version,会输出PX4的版本号和构建时间。
  3. 启动仿真测试:直接运行 make px4_sitl_default gazebo,看Gazebo窗口能不能正常打开,终端有没有报错。

我曾经遇到过一个问题:编译成功了,但启动仿真时一直报 ERROR [simulator] No simulator backend found。查了半天,发现是Gazebo的插件没编译进去。后来重新执行 make clean 再编译才解决。所以,如果遇到奇怪的问题,先试试 make clean 再重新编译。

4.5 知识体系梳理

我把这一章的核心逻辑画了张图,方便你理解整个流程:

PX4源码编译核心流程 克隆PX4仓库 选择编译目标 执行make编译 生成固件文件 固件验证测试 常用编译目标 • px4_sitl_default gazebo • px4_sitl_default jmavsim • px4_fmu-v5_default 固件验证三步 1. 检查文件是否存在 2. 运行版本检查 3. 启动仿真测试 图4-1 PX4源码编译流程与验证

4.6 常见问题与避坑

编译过程中你可能会遇到一些问题,我把自己踩过的坑列出来:

  • 编译卡在子模块更新:网络问题导致子模块下载失败。解决办法:设置git代理,或者手动下载子模块放到对应目录。
  • 缺少依赖库:比如 libgazebo 没装。执行 make px4_sitl_default gazebo 前,确保已经安装了Gazebo和所有依赖。
  • 编译报错后重试:不要直接重新编译,先执行 make clean 清理缓存,再重新编译。我吃过这个亏,浪费了半天时间。
  • 磁盘空间不足:编译过程会生成大量中间文件,确保至少有10GB可用空间。
我的习惯: 每次编译前,我都会先执行 make clean,然后 make px4_sitl_default gazebo。虽然多花点时间,但能避免很多莫名其妙的问题。

好了,这一章的内容就这些。记住,编译成功只是第一步,后面咱们还要配置仿真环境、联调测试。不过那是后面的事了,先把固件跑起来再说。