飞控系统架构:从传感器到执行器的完整链路

做飞控调参这么多年,我见过太多人一上来就调PID,结果飞机抖得像筛子。其实啊,你得先搞清楚信号是怎么从传感器跑到电机里的。今天我就带你走一遍这条完整的链路。

信号流的起点:IMU传感器

IMU,说白了就是惯性测量单元。它里面装着三轴加速度计和三轴陀螺仪。加速度计感受重力,陀螺仪感受角速度。这两个东西配合起来,才能知道飞机当前是什么姿态。

我记得刚入行那会儿,总觉得IMU数据是完美的。后来在项目里摔过几次机才明白——传感器数据天生就有噪声和漂移。加速度计高频噪声大,陀螺仪低频漂移严重。所以必须做数据融合。

核心要点:IMU原始数据不能直接用,必须经过滤波和融合才能得到可靠的姿态信息。

姿态解算:从原始数据到欧拉角

姿态解算这块,主流方案就两种:互补滤波和卡尔曼滤波。我个人习惯用互补滤波,简单、轻量、够用。卡尔曼滤波精度更高,但计算量大,对嵌入式MCU不太友好。

互补滤波的原理其实很直观:

  • 陀螺仪积分得到短期姿态,但会漂移
  • 加速度计给出长期参考,但噪声大
  • 两者互补,各取所长

嗯,这里要注意一个坑。我曾经在调试时发现,加速度计在剧烈运动时输出的重力方向是错的。为什么?因为加速度计测的是「比力」,不是纯重力。飞机在加速转弯时,加速度计感受到的是重力和运动加速度的合力。这时候如果还拿它做参考,姿态就歪了。

避坑指南:我曾经在高速前飞时姿态解算发散,查了两天才发现是加速度计被运动加速度污染了。解决办法是加一个动态信任度判断——运动剧烈时降低加速度计的权重。

控制链路:从期望到输出

姿态解算出来的是当前姿态,控制器的任务就是让当前姿态追上期望姿态。四旋翼的控制链路是典型的串级PID结构:

层级 输入 输出 作用
外环(角度环) 期望角度 vs 当前角度 期望角速度 消除角度误差
内环(角速度环) 期望角速度 vs 当前角速度 期望力矩 消除角速度误差
混控器 期望力矩 + 期望推力 四个电机的PWM值 分配动力

你想想看,为什么用串级而不是单级?因为角速度环响应快,角度环响应慢。内环先把角速度稳住,外环再慢慢调角度。这样飞机才不会过冲。

个人经验:我调参时永远先调内环,再调外环。内环调好了,外环随便给个P值都能飞。内环没调好,外环怎么调都是抖。

混控器:数学到物理的桥梁

混控器这块,说白了就是个矩阵运算。四旋翼有四个电机,你要控制三个轴(横滚、俯仰、偏航)加一个总推力。四个输出控制四个自由度,刚好。

标准的混控矩阵长这样:

// 以X型四旋翼为例
Motor[0] = Throttle + Roll_PID + Pitch_PID - Yaw_PID
Motor[1] = Throttle - Roll_PID + Pitch_PID + Yaw_PID
Motor[2] = Throttle + Roll_PID - Pitch_PID + Yaw_PID
Motor[3] = Throttle - Roll_PID - Pitch_PID - Yaw_PID

这里要注意正负号。我曾经在项目里把Yaw的符号搞反了,结果飞机一解锁就在地上转圈。嗯,这种低级错误犯过一次就不会再犯了。

执行器:从PWM到螺旋桨拉力

最后一步是电机和螺旋桨。PWM信号送到电调,电调驱动电机旋转,电机带动螺旋桨产生拉力。这里有个容易被忽略的点——电机的响应延迟。

我测过不少电调,从收到PWM到电机达到目标转速,大概有20-50ms的延迟。这个延迟在调参时必须考虑进去。如果PID频率太高,电机根本跟不上,反而会引入震荡。

经验数据:大多数四旋翼的角速度环频率在200-400Hz,角度环频率在100-200Hz。电机响应延迟决定了你的控制频率上限。

完整信号流总览

说了这么多,我们来画一张完整的信号流图。这张图我每次带新人都会画一遍,因为它把整个飞控系统串起来了。

飞控系统完整信号流 IMU传感器 加速度计 + 陀螺仪 姿态解算 互补滤波 / 卡尔曼 串级PID控制器 角度环 + 角速度环 混控器 力矩→电机分配 执行器 电调 + 电机 + 桨 状态反馈 当前角度 / 角速度 遥控器输入 期望姿态 / 油门 信号流说明: 1. 遥控器给出期望姿态(横滚/俯仰/偏航角度 + 油门) 2. IMU采集原始加速度和角速度数据 3. 姿态解算模块融合数据,输出当前欧拉角和角速度 4. 串级PID计算期望力矩(外环角度→内环角速度→力矩) 5. 混控器将力矩分配到四个电机,输出PWM 6. 电机响应PWM,螺旋桨产生拉力,飞机姿态改变 7. 新的姿态被IMU感知,形成闭环反馈

闭环:为什么飞控必须实时

你看这张图,从传感器到执行器再回到传感器,这是一个完整的闭环。飞控的实时性就体现在这里——每个控制周期都要完成一次完整的信号流。

我见过有人把姿态解算放在100Hz,控制放在400Hz。结果就是控制周期里姿态数据是旧的,相当于用上上帧的数据控制当前帧。飞机能不抖吗?

避坑指南:我曾经在一个项目里为了省CPU资源,把姿态解算降到50Hz。结果飞机低频晃动,怎么调PID都没用。后来把解算频率提到200Hz,问题立刻消失。记住:解算频率不能低于控制频率。

好了,这一章我们把飞控系统的完整链路走了一遍。从IMU怎么采集数据,到姿态解算怎么算角度,再到PID怎么算控制量,最后混控器怎么分配电机。你心里应该有个清晰的信号流地图了。