2. PX4源码编译:从零搭建你的开发环境

这一章,我们来搞定PX4的源码编译。说实话,很多新手都卡在这一步——环境没配好,编译报错一堆,心态直接崩了。我当年第一次编译PX4时,光装工具链就折腾了两天。所以这一章,我会把那些坑提前告诉你。

核心要点:Ubuntu环境搭建 → 交叉编译工具链配置 → Firmware源码下载 → 自定义编译选项。这四个步骤,一步都不能省。

2.1 Ubuntu环境搭建:别用Windows硬扛

PX4官方推荐Ubuntu 20.04 LTS。为什么?因为依赖库的版本最稳定。我试过在22.04上编译,有些库的兼容性问题会让你抓狂。

你需要准备:

  • Ubuntu 20.04 LTS(或18.04,但20.04更省心)
  • 至少8GB内存,20GB空闲磁盘
  • 稳定的网络(国内用户建议配置代理)

安装基础依赖,直接跑官方脚本:

sudo apt-get update
sudo apt-get install -y \
    git zip cmake build-essential \
    ninja-build exiftool \
    python3-pip python3-dev \
    python3-venv python3-numpy \
    astyle bc curl \
    libxml2-dev libxslt1-dev \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev \
    libudev-dev libsdl2-dev \
    ccache

嗯,这里要注意——ccache一定要装。我有个同事没装,每次全量编译等半小时,装了之后增量编译只要几分钟。

小技巧:国内用户可以把apt源换成清华或中科大的镜像,下载速度能快10倍。具体方法:修改/etc/apt/sources.list,把archive.ubuntu.com替换成mirrors.tuna.tsinghua.edu.cn。

2.2 交叉编译工具链:为什么需要它?

你想想看,你的电脑是x86架构,但飞控板是ARM架构。直接在x86上编译出来的二进制,ARM芯片跑不了。交叉编译工具链就是干这个的——在x86上生成ARM能跑的代码。

PX4官方推荐使用GCC ARM Embedded工具链。我个人习惯用9-2020-q2-update版本,稳定,没出过幺蛾子。

安装步骤:

# 下载工具链
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/9-2020-q2-update/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2

# 解压到 /opt
sudo tar xjf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -C /opt/

# 配置环境变量
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-9-2020-q2-update/bin' >> ~/.bashrc
source ~/.bashrc

# 验证安装
arm-none-eabi-gcc --version

验证成功的话,你会看到类似这样的输出:

arm-none-eabi-gcc (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)

避坑指南:我曾经遇到过一个问题——装了多个版本的GCC工具链,结果系统默认调用了错误的版本,编译出来的固件飞控板不识别。解决方案:用which arm-none-eabi-gcc确认路径,确保指向你安装的那个版本。

2.3 Firmware源码下载:选对分支很重要

PX4的源码托管在GitHub上。我个人建议不要直接clone master分支,因为master可能包含未稳定测试的代码。我一般用v1.13.x或v1.14.x的稳定分支。

# 克隆主仓库
git clone https://github.com/PX4/Firmware.git --recursive
cd Firmware

# 切换到稳定分支
git checkout v1.13.3

# 更新子模块
git submodule update --init --recursive

为什么一定要加--recursive?因为PX4依赖了很多第三方库(比如uavcan、mavlink),这些库以子模块形式存在。不拉子模块,编译到一半会报错说找不到头文件。

网络不好的同学:国内clone大仓库容易断。你可以先用git clone --depth=1只拉最新版本,减少数据量。或者用Gitee上的镜像仓库,速度会快很多。

2.4 编译:从源码到固件

环境搭好了,源码也拉下来了,接下来就是见证奇迹的时刻。编译PX4固件,核心命令就一行:

make px4_fmu-v5_default

这个命令的意思是:编译针对Pixhawk 4(FMUv5)的默认配置固件。不同的飞控板对应不同的目标名:

飞控板 目标名 说明
Pixhawk 4 px4_fmu-v5_default 最常见的配置
Pixhawk 1 px4_fmu-v2_default 老款飞控
CUAV V5+ px4_fmu-v5_default 与Pixhawk 4兼容
Holybro Durandal px4_fmu-v5x_default 高性能飞控
QGroundControl仿真 px4_sitl_default 不依赖硬件

