1. 课程导入
各位同学,欢迎来到《PX4无人机系统部署实践》的第一章。今天我们不急着敲代码,先聊聊PX4到底是什么,它从哪来,能干什么。我个人觉得,搞懂生态全景,比背几个API重要得多。
1.1 PX4 的起源与社区
PX4 最早是苏黎世联邦理工学院(ETH Zurich)的一个研究项目。2012年左右,几位博士生想做一个开源的、能用在学术研究上的飞控。后来和3D Robotics合作,再后来交给了开源社区维护。现在由Dronecode基金会托管,Linux基金会旗下的项目。
说白了,它不是一个商业公司的闭源产品,而是一个全球开发者共同维护的“公共基础设施”。你想想看,一个飞控能同时被MIT、NASA、还有各种创业公司使用,这本身就说明问题。
社区数据(2024年)
- GitHub Stars:超过 8,000
- 贡献者:超过 1,200 人
- 支持的硬件板卡:超过 30 种
- 官方支持的机型:多旋翼、固定翼、VTOL、无人车、无人船
我记得2016年刚接触PX4时,文档还不太全,很多坑要自己踩。现在好多了,社区有论坛、Slack、Discord,遇到问题基本都能找到答案。嗯,这里要注意:提问前先搜一下,别做伸手党。
1.2 硬件架构:FMU 与 IO
PX4的硬件设计有个核心思想:分离。它把飞控拆成两个物理部分——FMU和IO。为什么这么干?我刚开始也觉得多此一举,直到有一次在项目中遇到舵机干扰导致主控重启……
1.2.1 FMU(Flight Management Unit)
FMU是大脑,负责跑核心算法:姿态估计、位置控制、导航、任务管理。它通常用一颗高性能MCU,比如STM32F7或STM32H7。所有传感器(IMU、磁力计、气压计)都挂在FMU的SPI/I2C总线上。
1.2.2 IO(Input/Output)
IO是“手脚”,负责输出PWM信号给电调、舵机,以及接收遥控器信号。它用一颗独立的MCU(通常是STM32F1),通过内部串口和FMU通信。这样做的好处是:即使FMU跑飞了,IO还能保持最后的PWM输出,不至于直接炸机。
避坑指南
我曾经在一个固定翼项目里,把舵机直接接在FMU的PWM口上,结果大电流干扰导致IMU数据跳变。后来老老实实加了IO板,问题解决。记住:大功率设备走IO,传感器走FMU。
| 组件 | 职责 | 典型MCU | 通信接口 |
|---|---|---|---|
| FMU | 姿态估计、控制、导航 | STM32F7/H7 | SPI, I2C, UART |
| IO | PWM输出、RC输入 | STM32F1 | 内部串口(FMU↔IO) |
1.3 软件栈:Firmware / Middleware / Estimator
PX4的软件架构是分层的。我习惯把它比作一个餐厅:Firmware是厨房设备,Middleware是传菜员,Estimator是品菜师。各司其职,才能做出好菜。
1.3.1 Firmware(固件层)
最底层,直接操作硬件。包括传感器驱动、PWM输出、UART通信等。这部分用C语言写,跑在RTOS(NuttX)上。你如果改过驱动,就知道这层最考验硬件功底。
1.3.2 Middleware(中间件)
中间层,负责模块间通信。PX4用的是uORB(micro Object Request Broker)——一个轻量级的发布/订阅消息总线。每个模块(比如传感器、GPS、遥控器)都往uORB上发消息,其他模块按需订阅。
// uORB 消息发布示例(伪代码)
struct sensor_accel_s accel_data;
accel_data.x = 0.01;
accel_data.y = 0.02;
accel_data.z = 9.81;
orb_advert_t pub = orb_advertise(ORB_ID(sensor_accel), &accel_data);
orb_publish(ORB_ID(sensor_accel), pub, &accel_data);
你想想看,如果没有uORB,每个模块都要自己写通信协议,那代码得多乱?
1.3.3 Estimator(估计器)
这是飞控的“大脑皮层”。它把传感器数据融合成状态估计——位置、速度、姿态。PX4默认用EKF2(扩展卡尔曼滤波器),支持多传感器融合:IMU+GPS+磁力计+气压计+光流+视觉。
重要提醒
EKF2的参数调不好,飞控就是“睁眼瞎”。我见过太多人上来就飞,结果EKF协方差发散,飞机直接翻跟头。建议:先跑仿真,看EKF的innovation曲线,确认收敛再上真机。
1.4 典型应用场景
PX4不是只能飞四轴。它的架构设计决定了它很灵活。我参与过的项目里,PX4被用在各种奇奇怪怪的平台上。
1.4.1 多旋翼
最常见。四轴、六轴、八轴,甚至同轴反转。PX4默认支持多种机架类型,你只需要在参数里改一下CA_AIRFRAME,再配好混控器就行。
1.4.2 固定翼
固定翼的控制逻辑和多旋翼完全不同。多旋翼靠改变螺旋桨转速,固定翼靠舵面。PX4的固定翼模块支持手动、增稳、自动航线。我记得第一次飞固定翼时,降落那段特别紧张——还好PX4的自动降落逻辑还算靠谱。
1.4.3 VTOL(垂直起降固定翼)
VTOL是PX4的强项。它支持三种模式:多旋翼模式、固定翼模式、过渡模式。过渡模式最难写——既要保证升力,又要逐渐转为前向推力。PX4的VTOL状态机写得不错,但参数调起来很费劲。
VTOL 过渡流程(简化版)
- 多旋翼模式:垂直起飞,高度5米
- 前向加速:逐渐倾转,速度达到10m/s
- 完全过渡:倾转到位,转为固定翼模式
- 降落:反向过渡,转为多旋翼模式,垂直降落
嗯,这里要注意:VTOL的过渡速度参数VT_FWD_THRUST_SC和VT_ARSP_TRANS一定要匹配。我曾经调反了,结果飞机在过渡时掉高度,差点炸。
1.5 生态全景图
下面这张图是我自己画的,把PX4的生态结构串起来。你看一眼,应该能有个整体印象。
1.6 小结
这一章我们走马观花看了PX4的全貌。从ETH的研究项目,到全球最大的开源飞控生态;从FMU+IO的硬件分离设计,到Firmware/Middleware/Estimator的三层软件架构;再到多旋翼、固定翼、VTOL的典型应用。我个人觉得,理解这些背景知识,比直接上手调参更重要——至少你知道自己在调什么。