












本讲知识点
前面的课程中,我们已经完成了 PID Controller(PID控制器)内部各控制项的建立:
Rate Error(角速度误差)
↓
P Term(比例控制项)
↓
I Term(积分控制项)
↓
D Term(微分控制项)
↓
Feedforward(前馈控制)
其中:
P Term:解决现在差多少。
I Term:解决过去累计差多少。
D Term:解决变化趋势有多快。
Feedforward:提前响应未来输入变化。
但是,到目前为止,我们更多是在分别理解每一个控制项。
本讲我们暂时离开源码细节,站在整个PID控制器的角度,重新回答一个最核心的问题:
PID 到底是什么?
之前的课程中,我们已经逐步建立了:
飞手输入
↓
目标姿态
↓
目标角速度
↓
当前角速度
↓
Rate Error(角速度误差)
↓
PID Controller(PID控制器)
↓
电机控制量
同时,我们也已经知道,PID Controller(PID控制器)真正接收的,
不是目标值,也不是当前值,
而是目标值与当前值之间的差距,也就是Error(误差)。
本讲将在这个基础上,把 P、I、D 和 Feedforward 重新组合起来,形成完整的 PID 控制思想。
为了理解 PID,我们先暂时离开飞机。
假设,我们正在驾驶汽车。
道路限速:
目标速度:100 km/h
但是现在汽车速度:
当前速度:70 km/h
两者之间存在:
速度误差:30 km/h
也就是说汽车还差 30 km/h。
现在问题来了,如果让你控制油门,你应该怎么做?
直觉上,差得越多,踩油门越大。
例如:
速度:70 km/h
目标:100 km/h
差距:30 km/h
于是,大力踩油门。
如果:
速度:95 km/h
目标:100 km/h
差距:5 km/h
那么,轻踩油门。
这个思想就是:
P Term(比例控制项)。
P Term 的核心思想非常简单:当前误差越大,控制输出越大。
数学关系:
P Output = Kp × Error
其中:
Error:当前误差。
Kp:比例强度。
放回汽车,如果,误差:30 km/h,那么,输出:较大的油门。
如果,误差:5 km/h,那么,输出:较小的油门。
因此,P Term 解决的是:现在差多少。
继续驾驶,目标:100 km/h
汽车:98 km/h
误差:2 km/h
此时 P Term 认为:误差很小,所以油门很小。
但是现实中,汽车存在:
于是,虽然一直给一点油,汽车可能只能保持:98 km/h
永远达不到:100 km/h
这就是:稳态误差。
那么怎么办?
既然现在误差很小,但是过去一直存在误差。
那么控制器应该记住过去发生了什么。
例如,过去一分钟:速度一直比目标低2 km/h
虽然当前只差:2 km/h,但是,过去累计起来,说明发动机输出不足。
于是,控制器逐渐增加补偿。
这就是:
I Term(积分控制项)。
它关注:误差累计了多久,累计了多少。
因此,I Term 解决:
过去累计差多少。
现在,汽车终于达到:100 km/h
但是,由于 I Term 已经积累了一部分补偿。
此时,车辆可能继续加速:
100 -> 105 -> 110
出现过冲。
也就是:已经接近目标,但是仍然继续增加。
为什么?
因为,系统存在惯性,飞机也是一样。
如果控制器不仅知道“现在差多少”,还知道“速度正在变化多快”,
那么,它就能提前判断:是否马上超过目标。
例如,当前:98 km/h, 目标:100 km/h
表面看,只差 2 km/h。
但是,如果速度变化趋势是:每秒增加 10 km/h
那么控制器知道:马上会超过目标。
因此,提前减少输出。
这就是:
D Term(微分控制项)。
它关注:变化趋势。
因此,D Term 解决:变化正在发生多快。
现在重新看汽车控制:目标 100 km/h
观察现在差多少?负责:快速靠近目标。
观察过去是否长期存在误差?负责:消除长期偏差。
观察:变化趋势是否会导致过冲?负责:提前抑制变化。
三者组合:
P:拉近目标。
I:消除剩余误差。
D:避免过冲。
这就是:PID Controller(PID控制器)。
汽车控制的是:速度。
而飞控控制的是:角速度。
例如:
飞手打杆后,飞控得到:
Desired Angular Rate(目标角速度)= 300°/s
陀螺仪测量:
Current Angular Rate(当前角速度)= 250°/s
于是:
Rate Error = 300 - 250 = 50°/s
PID Controller(PID控制器)看到:飞机还少旋转 50°/s。
然后:P、I、D 分别开始工作。
在 Betaflight 中:
PID Controller(PID控制器)最终不是直接控制电机转速。
它计算:
P + I + D + Feedforward
得到 PID Sum。
也就是控制输出。
对应源码逻辑:
const float pidSum = pidData[axis].P
+ pidData[axis].I
+ pidData[axis].D
+ pidData[axis].F;
这一步表示:四个控制思想最终合成为一个控制结果。
假设:飞机需要:
目标角速度:300°/s
当前:
250°/s
因此:
Rate Error:50°/s
P Term,
假设 Kp = 0.8,那么:
P = 0.8 × 50 = 40
表示:当前误差需要立即产生 40 的控制力度。
I Term:
假设过去飞机长期少转:5°/s
经过累计,得到:I = 10。
表示:过去误差需要补偿。
D Term:
如果当前角速度快速增加,控制器发现马上接近目标。
于是:D = -8。
提前减少输出。
Feedforward:
如果飞手刚刚快速打杆,控制器知道:
这是人为希望快速变化。
提前增加:F = 15。
最终:
PID Output = 40 + 10 - 8 + 15 = 57
这个就是飞控接下来用于控制飞机的输出。
现在完整控制链已经建立:
RC Stick
↓
Target Angle
↓
Current Angle
↓
Angle Error
↓
Desired Angular Rate
↓
Current Angular Rate
↓
Rate Error
↓
PID Controller
↓
P + I + D + Feedforward
↓
PID Output
↓
Mixer
↓
Motor Output
到这里,PID Controller(PID控制器)在整个飞控中的职责已经完整建立。
它并不是一个神秘公式。
而是一套:
不断观察误差,根据误差状态,决定控制力度的反馈系统。
本讲对 PID Controller(PID控制器)进行了系统总结。
我们通过汽车速度控制的例子,重新理解了 PID 的核心思想:
P Term(比例控制项)解决当前差多少。
I Term(积分控制项)解决过去累计差多少。
D Term(微分控制项)解决变化趋势有多快。
同时,结合 Betaflight 的控制链,我们明确了:
飞控中的 PID 并不是直接控制飞机姿态,而是控制:
Rate Error(角速度误差)
并通过:
P + I + D + Feedforward
生成最终控制输出。
至此,PID Controller(PID控制器)作为 Inner Loop(内环)的核心控制模块,已经完成系统性建立。
现在,PID Controller(PID控制器)已经完成:
误差 -> 控制输出
的转换。
但是, PID Output(PID输出)仍然不能直接驱动电机。
因为, 飞机还需要解决:
一个控制输出,如何转换成四个电机不同的推力?
下一讲,我们将进入:
Mixer(混控器)
理解飞控如何把:
Roll / Pitch / Yaw 控制量
↓
转换为:四个电机的输出差异。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。