第一次编译会比较慢,因为要下载依赖、编译所有模块。我的经验是:第一次全量编译大约需要15-30分钟,取决于你的CPU和网络。之后增量编译就快多了。

编译成功后,你会看到类似这样的输出:

-- Build files have been written to: /home/user/Firmware/build/px4_fmu-v5_default
[100%] Built target px4_fmu-v5_default

生成的固件在build/px4_fmu-v5_default/目录下,文件名是px4_fmu-v5_default.px4。这个文件就是你要烧录到飞控板上的固件。

常见错误:如果编译过程中出现arm-none-eabi-gcc: not found,说明工具链没配好。检查~/.bashrc里的PATH配置,或者重新执行source ~/.bashrc。如果出现fatal error: mavlink/v2.0/...: No such file or directory,说明子模块没拉全,执行git submodule update --init --recursive。

2.5 自定义编译选项:用cmake参数定制你的固件

默认配置能满足大部分场景,但有时候你需要定制。比如:

  • 去掉不需要的模块,减小固件体积
  • 启用调试日志,方便排查问题
  • 指定不同的编译器优化等级

PX4使用cmake作为构建系统。你可以通过cmake参数来定制编译行为。我个人最常用的几个参数:

cmake参数 作用 示例
-DCMAKE_BUILD_TYPE=Debug 启用调试符号,方便GDB调试 make px4_fmu-v5_default CONFIG=Debug
-DCMAKE_BUILD_TYPE=Release 优化性能,去掉调试信息 make px4_fmu-v5_default CONFIG=Release
-DCMAKE_CXX_FLAGS="-Os" 优化固件体积(适合Flash小的飞控) make px4_fmu-v2_default EXTRA_FLAGS="-Os"
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON 生成compile_commands.json,方便IDE代码补全 make px4_fmu-v5_default(默认已开启)

举个例子,如果你想编译一个带调试信息的固件,方便用JTAG调试:

make px4_fmu-v5_default CONFIG=Debug

如果你想编译一个最小体积的固件,去掉所有不必要的模块:

make px4_fmu-v5_default CONFIG=Minimal

你还可以通过修改boards/px4/fmu-v5/default.cmake文件,手动启用或禁用模块。比如,去掉GPS模块:

# 在 default.cmake 中添加
px4_remove_module(modules/gps)

我的经验:调试阶段用CONFIG=Debug,方便看日志。正式部署时用CONFIG=Release,性能更好。如果飞控板Flash空间紧张(比如FMUv2只有1MB),可以用CONFIG=Minimal,能省出200KB左右的空间。

2.6 本章知识体系

下面这张图总结了本章的核心流程和知识点之间的关系:

PX4源码编译知识体系 PX4源码编译知识体系 Ubuntu环境搭建 依赖库安装 交叉编译工具链 GCC ARM Embedded Firmware源码下载 Git + 子模块 编译与定制 cmake参数 apt安装依赖 PATH环境变量 git clone --recursive make 目标名 输出:.px4固件文件 build/目标名/目标名.px4 关键提醒 • 国内用户配置代理或镜像源,避免下载失败 • 第一次编译务必加 --recursive 拉取子模块 • 调试用 Debug 配置,部署用 Release 配置 • 遇到编译错误先检查工具链版本和子模块完整性 图2-1 PX4源码编译知识体系与流程

这张图把本章的四个核心步骤串起来了。从环境搭建开始,到工具链配置,再到源码下载,最后编译输出固件。每一步都有对应的子节点和注意事项。你可以把它当作一个检查清单——每完成一步,就确认一下。

好了,环境搭好了,固件也编译出来了。下一件事就是把它烧录到飞控板上。不过那是后面章节的内容了。这一章的内容,够你折腾一阵子了。如果编译过程中遇到问题,别慌——先检查工具链路径,再确认子模块是否完整,最后看看是不是网络问题。这三个地方,覆盖了90%的编译失败原因。