3、自适应控制理论基础:MRAC与STC的基本原理
说到自适应控制,很多做电机控制的同行第一反应就是「这东西太理论了,用不上」。说实话,我早年也是这么想的。直到有一次做伺服驱动器项目,负载从空载突然跳到满载,传统PID怎么调都抖得厉害……那次折腾了我整整两周。
后来我静下心重新翻了一遍自适应控制理论,才发现——不是理论没用,是我没找对落地的角度。
今天咱们就聊聊自适应控制里最实用的两个流派:模型参考自适应控制(MRAC)和自校正控制(STC)。我会尽量少讲公式,多讲「这东西到底怎么用」。
核心观点:自适应控制不是要替代PID,而是在PID搞不定的场景下给它「装上大脑」。
3.1 模型参考自适应控制(MRAC)
MRAC的核心思想,说白了就是「找个榜样照着学」。
你想想看,我们做电机控制时,最理想的情况是什么?——不管负载怎么变,系统的响应曲线都跟一个「完美模型」一样。这个完美模型,就是MRAC里的「参考模型」。
我习惯把MRAC比作一个学写字的小孩:
- 参考模型 = 字帖(理想行为)
- 实际系统 = 小孩写的字(当前行为)
- 自适应机构 = 老师(纠正偏差)
小孩每次写完字,老师就对比字帖和实际写的字,然后告诉小孩「这一笔要再直一点」。对应到电机控制里,就是实时对比参考模型输出和实际系统输出,用误差信号去调整控制器参数。
实战经验:我在做机器人关节伺服驱动时,遇到过负载惯量变化超过10倍的情况。传统PID根本扛不住,但用MRAC后,只要参考模型选得合适,系统响应基本不变形。不过要注意——参考模型不能太「理想」,否则自适应机构会一直拼命追赶,反而容易震荡。
MRAC的典型结构:
参考模型: G_m(s) = ω_n² / (s² + 2ζω_n·s + ω_n²)
自适应律(以MIT规则为例):
dθ/dt = -γ · e · ∂y/∂θ
其中:
θ = 可调参数
e = 模型输出与实际输出的误差
γ = 自适应增益(我一般取0.1~1.0之间试)
∂y/∂θ = 灵敏度函数
注意:MIT规则虽然简单好用,但有个坑——它不能保证系统全局稳定。我曾经在一个项目中直接用MIT规则,结果负载突变时参数发散,电机直接啸叫了。后来改用了李雅普诺夫法设计的自适应律才稳住。
3.2 自校正控制(STC)
STC的思路跟MRAC完全不同——它不找榜样,而是「边测边算」。
你想想看,如果我们能实时知道电机的电阻、电感、转动惯量这些参数,那重新算一组PID参数不就完了?STC干的就是这个事。
STC的工作流程像一个人体检:
- 参数辨识(体检)——用递推最小二乘法(RLS)在线估计系统参数
- 控制器设计(开药方)——根据辨识结果重新计算控制器参数
- 控制器更新(吃药)——把新参数写进控制器
然后重复以上三步,周而复始。
关键区别:MRAC是「看别人学自己」,STC是「看自己算自己」。MRAC更适合响应速度要求高的场景(比如伺服),STC更适合参数变化缓慢但需要精确建模的场景(比如温度控制)。
递推最小二乘法(RLS)的简化形式:
θ̂(k) = θ̂(k-1) + K(k)·[y(k) - φᵀ(k)·θ̂(k-1)]
K(k) = P(k-1)·φ(k) / [λ + φᵀ(k)·P(k-1)·φ(k)]
P(k) = [I - K(k)·φᵀ(k)]·P(k-1) / λ
其中:
θ̂ = 估计参数向量
φ = 回归向量(包含历史输入输出)
λ = 遗忘因子(0.95~0.99,我常用0.98)
P = 协方差矩阵
我的习惯:遗忘因子λ的选取很关键。λ=1表示不遗忘旧数据,适合时不变系统;λ越小,算法跟踪越快,但噪声敏感度也越高。我一般从0.98开始试,如果参数变化快就降到0.95,但低于0.9就容易出问题——曾经吃过这个亏。
3.3 MRAC vs STC:怎么选?
很多初学者会纠结这个问题。我的建议很简单——看你的系统「能不能建模」。
| 对比维度 | MRAC | STC |
|---|---|---|
| 是否需要精确模型 | 只需要参考模型(可简化) | 需要在线辨识系统模型 |
| 计算复杂度 | 较低(适合嵌入式实时系统) | 较高(矩阵运算多) |
| 收敛速度 | 快(直接调参数) | 中等(需要辨识收敛) |
| 抗噪声能力 | 一般(对测量噪声敏感) | 较好(RLS自带滤波特性) |
| 典型应用 | 伺服位置控制、无人机 | 温度控制、化工过程 |
避坑指南:我曾经在一个项目中试图用STC做高速伺服控制,结果RLS的矩阵运算在5kHz的控制周期里根本跑不完。后来换成了MRAC,计算量小了一个数量级,效果反而更好。所以——别盲目追求「高级」,先看看你的MCU扛不扛得住。
3.4 两种方法的融合思路
在实际工程中,我见过不少团队把MRAC和STC结合起来用。比如:
- 用STC做离线预辨识,得到系统的初始参数
- 运行时切换到MRAC,应对快速负载变化
- 每隔一段时间再跑一次STC,更新参考模型
这种「混合自适应」的思路,说白了就是取长补短。我在一个印刷机张力控制项目里用过这个方案,效果比单独用任何一种都好。
一句话总结:MRAC适合「快变但可参考」的场景,STC适合「慢变但需精确」的场景。选哪个,取决于你的电机、负载和MCU算力。
嗯,自适应控制的理论基础就聊到这儿。下一节我们会深入MRAC的具体实现——包括怎么选参考模型、怎么设计自适应律,以及我在STM32上跑MRAC的完整代码。到时候咱们再细聊。