目录
前言
对于一个系统来说,干扰常常是未知的,这时候就需要我们将外部干扰以及模型参数变化造成的实际对象与名义模型(标称系统)之间的差异等效到控制输入端,即观测出等效干扰,并在控制中引入等效的补偿,实现对干扰的完全控制,这便是干扰观测器所需要干的活。
为什么需要名义模型呢?
名义模型指的是设计控制器或分析系统时所用的模型,因为实际中真实的模型难以获得,需通过系统辨识等方法得到被控对象的参数化模型,而这些模型严格意义上来说只是真实模型的一种近似,因此称作名义模型。
干扰观测器的原理框图如下(这里引用博主的一张图,并下面给出引用链接):
图1 干扰观测器的原理框图
干扰观测器的闭环控制原理框图如下(这里引用博主的一张图,并下面给出引用链接):
图2 干扰观测器的闭环控制原理框图
可见,闭环控制系统系统有三个输入:给定的输入R(s),干扰Td(s) 以及测量噪声 N(s)。其中Q(s)对系统很重要,它的设计需要在干扰观测器的干扰抑制能力和鲁棒稳定性之间进行适当的折中。
怎么理解这三个输入还没搞懂,恳请指导!
1.案例分析系统
这里假设模型可以精确获取,即无需名义模型;假设没有滤波器,即Q(s) = 1,无测量噪声,只有扰动d。二阶系统:
θ'' = -b*θ'+a*u-d
其中a和b已知,d为慢时变扰动(即随时间的变化扰动变化缓慢)。
2.设计观测器
2.1观测器系统
其中, 为对d的估计, 为对θ'的估计,k1 > 0,k2 > 0。
2.2稳定分析
取Lyapunov函数:
其中, ,由于d为慢时变干扰,所以d'很小,当k1取较大值时,可以证明观测器系统是稳定的,可以对扰动d进行有效的观测,从而实现补偿,即得到等效扰动;至于k2 > 0即可。
3.控制器设计
”三部曲“
3.1滑模面
s = C*e
其中,C = [c 1],c > 0;e = [e e'],e = θd - θ。
3.2 趋近律
选取等速趋近律:s' = -η*sign(s),滑膜导函数:s' = c*e'+e'' = c*e' + (θd'' - θ'') = c*e'+ θd''-(-b*θ'+a*u-d)
①令s' = 0,得到滑膜控制等效项:ueq = (c*e'+ θd'' + b*θ' + d) / a,由于d是观测出来的扰动(等效扰动),所以d要改成d^,即ueq = (c*e'+ θd'' + b*θ' + d^) / a
②滑膜控制鲁棒项:usw = η*sign(s) / a
③滑膜控制律:u = ueq + usw
3.3 稳定性分析
取V = 1/2*s^2 > 0,需证明 V = s*s' <0,这里不进行分析,有兴趣的读者可以参考前面的博客。
4.MATLAB/Simulink仿真
取a = 5,b = 0.15,d = 100*sin(0.5*t),指令信号θd = sin(t)。
注:代码都是我自己按照书上公式推理编写,和书上不一样,模型也是,我把所有的模型代码公开在博客上而没有分享文件,是为了让大家可以自己动手搭建,这样才能学习进步!一起加油!
4.1s函数编写被控对象
function [sys,x0,str,ts,simStateCompliance] = Plant(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [0 0]';
str = [];
ts = [0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
a = 5;b = 0.15;%系统参数
theta = x(1);
dtheta = x(2);
U = u(2);
d = u(1);
ddtheta = -b*dtheta+a*U-d;
sys = [dtheta;ddtheta];
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
sys = x;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
4.2Simulink模型
图3 基于慢时变干扰观测器的鲁棒滑模控制Simulink模型
4.3结果分析
这里我重新对了了饱和函数、符号函数、双曲正切光滑函数三种切换函数下的控制输出,由于除控制输出外,追踪效果均一致,所以下面的追踪效果以双曲正切函数为例展开,但是其中的参数调节需要读者自己折中调节,文末我会给出调参经验。
图4 角度θ
图5 角速度θ'
图6 误差e
图7 误差变化率de
图8 d和(d^)实际扰动和估计扰动
图9 扰动d观测误差
图10 θ'和(θ^)'输出角速度和观测角速度
图11 双曲正切函数下的控制输入u
图12 符号函数下的控制输入u
图13 饱和函数下的控制输入u
图14 相轨迹
结论:这里分析一下切换函数、观测器、和相轨迹。对于切换函数,可以看到饱和函数和双曲正切函数对控制输出的消抖效果很好,但是其饱和函数边界层参数Δ和双曲正切函数参数ε,需要在消抖效果和跟踪效果间折中;对于观测器从扰动观测误差来看,该观测器的误差还可以接受,后面也会学习其他的观测器进行比较;从相轨迹可以看到,误差最终稳定在原点(0,0)附近。
4.4调参
①对于观测器的k1和k2,尽量要使k1大,k2小些这样观测出来的扰动误差较小。
②对于控制器中的滑模面系数c、趋近律调节参数等需要折中调节。
学习问题:
发现用scope--logging--Array导出来e和de数据画图时,它的图标只能显示一种颜色,所以后面又添了to workspace模块导出e和de画相轨迹曲线。
如果有帮助,麻烦帮忙点个赞是我最大的分享动力,非常感谢!
注:仅为便利自己学习,错误在所难免,如有侵权,请联系删除,有兴趣的学者可以参考学习交流,谢谢!