第二章 PX4源码获取与编译:从零搭建你的开发环境

好,咱们正式开始动手了。这一章我带你走一遍PX4源码的获取和编译流程。说实话,很多新手在这一步就被劝退了——环境配不好,编译报错一堆,连代码都跑不起来。别急,我踩过的坑,今天一次性帮你填平。

2.1 下载PX4源码:选对分支很重要

先说说源码怎么拿。PX4托管在GitHub上,地址是 https://github.com/PX4/PX4-Autopilot。我个人习惯用 git clone 直接拉取,但这里有个细节——分支选择。

注意:不要直接拉master分支!master是开发分支,可能不稳定。我建议用最新的稳定版,比如 v1.14.3v1.15.0-beta1。你在项目里用稳定版,出问题了也好查文档。
# 克隆主仓库
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

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

# 更新子模块(这一步容易忘)
git submodule update --init --recursive

嗯,这里要特别提一下 --recursive 参数。PX4依赖很多子模块,比如uORB、drivers、mavlink等等。如果不加这个参数,你编译时会发现一堆头文件找不到。我在项目中遇到过好几次,同事拉完代码直接编译,报错后一脸懵地来找我——其实就是子模块没拉全。

2.2 配置编译环境:Ubuntu 20.04 是最稳的选择

环境配置这块,我推荐用Ubuntu 20.04 LTS。为什么?因为PX4官方对这个版本的测试最充分。你非要用22.04也行,但有些依赖包版本会变,得自己折腾。

说白了,环境配置就三步:装依赖、装工具链、装仿真器。

2.2.1 安装系统依赖

PX4官方提供了一个自动化脚本,但我建议你手动装,这样出了问题你知道哪里挂了。

# 更新包列表
sudo apt update

# 安装基础依赖
sudo apt install -y \
    git \
    cmake \
    ninja-build \
    python3-pip \
    python3-venv \
    gcc-arm-none-eabi \
    gdb-multiarch \
    libxml2-dev \
    libxslt1-dev \
    libssl-dev \
    libffi-dev \
    libncurses5-dev \
    libncursesw5-dev \
    libudev-dev \
    libusb-1.0-0-dev \
    zlib1g-dev \
    pkg-config \
    protobuf-compiler \
    clang-tidy \
    doxygen \
    graphviz

这里有个坑:gcc-arm-none-eabi 的版本。Ubuntu 20.04 默认装的是 9.x 版本,够用。但如果你用 Ubuntu 22.04,默认装的是 10.x,编译某些老版本固件会报错。我曾经因为这个折腾了一下午,最后老老实实降级了。

2.2.2 安装Python依赖

PX4的编译脚本和测试工具依赖Python包。我建议用虚拟环境,别污染系统Python。

# 创建虚拟环境
python3 -m venv px4_venv
source px4_venv/bin/activate

# 安装PX4 Python工具
pip install --upgrade pip
pip install --user -r PX4-Autopilot/Tools/setup/requirements.txt
小技巧:每次打开终端编译前,记得 source px4_venv/bin/activate。我习惯把这个命令加到 .bashrc 里,省得每次手动敲。

2.2.3 安装仿真环境(可选但推荐)

如果你没有真机,或者想先调试逻辑,Gazebo仿真是个好选择。安装命令如下:

# 安装Gazebo 11(Ubuntu 20.04默认)
sudo apt install -y gazebo11 libgazebo11-dev

# 安装PX4的Gazebo插件
cd PX4-Autopilot
make gazebo

你想想看,没有真机的时候,仿真环境就是你的救命稻草。我刚开始做驱动开发时,先在Gazebo里跑通了逻辑,才敢上真机。不然炸一次机,成本够买好几块开发板了。

2.3 编译目标固件:从make命令开始

环境配好了,咱们来编译固件。PX4用 make 命令管理编译,格式是 make [board]_[target]

常用的目标有:

目标 说明 典型用途
px4_fmu-v5_default Pixhawk 4 (FMUv5) 固件 最常见的硬件平台
px4_fmu-v6x_default Pixhawk 6X (FMUv6X) 固件 新一代高性能飞控
sitl_default 软件在环仿真 无硬件调试
gazebo Gazebo仿真 配合Gazebo做HITL/SITL

举个例子,编译Pixhawk 4的固件:

cd PX4-Autopilot
make px4_fmu-v5_default

第一次编译会比较慢,因为要下载工具链、编译所有模块。我建议用 -j 参数指定并行编译核心数,比如 make -j4 px4_fmu-v5_default,能快不少。

