3、PX4源码编译:克隆PX4 Autopilot源码、安装依赖、编译SIL固件、常见编译错误解决
好,咱们进入正题。这一节要干的事,说白了就是把PX4的源码从GitHub上拽下来,装好它要的各种依赖,然后编译出一个能在电脑上跑的SIL(Software In the Loop)固件。
我刚开始接触PX4那会儿,最头疼的就是编译环境。明明照着文档一步步来,结果一跑 make 就报错。后来发现,很多坑其实是可以提前避开的。今天我就把这些经验揉碎了讲给你听。
核心目标:在Ubuntu 20.04/22.04系统上,完成PX4 Autopilot源码的克隆、依赖安装,并成功编译出SIL固件(px4_sitl)。
3.1 克隆PX4 Autopilot源码
首先,你得有个Git。没装的话先装一下:
sudo apt update
sudo apt install git -y
然后找个你喜欢的目录,比如 ~/workspace,执行克隆命令:
cd ~/workspace
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
这里有个细节——--recursive 参数。PX4依赖很多子模块,比如 mavlink、uavcan 这些。不加这个参数,你拉下来的代码是不完整的,编译必挂。我刚开始就吃过这个亏,拉完代码直接编译,报了一堆找不到头文件的错误。
如果你网络不太好,克隆可能会卡住。我个人习惯用代理,或者换个时间段再试。实在不行,可以试试国内镜像源:
git clone https://gitee.com/px4/PX4-Autopilot.git --recursive
克隆完成后,进入目录看看:
cd PX4-Autopilot
git branch -a
你会看到很多分支。我建议你直接用 main 分支,或者最新的稳定版标签,比如 v1.14.3。用 git checkout v1.14.3 切过去就行。
3.2 安装编译依赖
依赖安装是重头戏。PX4官方提供了一个自动化脚本,但说实话,它有时候会漏掉一些东西。我习惯手动来一遍,心里踏实。
先更新系统包:
sudo apt update
sudo apt upgrade -y
然后安装基础编译工具:
sudo apt install -y \
build-essential \
cmake \
ninja-build \
python3-pip \
python3-venv \
curl \
wget \
git \
zip \
unzip
接下来是PX4特有的依赖。运行官方脚本也行:
bash ./Tools/setup/ubuntu.sh
但我更推荐你手动装,因为脚本会装很多你可能用不到的东西。核心依赖其实就这些:
| 依赖项 | 用途 | 安装命令 |
|---|---|---|
| gcc-arm-none-eabi | 编译STM32固件(硬件) | sudo apt install gcc-arm-none-eabi |
| python3-empy | 代码生成模板引擎 | pip3 install empy |
| python3-jinja2 | 模板渲染 | pip3 install jinja2 |
| python3-toml | 解析配置文件 | pip3 install toml |
| python3-numpy | 数值计算 | pip3 install numpy |
小提示:如果你用的是Ubuntu 22.04,Python 3.10是默认版本。有些旧版PX4(比如v1.12)对Python版本有要求,建议用虚拟环境隔离。我个人习惯用 python3 -m venv px4_env 创建一个独立环境。
3.3 编译SIL固件
依赖装好了,咱们来编译SIL固件。SIL固件是跑在电脑上的,不需要硬件。命令很简单:
make px4_sitl
第一次编译会比较慢,因为要下载一些工具链和依赖库。你可能会看到类似这样的输出:
[1/123] Building CXX object src/modules/.../...
[2/123] Building CXX object src/modules/.../...
...
[123/123] Linking CXX executable px4
看到 px4 这个可执行文件生成,就说明编译成功了。它默认放在 build/px4_sitl_default/bin/ 目录下。
如果你想指定某个机型,比如 iris 四旋翼:
make px4_sitl gazebo-classic_iris
这会同时启动Gazebo仿真环境。不过咱们这节只讲编译,仿真后面会细说。
注意:编译SIL固件时,你的电脑内存最好有8GB以上,否则编译过程中可能会因为内存不足而卡死。我有一台4GB内存的老笔记本,编译一次要40分钟,还经常报OOM错误。
3.4 常见编译错误解决
编译过程中难免遇到问题。我把最常见的几个错误和解决方法列出来,你遇到了直接照着查就行。
错误1:找不到 python3-empy
现象:编译时报错 ModuleNotFoundError: No module named 'em'
原因:Python的 empy 包没装。
解决:
pip3 install empy
如果还不行,试试用 pip3 install --user empy。
错误2:arm-none-eabi-gcc 版本不对
现象:编译时提示 arm-none-eabi-gcc: not found 或者版本过低。
原因:系统自带的gcc-arm-none-eabi版本太老,或者没装。
解决:
sudo apt install gcc-arm-none-eabi
# 或者从ARM官网下载最新版
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
export PATH=$PATH:~/gcc-arm-none-eabi-10.3-2021.10/bin
错误3:git submodule 更新失败
现象:编译时提示某个子模块找不到,比如 mavlink 或 uavcan。
原因:克隆时没加 --recursive,或者子模块没更新。
解决:
git submodule update --init --recursive
如果网络慢,可以试试:
git submodule sync --recursive
git submodule update --init --recursive --depth 1
错误4:内存不足导致编译卡死
现象:编译过程中系统无响应,或者报 Killed 错误。
原因:物理内存不够,系统杀掉了编译进程。
解决:
- 关掉其他占用内存的程序(浏览器、IDE等)
- 使用
make -j2限制并行编译任务数(默认是CPU核心数) - 增加交换空间:
sudo fallocate -l 4G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
避坑指南:我曾经在编译时遇到一个很隐蔽的错误——fatal error: math.h: No such file or directory。查了半天,发现是系统缺少 libc6-dev 包。装一下就好了:sudo apt install libc6-dev。这种基础库缺失的问题,在最小化安装的Ubuntu上特别常见。
3.5 知识体系梳理
为了让你对整个编译流程有个直观的认识,我画了一张流程图。它把从源码到SIL固件的完整路径串起来了。
这张图把整个流程分成了四个阶段:克隆、装依赖、编译、生成可执行文件。右侧还列出了最常见的四个坑。你编译的时候,可以对照着这张图来排查问题。
好了,这一节的内容就到这儿。源码拉下来了,依赖装好了,SIL固件也编译通过了。下一节咱们会聊聊怎么用Gazebo跑仿真,让飞机在虚拟世界里飞起来。
公众号:蓝海资料掘金营,微信deep3321