4. PX4固件编译:源码下载、编译环境配置、make命令详解、常见编译错误解决
好,咱们进入正题。这一章是实操性最强的一节,也是很多新手朋友容易卡住的地方。PX4固件编译,说白了就是把我们写的代码、官方提供的驱动、中间件这些东西,打包成一个能在飞控板上跑起来的二进制文件。这个过程看似简单,但里面的坑不少。我这些年带团队,光是编译环境配置就劝退了好几个新人。今天咱们就把这块彻底捋清楚。
4.1 源码下载:从哪里来,到哪里去
PX4的源码托管在GitHub上。我个人习惯用git clone直接拉取,而不是下载zip包。为什么呢?因为后续你要切换分支、更新代码、提交修改,git管理起来方便得多。
核心命令:
git clone https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
git checkout v1.14.0 # 建议拉取稳定版本
这里有个小建议:不要直接拉master分支。master是开发分支,可能今天能编译通过,明天就挂了。我遇到过好几次,早上拉下来的代码下午就编译报错,查了半天发现是上游刚合了一个有问题的commit。所以,老老实实用release版本,比如v1.13.3、v1.14.0这些。
我的习惯:在本地建一个 ~/px4_workspace 目录,所有飞控项目都放里面。源码、编译产物、仿真工具链分开存放,清爽得很。
4.2 编译环境配置:Ubuntu是首选
PX4官方推荐Ubuntu 20.04或22.04。为什么?因为工具链支持最全,社区问题反馈也最多。你用Windows也能编译,但相信我,那是在给自己找麻烦。我曾经在Windows上折腾了三天,最后还是切回了Ubuntu。
环境配置主要分三步:
- 安装基础依赖——编译器、cmake、python等
- 安装ARM交叉编译工具链——用于编译飞控板固件
- 安装仿真依赖——Gazebo、jMAVSim等
官方提供了一个自动化脚本,一键安装:
cd PX4-Autopilot
bash ./Tools/setup/ubuntu.sh # 会自动安装所有依赖
嗯,这里要注意。这个脚本会安装很多东西,包括ROS、Gazebo这些你可能暂时用不到的组件。如果你只想编译固件,不需要仿真,可以加个参数:
bash ./Tools/setup/ubuntu.sh --no-sim-tools
这样只安装编译固件必需的依赖,省时间也省空间。
我曾经踩过的坑:脚本执行到一半网络超时,然后我直接Ctrl+C中断了。结果后面编译时报错说缺少某个库,排查了半天才发现是安装不完整。所以,务必等脚本跑完,中间不要中断。如果网络不好,换个时间段再试,或者用代理。
4.3 make命令详解:不只是编译
PX4的编译系统基于CMake,但日常使用我们几乎不直接调cmake,而是用make命令。为什么?因为PX4封装了一层,用make更简单。
常用的make命令格式是:
make [目标板]_[版本]
举个例子:
| 命令 | 含义 |
|---|---|
make px4_fmu-v5_default |
编译Pixhawk 4(FMUv5)的默认固件 |
make px4_fmu-v6x_default |
编译Pixhawk 6X的固件 |
make px4_sitl_default |
编译SITL仿真固件(在电脑上跑) |
make px4_fmu-v5_default upload |
编译并上传到飞控板 |
你想想看,这么多板子,我怎么知道该用哪个?很简单,在源码目录下执行:
make list_config_targets
它会列出所有支持的板子和配置。我每次拿到一块新飞控板,第一件事就是跑这个命令,看看官方有没有支持。
几个实用技巧:
make -j4:用4个线程并行编译,速度翻倍。我一般用-j$(nproc)自动检测CPU核心数。make clean:清理编译产物。如果改了某些底层配置,最好clean一下再重新编译。make distclean:清理得更彻底,连cmake缓存都删掉。遇到诡异的编译错误时,这招很管用。
4.4 常见编译错误解决:实战经验
编译错误是家常便饭。别慌,大部分错误都有规律可循。我总结了几类最常见的:
4.4.1 缺少依赖库
错误信息类似:fatal error: xxx.h: No such file or directory
说白了就是某个头文件找不到。原因通常是依赖没装全。解决办法:
# 先试试安装官方推荐的依赖
bash ./Tools/setup/ubuntu.sh
# 如果还不行,根据错误提示的库名,手动安装
sudo apt install libxxx-dev
我曾经遇到一个情况,报错说缺少 mavlink 头文件。我明明装了mavlink啊?后来发现是版本不对。PX4对mavlink的版本有要求,用apt装的可能太旧了。解决办法是用PX4自带的mavlink子模块:
git submodule update --init --recursive
4.4.2 编译器版本不匹配
错误信息:unrecognized command line option 或 internal compiler error
PX4对gcc版本有要求。Ubuntu 20.04默认的gcc-9没问题,但如果你装了gcc-10或gcc-11,可能会出问题。我建议:
# 查看当前gcc版本
gcc --version
# 如果需要切换版本
sudo update-alternatives --config gcc
我的做法:在Ubuntu 20.04上,我固定用gcc-9。Ubuntu 22.04用gcc-11。不要混用。
4.4.3 内存不足
错误信息:virtual memory exhausted 或 killed
编译PX4挺吃内存的,尤其是并行编译时。如果你虚拟机只分了2GB内存,很容易被系统kill掉。解决办法:
- 减少并行线程数:
make -j2甚至make -j1 - 增加swap空间:
sudo fallocate -l 4G /swapfile - 或者干脆升级硬件,给虚拟机分4GB以上内存
4.4.4 子模块未更新
错误信息:fatal: not a git repository 或某些文件找不到
PX4用了很多git子模块,比如mavlink、uavcan等。如果子模块没拉取完整,编译就会报错。解决办法:
git submodule update --init --recursive
这个命令要执行完整,网络不好的话可能会失败。我一般会执行两遍,确保所有子模块都拉下来了。
4.5 知识体系总览
下面这张图是我自己整理的,把PX4固件编译的整个流程串起来了。你对照着看,心里就有谱了。
这张图把整个流程分成了四步:源码获取、环境配置、编译固件、上传飞控。左侧列出了最常见的编译错误,底部是make命令的详细说明。你编译时遇到问题,先对照这张图定位一下是哪个环节出了问题。
最后说一句:编译环境第一次配置确实有点繁琐,但配好之后,后面就一马平川了。我建议你把配置好的环境做个快照或者写个脚本,下次换机器直接恢复,省得重复劳动。
公众号:蓝海资料掘金营,微信deep3321