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 固件生成验证
编译完了,怎么确认固件是好的?我一般做三步验证:
- 检查可执行文件是否存在:
ls -la build/px4_sitl_default/bin/px4,文件大小应该在几十MB左右。 - 运行版本检查:
./build/px4_sitl_default/bin/px4 --version,会输出PX4的版本号和构建时间。 - 启动仿真测试:直接运行
make px4_sitl_default gazebo,看Gazebo窗口能不能正常打开,终端有没有报错。
我曾经遇到过一个问题:编译成功了,但启动仿真时一直报 ERROR [simulator] No simulator backend found。查了半天,发现是Gazebo的插件没编译进去。后来重新执行 make clean 再编译才解决。所以,如果遇到奇怪的问题,先试试 make clean 再重新编译。
4.5 知识体系梳理
我把这一章的核心逻辑画了张图,方便你理解整个流程:
4.6 常见问题与避坑
编译过程中你可能会遇到一些问题,我把自己踩过的坑列出来:
- 编译卡在子模块更新:网络问题导致子模块下载失败。解决办法:设置git代理,或者手动下载子模块放到对应目录。
- 缺少依赖库:比如
libgazebo没装。执行make px4_sitl_default gazebo前,确保已经安装了Gazebo和所有依赖。 - 编译报错后重试:不要直接重新编译,先执行
make clean清理缓存,再重新编译。我吃过这个亏,浪费了半天时间。 - 磁盘空间不足:编译过程会生成大量中间文件,确保至少有10GB可用空间。
make clean,然后 make px4_sitl_default gazebo。虽然多花点时间,但能避免很多莫名其妙的问题。
好了,这一章的内容就这些。记住,编译成功只是第一步,后面咱们还要配置仿真环境、联调测试。不过那是后面的事了,先把固件跑起来再说。