2. PX4源码编译环境搭建
说实话,环境搭建这一步,看着简单,但坑是真不少。我带过不少新人,十有八九都卡在编译报错上。我自己刚入行那会儿,也在这上面折腾了两三天。
这一章,咱们就把环境捋顺。你跟着我的步骤走,基本能一次过。
2.1 Ubuntu系统基础配置
我建议你直接用 Ubuntu 20.04 LTS 或 22.04 LTS。别用太新的版本,比如24.04,有些依赖包还没适配好,容易出幺蛾子。
装好系统后,第一件事就是换源。国内网络环境,你懂的。
sudo apt update 和 sudo apt upgrade。
接下来,安装基础依赖。这是PX4官方推荐的命令,我直接贴出来:
sudo apt update
sudo apt install \
git \
zip \
cmake \
build-essential \
genromfs \
ninja-build \
exiftool \
python3-pip \
python3-setuptools \
python3-wheel \
python3-dev \
python3-empy \
python3-numpy \
python3-pyparsing \
python3-jinja2 \
python3-toml \
python3-packaging \
python3-jsonschema \
-y
嗯,这里要注意。有些包名在不同Ubuntu版本里可能不一样。比如 python3-empy,在22.04里可能叫 python3-empy 但版本不对。如果报错,就用 pip3 install empy 补装一下。
2.2 PX4 Firmware源码下载
源码下载,我习惯用 git clone。但别直接克隆主分支,那个太大了,而且包含很多我们不用的硬件平台代码。
我个人习惯的做法是:
- 先创建一个工作目录,比如
~/px4_workspace。 - 然后克隆时加上
--depth=1参数,只拉取最新版本。 - 最后切换到我们需要的稳定版本标签。
mkdir -p ~/px4_workspace
cd ~/px4_workspace
git clone https://github.com/PX4/PX4-Autopilot.git --depth=1 -b v1.14.3
cd PX4-Autopilot
git submodule update --init --recursive
git submodule update 这一步很关键,也最容易失败。因为子模块仓库分散在全球各地,网络波动就容易中断。我曾经在项目交付前夜,因为子模块没拉全,编译死活过不去。建议用代理,或者多试几次。
下载完成后,目录结构大概是这样的:
| 目录/文件 | 说明 |
|---|---|
src/ |
核心源码,包括模块、驱动、库 |
boards/ |
各硬件平台的板级配置 |
cmake/ |
CMake构建脚本 |
ROMFS/ |
文件系统镜像,存放参数默认值 |
Tools/ |
辅助工具和脚本 |
makefile |
顶层Makefile,编译入口 |
2.3 交叉编译工具链安装
我们要在电脑上编译飞控代码,但飞控的CPU是ARM架构的。所以需要交叉编译工具链——说白了,就是在x86电脑上生成ARM可执行文件的工具。
PX4官方推荐用 GNU Arm Embedded Toolchain。我建议直接装 9-2020-q2-update 这个版本,稳定,兼容性好。
安装步骤:
- 下载工具链压缩包。
- 解压到
/opt目录。 - 配置环境变量。
cd ~/px4_workspace
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
sudo tar xjf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -C /opt/
export PATH=/opt/gcc-arm-none-eabi-9-2020-q2-update/bin:$PATH
验证是否安装成功:
arm-none-eabi-gcc --version
如果输出版本信息,就说明装好了。
export PATH=... 这行加到 ~/.bashrc 文件末尾,这样每次打开终端就不用重新设置了。
2.4 首次编译验证
环境都配好了,咱们来编译一把。我选 px4_fmu-v5 这个目标板,也就是Pixhawk 4用的。
cd ~/px4_workspace/PX4-Autopilot
make px4_fmu-v5_default
第一次编译会比较慢,因为要下载一些依赖包,还要编译所有模块。我的机器大概要15-20分钟。
编译过程中,你会看到类似这样的输出:
[ 1%] Built target git_submodule_src_drivers_gps
[ 2%] Built target git_submodule_src_modules_uxrce_dds_client
...
[100%] Built target px4_fmu-v5_default
看到 [100%] 就说明编译成功了。生成的固件在 build/px4_fmu-v5_default/ 目录下,文件名是 px4_fmu-v5_default.px4。
make clean 清理,再重新 make。我曾经遇到过因为Python版本不对,导致 jsonschema 报错,后来用 pip3 install --upgrade jsonschema 解决了。
下面这张图,帮你理清整个环境搭建的流程:
编译成功后,你可以在 build/px4_fmu-v5_default/ 目录下找到生成的固件。这个固件就是我们要烧录到飞控里的东西。
嗯,到这里,环境搭建就完成了。你手上有了一把能编译PX4的钥匙。接下来,我们就可以开始真正的二次开发了。