核心流程:编译过程其实就三步——配置(cmake)、编译(make)、打包(生成 .px4 文件)。你可以在 build/ 目录下看到中间产物,比如 px4_fmu-v5_default.px4 就是最终固件。

2.4 常见编译错误解决:我踩过的坑都在这了

编译报错是家常便饭。别慌,大部分问题都有固定解法。我整理了几个高频错误,你遇到了直接对号入座。

2.4.1 错误1:找不到 arm-none-eabi-gcc

现象:

/bin/sh: 1: arm-none-eabi-gcc: not found

原因: 工具链没装或者没加到PATH里。

解决:

# 检查是否安装
which arm-none-eabi-gcc

# 如果没装,重新安装
sudo apt install --reinstall gcc-arm-none-eabi

# 如果装了但找不到,手动加PATH
export PATH=$PATH:/usr/bin

我曾经犯过一个低级错误:装了工具链但忘了source环境变量,结果折腾了半小时才发现。

2.4.2 错误2:子模块缺失

现象:

fatal: Not a git repository: /path/to/PX4-Autopilot/src/modules/uORB

原因: 克隆时没加 --recursive,或者子模块没更新。

解决:

git submodule update --init --recursive

嗯,这个错误我见得太多了。尤其是团队协作时,有人拉代码忘了加参数,编译直接挂。我的建议是:每次拉完代码,先跑一遍 git submodule status 检查一下。

2.4.3 错误3:Python依赖版本冲突

现象:

ModuleNotFoundError: No module named 'numpy'

原因: 虚拟环境没激活,或者依赖没装全。

解决:

# 激活虚拟环境
source px4_venv/bin/activate

# 重新安装依赖
pip install --user -r PX4-Autopilot/Tools/setup/requirements.txt
注意:不要用 sudo pip install!这会把包装到系统Python里,容易搞乱环境。我建议始终用虚拟环境。

2.4.4 错误4:内存不足导致编译崩溃

现象: 编译到一半,终端卡死或者报 Killed

原因: 并行编译太猛,内存爆了。尤其是虚拟机用户,默认只给2GB内存。

解决:

# 减少并行数
make -j2 px4_fmu-v5_default

# 或者用ninja(更省内存)
make px4_fmu-v5_default NINJA=1

你想想看,编译PX4这种大型项目,内存少于4GB真的会卡。我自己的开发机是16GB内存,开8个并行编译都没问题。如果你用虚拟机,建议至少给4GB。

2.5 知识体系总览:一张图看懂本章

说了这么多,我画了一张流程图,帮你把整个流程串起来。从源码获取到固件生成,每一步都清晰可见。

PX4源码获取与编译流程 1. 获取源码 git clone + 子模块 2. 配置环境 系统依赖 + Python + 仿真 3. 选择目标 px4_fmu-v5 / sitl / gazebo 4. 执行编译 make [board]_[target] 5. 生成固件 build/xxx.px4 常见问题速查 • 子模块缺失 → git submodule update • 工具链找不到 → 检查PATH • Python报错 → 激活虚拟环境 • 内存不足 → 减少并行数 • 编译卡死 → 用ninja替代make • 版本不兼容 → 检查Ubuntu版本 • 权限问题 → 不要用sudo编译 • 磁盘空间 → 清理build目录 • 网络超时 → 换国内镜像源 • 依赖冲突 → 用虚拟环境隔离

2.6 避坑指南:我踩过的那些坑

最后,分享几个我亲身经历的教训,希望能帮你少走弯路。

  • 不要用root用户编译。 我曾经图省事,用sudo make编译,结果生成的固件权限混乱,烧录时死活识别不到。后来查了半天才发现是权限问题。
  • 编译前先清理。 如果你切换了分支或者改了配置,记得先 make cleanmake distclean。不然残留的中间文件会导致奇怪的问题。
  • 注意磁盘空间。 PX4编译一次大概占用2-3GB空间。如果你频繁编译,build目录会越来越大。我习惯定期 rm -rf build/ 清理一下。
  • 网络问题。 国内访问GitHub有时很慢。我建议用代理,或者把 git:// 换成 https://。子模块下载失败时,多试几次 git submodule update

好了,这一章的内容就到这。环境搭好了,下一章咱们就可以开始写真正的驱动代码了。记住,编译环境是基础,基础不牢,地动山摇。花点时间把这一步走稳,后面会顺利很多。


专注资料整理