飞控系统架构: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)。

我当年在学校学卡尔曼滤波,老师讲了一堆矩阵推导,听得我云里雾里。后来做项目才明白,核心就两步:

  1. 预测:根据上一时刻的状态,猜这一时刻的状态。
  2. 更新:用传感器测量值,修正猜测。

就这么简单。你想想看,你闭着眼睛往前走(预测),然后睁眼看一下路标(更新),是不是就能知道自己大概在哪了?

ArduPilot用的是EKF3,PX4用的是EKF2。两者原理一样,实现细节不同。我个人的经验是:

  • EKF3的调参更灵活,适合折腾
  • EKF2的默认参数更稳,适合新手

避坑指南:我曾经在VTOL上遇到过EKF发散的问题。查到最后,发现是GPS的HDOP值突然变大,EKF以为GPS不准了,就把权重降得很低,结果全靠IMU积分,位置越飘越远。解决方案是给GPS的置信度加一个上限,别让它完全放弃GPS。

5. 知识体系总览

下面这张图,是我自己画的飞控架构总览。你把它存下来,以后学任何章节,都可以回来看看这张图,就知道当前知识点在哪个位置。

VTOL飞控系统架构总览 硬件层 主控MCU IMU传感器 GPS/气压计 PWM/CAN接口 STM32F4/F7/H7 ICM-20602/BMI088 MS5611/BMP388 8路/16路输出 中间件层 uORB消息总线 参数系统 日志系统 发布-订阅模式 动态参数调优 SD卡/黑匣子 应用层 状态估计 EKF2/EKF3融合 导航与控制 PID/INDI控制 VTOL切换逻辑 多旋翼↔固定翼

这张图里,硬件层是地基,中间件层是管道,应用层是大脑。VTOL切换逻辑就在应用层的最右边,它依赖状态估计的结果,也依赖控制器的输出。

好了,这一章的内容就到这里。记住一句话:飞控不是玄学,是工程。把架构搞清楚了,后面学什么都快。

本章核心要点:

  • Pixhawk采用模块化设计,主控、传感器、接口、电源四层分离
  • ArduPilot的HAL层让硬件移植变得简单
  • PX4的uORB消息总线是模块间通信的核心
  • EKF的本质就是“预测+更新”两步走
  • 传感器融合的目的是取长补短,不是单打独斗

专注资料整理