2. 开发环境搭建:PX4源码下载、交叉编译工具链安装、仿真环境配置
好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞的时候也踩了不少坑。你想想看,一个完整的PX4开发环境,要搞定源码、编译器、仿真器三件套。任何一个环节出问题,后面都跑不起来。我个人的习惯是,先把大框架理清楚,再一步步动手。
核心三要素:
- 源码:PX4固件本体,所有代码都在这里
- 交叉编译工具链:把代码变成飞控硬件能识别的机器码
- 仿真环境:没有硬件也能调试逻辑,省时省力
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.3 或 v1.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 仿真验证环境是否正常