一、自校正控制(STC)——让控制器自己“校准”自己
各位好,我是老张。今天咱们聊聊自校正控制。说实话,我第一次接触这个概念时,心里想的是:“这不就是自适应控制换了个马甲吗?”后来真正做项目才发现,两者还真不一样。
自校正控制,英文叫 Self-Tuning Control,简称 STC。它的核心思想很简单:控制器自己在线调整参数,让系统性能一直保持最优。你想想看,传统 PID 调好了参数,系统一变就拉胯。STC 呢?它边运行边学习,边学习边调整。
我个人习惯把 STC 比作“带修正功能的自动驾驶”。你设定好目标,它自己判断路况,自己修正方向盘。嗯,这个比喻虽然不严谨,但初学者好理解。
核心要点:STC 的两个关键步骤——在线辨识(估计系统模型) + 控制器设计(基于模型计算新参数)。两者循环往复,形成闭环。
1.1 自校正控制的基本原理
STC 的框架其实不复杂。我画了一张图,你看完就明白了。
看到没?虚线部分就是自校正的灵魂。系统输出 y(t) 送回到辨识模块,辨识模块算出当前模型参数,然后控制器设计模块根据模型重新计算控制器参数,再更新到控制器里。循环往复,永不停歇。
我的经验:做 STC 项目时,千万别把辨识和控制器设计割裂开。我曾经犯过这个错——辨识模块跑得飞快,控制器设计却跟不上,结果系统震荡得一塌糊涂。后来我强制让两者同步更新,问题就解决了。
1.2 最小方差自校正控制
最小方差自校正控制,英文 Minimum Variance Self-Tuning Control,简称 MVSTC。说白了,它的目标就是让系统输出的方差最小。
为什么要最小化方差?你想想看,在造纸、轧钢这些工业过程中,产品厚度波动越小,质量越稳定。我当年做造纸机厚度控制时,甲方要求厚度偏差不超过 ±0.1mm。用传统 PID 死活做不到,换了 MVSTC 后,偏差直接降到 ±0.03mm。嗯,那次项目验收我印象特别深。
MVSTC 的核心公式长这样:
控制器输出 u(t) = - (B(q⁻¹) / A(q⁻¹)) * y(t)
其中:
- A(q⁻¹) 和 B(q⁻¹) 是系统多项式
- q⁻¹ 是后移算子
- 控制目标是使 J = E[y²(t+d)] 最小
这里 d 是系统时延。我提醒一句:时延估计不准,MVSTC 会直接崩掉。我曾经在项目里遇到过,时延估少了 1 个采样周期,控制器输出直接发散。后来我加了个时延在线估计模块,才算稳住。
避坑指南:MVSTC 对非最小相位系统(即零点在单位圆外的系统)非常敏感。如果你发现控制器输出忽大忽小,先检查系统是不是非最小相位的。如果是,别用 MVSTC,换广义最小方差。
1.3 广义最小方差自校正控制
广义最小方差自校正控制,Generalized Minimum Variance Self-Tuning Control,简称 GMVSTC。它是对 MVSTC 的改进,解决了两个痛点:
- 控制量过大——MVSTC 为了压方差,有时会让控制器输出剧烈波动
- 非最小相位系统不稳定——MVSTC 遇到这种系统直接歇菜
GMVSTC 的改进思路很直接:在目标函数里加入控制量的惩罚项。公式变成:
J = E[y²(t+d) + λ * u²(t)]
其中 λ 是控制量权重系数
λ 越大,控制量越平缓,但跟踪性能会下降
你看,多了一个 λ 参数。λ 怎么选?我个人习惯先设 λ=0.1,然后看控制量波动情况。如果波动太大,逐步增大 λ,直到控制量在可接受范围内。如果跟踪太慢,减小 λ。
| 参数 | MVSTC | GMVSTC |
|---|---|---|
| 目标函数 | J = E[y²(t+d)] | J = E[y²(t+d) + λu²(t)] |
| 控制量约束 | 无 | 有(通过 λ 调节) |
| 非最小相位系统 | 不稳定 | 稳定(λ 足够大时) |
| 适用场景 | 时延已知、最小相位系统 | 时延未知、非最小相位系统 |
我再说个实际案例。有一次做化工反应釜温度控制,系统是非最小相位的——温度先反向再正向,典型的“右半平面零点”问题。用 MVSTC 试了三次,三次都发散。换成 GMVSTC,λ 调到 0.5,系统稳得像老狗。嗯,那次之后我就成了 GMVSTC 的铁粉。
总结一下:
- MVSTC 适合“干净”的系统——时延准、最小相位、控制量不限
- GMVSTC 适合“脏”的系统——时延不准、非最小相位、控制量有限
- 实际项目中,我建议优先用 GMVSTC,λ 从 0.1 开始试
1.4 实现要点与注意事项
最后聊几个实现时的坑。我踩过的,你们别踩了。
- 辨识算法别用太复杂的——递推最小二乘(RLS)就够用,别上来就上卡尔曼滤波。我见过有人用粒子滤波做在线辨识,结果计算量太大,控制器周期跟不上。
- 别忘了加遗忘因子——RLS 的遗忘因子 λ_forget 一般取 0.95~0.99。太小了参数跳得厉害,太大了跟不上变化。我习惯取 0.97。
- 初始化要保守——刚开始辨识时,参数协方差矩阵 P 设大一点(比如 1000I),让算法快速收敛。但别太大,否则初期参数会乱跳。
- 加个参数限幅——辨识出来的参数如果超出物理范围,直接截断。我曾经没加限幅,结果辨识出个“负阻尼”参数,控制器直接震荡到保护停机。
我的小技巧:在 STC 上线前,先用离线数据跑一遍辨识和控制器设计。确认参数收敛、控制量合理,再切到在线模式。这个“半离线”测试能帮你省掉至少一半的调试时间。
好了,自校正控制的核心内容就这些。下一章咱们聊模型参考自适应控制(MRAC),那个又是另一套玩法了。
公众号:蓝海资料掘金营,微信deep3321