飞控系统架构:Pixhawk/ArduPilot硬件架构、PX4软件栈概览、传感器融合与状态估计基础
大家好,我是老张。今天咱们聊聊飞控系统的骨架——架构。
做VTOL这么多年,我见过太多人一上来就调参数、改代码,结果炸机了都不知道问题出在哪。说白了,你不懂硬件怎么连的、软件怎么跑的、传感器数据怎么融合的,那跟闭着眼睛开飞机没区别。
这一章,我带你把飞控的底裤看穿。
1. Pixhawk硬件架构:为什么它成了事实标准?
先说说硬件。Pixhawk这个板子,我2014年第一次拿到手的时候,就觉得这玩意儿要火。为什么?因为它把“模块化”做到了极致。
核心思想:主控芯片只负责算,传感器、接口、电源全部独立成模块。坏了哪块换哪块,不用整板报废。
咱们看Pixhawk的硬件分层:
- 主控层:STM32F4/F7/H7系列,ARM Cortex-M4/M7内核。我个人习惯用F427,性价比高,跑ArduPilot稳如老狗。
- 传感器层:IMU(惯性测量单元)通常用两套——一套ICM-20602(主),一套MPU-9250(备份)。气压计用MS5611,磁力计用HMC5883L或IST8310。
- 接口层:UART、I2C、SPI、CAN、PWM……你能想到的通信协议它都有。我做过一个项目,接了8个外设,全靠这些口子撑起来。
- 电源层:双电源冗余设计。主电源挂了,备份电源自动顶上。嗯,这个设计救过我一架飞机。
这里有个坑,我得提醒你:
避坑指南:我曾经在项目里用了第三方的Pixhawk克隆板,结果IMU的SPI时钟线没做等长处理,导致传感器数据偶尔跳变。查了三天,最后用示波器才抓到问题。所以,买板子尽量选原厂或大厂复刻版,别省那几百块钱。
2. ArduPilot硬件架构:从Pixhawk到自定义板
ArduPilot的硬件架构,说白了就是Pixhawk的超集。它支持Pixhawk全系列,但也允许你自己画板子。
我见过最骚的操作,是有人用树莓派当主控,外挂一个Pixhawk当协处理器。树莓派跑视觉算法,Pixhawk飞控。你想想看,这算力直接拉满。
ArduPilot的硬件抽象层(HAL)做得很好。你只要按照它的接口规范写驱动,任何MCU都能跑。我去年帮一个客户移植到GD32上,前后只改了两个文件。
| 硬件层级 | 典型芯片/模块 | 我的评价 |
|---|---|---|
| 主控MCU | STM32F427 / STM32H743 | F427够用,H743性能过剩但真香 |
| 主IMU | ICM-20602 / BMI088 | BMI088抗振性更好,我推荐 |
| 备份IMU | MPU-9250 / ICM-20948 | 9250老当益壮,20948新秀 |
| 气压计 | MS5611 / BMP388 | MS5611精度高,BMP388省电 |
| 磁力计 | HMC5883L / IST8310 | IST8310抗干扰强,我常用 |
3. PX4软件栈概览:从uORB到飞行栈
PX4的软件架构,我刚开始看的时候也懵。模块太多了!但后来我总结了一句话:一切皆模块,模块间靠uORB通信。
uORB是什么?说白了就是一个发布-订阅的消息总线。传感器模块发布数据,飞控模块订阅数据。谁想加新功能,写个新模块,订阅需要的消息就行。
举个例子:
// 传感器模块发布IMU数据
orb_publish(ORB_ID(sensor_accel), &accel_data);
// 姿态估计模块订阅IMU数据
int sub_fd = orb_subscribe(ORB_ID(sensor_accel));
orb_copy(ORB_ID(sensor_accel), sub_fd, &accel_data);
你看,代码就这么简单。我当年第一次看到这个设计,就觉得——嗯,这才是工程化的思路。
PX4的飞行栈分三层:
- 底层驱动层:负责跟硬件打交道。SPI、I2C、UART的读写都在这里。
- 中间件层:uORB消息总线、参数系统、日志系统。这是PX4的骨架。
- 应用层:姿态估计、位置估计、导航、控制。这才是飞控的灵魂。
个人经验:我建议初学者先从应用层入手,别一上来就啃驱动。你先把姿态怎么算、控制怎么调搞明白,再去看底层代码,会轻松很多。
4. 传感器融合与状态估计基础:卡尔曼滤波没那么神秘
传感器融合,说白了就是“取长补短”。
IMU的加速度计低频准、高频飘;陀螺仪高频准、低频飘。GPS绝对位置准但更新慢。磁力计能指北但容易受干扰。怎么办?把它们的数据揉在一起,各取所长。
最常用的方法就是扩展卡尔曼滤波(EKF)。
我当年在学校学卡尔曼滤波,老师讲了一堆矩阵推导,听得我云里雾里。后来做项目才明白,核心就两步:
- 预测:根据上一时刻的状态,猜这一时刻的状态。
- 更新:用传感器测量值,修正猜测。
就这么简单。你想想看,你闭着眼睛往前走(预测),然后睁眼看一下路标(更新),是不是就能知道自己大概在哪了?
ArduPilot用的是EKF3,PX4用的是EKF2。两者原理一样,实现细节不同。我个人的经验是:
- EKF3的调参更灵活,适合折腾
- EKF2的默认参数更稳,适合新手
避坑指南:我曾经在VTOL上遇到过EKF发散的问题。查到最后,发现是GPS的HDOP值突然变大,EKF以为GPS不准了,就把权重降得很低,结果全靠IMU积分,位置越飘越远。解决方案是给GPS的置信度加一个上限,别让它完全放弃GPS。
5. 知识体系总览
下面这张图,是我自己画的飞控架构总览。你把它存下来,以后学任何章节,都可以回来看看这张图,就知道当前知识点在哪个位置。
这张图里,硬件层是地基,中间件层是管道,应用层是大脑。VTOL切换逻辑就在应用层的最右边,它依赖状态估计的结果,也依赖控制器的输出。
好了,这一章的内容就到这里。记住一句话:飞控不是玄学,是工程。把架构搞清楚了,后面学什么都快。
本章核心要点:
- Pixhawk采用模块化设计,主控、传感器、接口、电源四层分离
- ArduPilot的HAL层让硬件移植变得简单
- PX4的uORB消息总线是模块间通信的核心
- EKF的本质就是“预测+更新”两步走
- 传感器融合的目的是取长补短,不是单打独斗