2. 开发环境搭建:PX4源码下载、交叉编译工具链安装、仿真环境配置

好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞的时候也踩了不少坑。你想想看,一个完整的PX4开发环境,要搞定源码、编译器、仿真器三件套。任何一个环节出问题,后面都跑不起来。我个人的习惯是,先把大框架理清楚,再一步步动手。

核心三要素:

  • 源码:PX4固件本体,所有代码都在这里
  • 交叉编译工具链:把代码变成飞控硬件能识别的机器码
  • 仿真环境:没有硬件也能调试逻辑,省时省力
PX4 开发环境搭建 源码下载 git clone + 子模块 交叉编译工具链 arm-none-eabi-gcc 仿真环境 Gazebo / jMAVSim Firmware 主仓库 GCC + CMake + Ninja SITL 软件在环

2.1 源码下载:别急着 git clone

很多人上来就 git clone https://github.com/PX4/PX4-Autopilot.git,然后等半天。嗯,这里要注意,PX4 的仓库包含了很多子模块(submodule),直接 clone 主仓库是不够的。我建议你这么做:

# 第一步:克隆主仓库(带 --recursive 自动拉子模块)
git clone --recursive https://github.com/PX4/PX4-Autopilot.git

# 如果已经 clone 了,补上子模块
cd PX4-Autopilot
git submodule update --init --recursive

我的小技巧: 国内网络拉子模块经常超时。我一般先配好 git 代理,或者用 gitee 镜像。实在不行,就手动一个一个子模块去拉。虽然麻烦点,但至少不会卡死。

源码下载完后,建议你切到一个稳定的 release 版本。我个人习惯用 v1.13.3v1.14.0,这两个版本对 UART 驱动的支持比较成熟。

git checkout v1.14.0
git submodule update --recursive

2.2 交叉编译工具链:ARM 还是 x86?

说白了,交叉编译就是「在 PC 上编译,在飞控上运行」。飞控的芯片通常是 ARM Cortex-M 或 Cortex-R 系列,所以我们需要 arm-none-eabi-gcc 这套工具链。

我记得第一次装工具链时,直接 apt-get 装了个 gcc-arm-none-eabi,结果版本太老,编译 PX4 报了一堆错。后来我学乖了,直接用 PX4 官方提供的脚本:

# 在 PX4-Autopilot 目录下执行
make px4_sitl_default

这个命令会自动检测并安装缺失的工具链。如果网络不好,也可以手动下载:

平台 工具链 推荐版本
Linux (Ubuntu 20.04+) gcc-arm-none-eabi-10.3-2021.10 10.3
macOS brew install gcc-arm-none-eabi 最新稳定版
Windows (WSL2) 同上 Linux 方案 10.3

避坑指南: 我曾经在 Ubuntu 22.04 上直接用 apt 装工具链,结果编译出来的固件在 Pixhawk 上跑不起来。后来发现是 GCC 版本太高,生成了不兼容的指令。所以,一定要用 PX4 官方推荐的版本

2.3 仿真环境配置:没有硬件也能飞

仿真环境,说白了就是「软件在环」(SITL)。你可以在 PC 上跑一个虚拟的飞控,配合 Gazebo 或 jMAVSim 模拟器,直接调试 UART 驱动逻辑。我个人觉得,这是开发效率最高的方式。

安装仿真环境也很简单,PX4 的 Tools/setup 目录下提供了自动化脚本:

# Ubuntu 一键安装
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh

# 这个脚本会安装:
# - Gazebo 9/11(仿真器)
# - MAVSDK(通信库)
# - Python 依赖(用于脚本控制)

装完之后,验证一下:

# 启动 SITL 仿真
cd PX4-Autopilot
make px4_sitl gazebo

# 如果看到控制台输出 "INFO  [simulator] Waiting for simulator to connect..."
# 说明环境已经跑起来了

我的经验: 第一次启动 Gazebo 可能会很慢,因为要下载模型文件。你可以先手动下载 gz-sim 的模型包,或者直接用 make px4_sitl jmavsim 启动轻量级的 jMAVSim 仿真器,那个快很多。

2.4 验证环境:跑一个简单的 UART 测试

环境搭好了,怎么确认 UART 驱动能正常工作?我一般会编译一个带 UART 测试的固件,然后在仿真里跑一下。

# 编译带 UART 测试的 SITL 固件
make px4_sitl_default

# 启动后,在 QGroundControl 里查看 MAVLink 控制台
# 输入:uorb top /serial
# 如果能看到串口数据在更新,说明 UART 驱动链路是通的

嗯,到这里,你的开发环境就基本就绪了。源码在手,工具链就位,仿真器待命。接下来我们就可以深入 UART 驱动的代码细节了。

本章小结:

  • 源码下载记得带 --recursive,子模块一个不能少
  • 交叉编译工具链用官方推荐版本,别图新
  • 仿真环境用自动化脚本装,省心省力
  • 跑一个 SITL 仿真验证环境是否正常
专注资料整理