在工业控制领域,我们常常遇到这样的困境:系统状态变量无法全部直接测量,就像驾驶一辆缺少仪表盘的汽车。传统滑模控制(SMC)虽然以鲁棒性强著称,但它高度依赖完整的系统状态信息。这就是高增益观测器(HGO)大显身手的地方——它能从可测输出中重构全部状态信息。
高增益观测器的核心思想是通过放大输出误差来快速修正状态估计。其设计参数k的选择至关重要:k值越大,观测器收敛速度越快,但对测量噪声也越敏感。在实际工程中,我们通常将k设为系统自然频率的3-5倍,这个经验值既能保证足够的响应速度,又不会过度放大噪声。
提示:首次调试时,建议先用开环方式单独测试观测器性能,确认状态估计误差收敛后再接入控制器。
考虑如下二阶非线性系统:
matlab复制function dx = plant(t,x,u)
dx = zeros(2,1);
dx(1) = x(2);
dx(2) = -3*x(2) + 2*u + 0.5*sin(t); % 含未知扰动项
end
这个系统具有几个典型特征:
观测器的设计需要满足分离原理,即观测器动态应比系统动态快得多。我们采用如下结构:
matlab复制function dx_obs = observer(t,x_obs,y,u)
k = 100; % 高增益参数
dx_obs = [x_obs(2) + k*(y - x_obs(1));
-3*x_obs(2) + 2*u + k^2*(y - x_obs(1))];
end
这里的精妙之处在于误差校正项的设计:
选择滑模面为:
code复制s = x_obs(2) + 2*x_obs(1)
这个设计的物理意义是使系统状态沿x_obs(2)=-2x_obs(1)的轨迹滑动。系数2的选择与被控对象的主导极点相关。
基本滑模控制律为:
matlab复制function u = SMC(x_obs)
s = x_obs(2) + 2*x_obs(1);
rho = 5; % 切换增益
u = 1.5*x_obs(2) - rho*sign(s);
end
其中:
传统sign函数会导致严重的抖振现象。我们采用饱和函数替代:
matlab复制sat = @(s,epsilon) min(max(s/epsilon, -1), 1);
u = 1.5*x_obs(2) - rho*sat(s,0.05);
参数epsilon定义了边界层厚度,需要在跟踪精度和抖振强度之间权衡。
在Simulink中,系统主要包含三个部分:
首先单独调试观测器:
然后调试控制器:
最后整体优化:
当系统存在测量噪声时,建议:
matlab复制dx_obs = [x_obs(2) + k1*(y - x_obs(1));
-3*x_obs(2) + 2*u + k2*(y - x_obs(1))];
其中k1和k2可以独立调节。
数字实现时需注意:
当控制输入受限时(u_min ≤ u ≤ u_max),需要:
matlab复制u_actual = min(max(u, u_min), u_max);
dx_obs = [x_obs(2) + k*(y - x_obs(1));
-3*x_obs(2) + 2*u_actual + k^2*(y - x_obs(1))];
设置期望值为1,比较不同控制策略:
加入0.5sin(2πt)扰动:
改变被控对象参数±20%:
对于MIMO系统,需要:
可以设计k和rho的自适应律:
matlab复制k = k0 + α*||e||
rho = ρ0 + β||s||
其中e是估计误差,s是滑模变量。
我在实际项目中多次应用这种控制策略,特别是在液压伺服系统和无人机姿态控制中。一个重要的经验是:在硬件实现前,务必在仿真中充分测试各种极端工况。曾经有一次因为没考虑执行器饱和特性,导致实际运行中出现振荡,这个教训让我至今记忆犹新。