第一章:PX4驱动开发环境搭建

说实话,很多新手一上来就急着写驱动代码,结果卡在环境搭建上好几个星期。我当年也踩过这个坑——编译报错、工具链不匹配、uORB消息死活收不到。嗯,这节课我们就从零开始,把地基打牢。

1.1 编译环境:Ubuntu + PX4工具链

我个人习惯用 Ubuntu 20.04 LTS,稳定,坑少。如果你用Windows,建议装个虚拟机或者WSL2。别问我为什么不用Mac——我在项目里试过,Homebrew装依赖能装到怀疑人生。

先装基础依赖:

sudo apt update
sudo apt install git zip cmake build-essential genromfs ninja-build
sudo apt install python3-pip python3-venv

然后装PX4官方推荐的脚本工具链:

git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl gazebo

第一次编译会下载很多依赖,大概20-30分钟。这时候你可以去泡杯咖啡。我曾经在客户现场演示时,网络断了,编译到一半报错……场面一度很尴尬。所以建议你提前把依赖包下载好,或者用国内镜像源。

小技巧: 如果网络慢,可以设置pip镜像:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

1.2 交叉编译工具链:给STM32/STM32F7用的

我们做驱动开发,最终是要烧到飞控板上的。所以必须装交叉编译工具链。说白了,就是让你的PC能编译出ARM架构的二进制文件。

我推荐用 arm-none-eabi-gcc 版本 9-2020-q2-update。版本太新或太旧都可能出问题。我在一个项目里用过10.3版本,结果链接阶段报了一堆莫名其妙的警告,折腾了两天才发现是工具链版本不兼容。

sudo apt install gcc-arm-none-eabi
# 或者手动下载:
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2
tar xjf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2
export PATH=$PATH:~/gcc-arm-none-eabi-9-2020-q2-update/bin

验证是否装好:

arm-none-eabi-gcc --version

看到版本号就对了。如果提示找不到命令,检查一下PATH有没有加对。

注意: 不要用系统自带的gcc去编译飞控固件!那是给x86用的,编译出来的东西跑不到STM32上。我曾经见过有人拿gcc编译,烧进去飞控直接不启动……

1.3 下载PX4源码:分支选择与目录结构

源码下载很简单,但分支选择有讲究。我建议用 v1.13.xv1.14.x 稳定版。main分支虽然新,但可能不稳定,不适合学习。

git clone https://github.com/PX4/PX4-Autopilot.git --branch v1.14.3 --recursive
cd PX4-Autopilot

下载完后,看看目录结构。你重点关注这几个:

目录 作用
src/modules/ 驱动模块源码,我们写驱动主要在这里
src/drivers/ 底层驱动,比如I2C、SPI、UART
msg/ uORB消息定义文件(.msg)
boards/ 板级支持包,不同飞控板的配置
build/ 编译输出目录

我第一次看这个目录时,感觉像进了迷宫。后来发现,其实你只需要关注 src/driversmsg 两个目录就够了。其他目录暂时不用管。

1.4 uORB消息机制:驱动之间的“快递系统”

uORB是PX4里最核心的通信机制。说白了,就是各个模块之间发消息、收消息的“快递系统”。

比如,GPS模块发布了一个位置消息,姿态估计模块订阅这个消息,然后计算出姿态。整个过程不需要模块之间直接调用函数,而是通过uORB这个中间人。

为什么会这样设计?因为无人机系统很复杂,模块之间解耦后,你可以单独升级GPS驱动,不影响姿态估计模块。我在一个项目中,把GPS模块从UBlox换成了国产的,只需要改驱动,上层代码完全不用动。

uORB的核心概念就三个:

  • 发布(Publish):驱动把数据发出去
  • 订阅(Subscribe):其他模块来取数据
  • 消息(Message):数据格式,定义在 .msg 文件中

看一个最简单的消息定义(msg/sensor_accel.msg):

uint64 timestamp        # 时间戳
float32[3] x            # X轴加速度
float32[3] y            # Y轴加速度
float32[3] z            # Z轴加速度
uint32 error_count      # 错误计数

嗯,这里要注意:消息字段的顺序和类型不能随便改,否则订阅方解析会出错。我曾经改过一个消息字段的类型,从 uint16 改成 uint32,结果忘了更新所有订阅方,导致日志数据全乱了。排查了两天才发现是类型不匹配。

1.5 编译第一个固件:验证环境

环境搭好了,我们来编译一个固件验证一下。以Pixhawk 4为例:

make px4_fmu-v5_default

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

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

如果报错,别慌。90%的错误都是依赖没装全。检查一下:

  • gcc-arm-none-eabi 版本对不对
  • python3pip 装了没
  • ninja-build 装了没

我建议你第一次编译时,用 make px4_fmu-v5_default 2>&1 | tee build.log 把日志保存下来。这样报错时可以回头查,不用重新编译。

核心要点: 环境搭建是驱动开发的第一步,也是最容易出问题的一步。花30分钟把环境配好,后面写驱动会顺畅很多。别像我当年一样,环境没配好就急着写代码,结果浪费了一整天在编译报错上。

1.6 本章知识体系

下面这张图,帮你理清本章的知识脉络:

PX4驱动开发环境 编译环境(Ubuntu) • 安装基础依赖 • 配置Python/pip • 下载PX4源码 交叉编译工具链 • arm-none-eabi-gcc • 版本9-2020-q2 • PATH环境变量 uORB消息机制 • 发布/订阅模型 • .msg消息定义 • 模块间解耦 编译验证:make px4_fmu-v5_default src/modules/ 驱动模块 msg/ 消息定义文件 boards/ 板级支持 环境搭建 → 编译验证 → 驱动开发

这张图把本章内容串起来了。你从编译环境开始,装好工具链,下载源码,理解uORB,最后编译验证。每一步都是下一步的基础。

好了,环境搭好了,下一章我们开始写第一个真正的驱动——一个简单的LED闪烁驱动。到时候你会看到uORB消息是怎么在代码里发布和订阅的。


专注资料整理