目录
5.基于线性化反馈控制的滑模控制MATLAB/Simulink仿真
前言
反馈线性化原理:反馈线性化是将状态方程线性化,而且输出方程也线性化。通过状态的非线性变换和非线性状态反馈将原非线性系统变换成状态方程及输出方程均为线性的可控可观系统,建立输出y(t)与输入u(t)之间的线性微分关系,然后就可以利用线性控制方法来构造控制器。
具体的推导可见下篇博主的链接:
缺点:线性化反馈需要精确的模型参数,而且无法克服外界扰动,所以需要引入具有鲁棒性特点的滑膜控制,之后基于线性化反馈的滑膜控制便可以用于参数不定及抵抗外界扰动。
1.线性化反馈控制
以一般的非线性二阶系统为例,如下:
其中,f和g为已知的非线性函数。
定义误差项e = xd-x,其中xd为理想信号/位置指令。根据线性化反馈的理论,设计控制律为:
其中,v为控制器的辅助项。
将设计的控制律u代入该二阶系统,得:
设计辅助控制输入项v
其中,k1和k2为使 多项式为Hurwitz多项式的数。
将设计的辅助项v代入x'' = v中,得:
显然,当t趋于0时,e'趋于0,e''也趋于0。
2.倒立摆系统
其中,x1和x2为倒立摆系统的角度和角速度,取小车质量mc = 1kg,摆杆质量m = 0.1kg,摆杆长度l = 0.5m。
3.线性化反馈控制MATLAB/Simulink仿真
不考虑外部扰动,取理想信号θd(t) = sint(t),即跟踪该正弦曲线;选取被控对象状态变量为[θ θ’],初始状态为[pi/60,0]。
3.1利用S函数编写被控对象
程序如下:
function [sys,x0,str,ts]=Plant_2_4(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case {2, 4, 9 }
sys = [];
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[pi/60 0];%倒立摆初始状态
str=[];
ts=[];
function sys=mdlDerivatives(t,x,u)
g=9.8;mc=1.0;m=0.1;l=0.5;
S=l*(4/3-m*(cos(x(1)))^2/(mc+m));
fx=g*sin(x(1))-m*l*x(2)^2*cos(x(1))*sin(x(1))/(mc+m);
f=fx/S;
gx=cos(x(1))/(mc+m);
gx=gx/S;%g(x,t),用gx是因为怕和重力加速度g混淆
dx1=x(2);%x1'
dx2=f+gx*u;%x2'
sys = [dx1;dx2];
function sys=mdlOutputs(t,x,u)
sys = x;
3.2Simulink模型
扰动d(t) = sin(t),建立如下模型:
3.3.结果分析
角度θ
角速度 θ'
误差e
误差变化率de
控制输入u
结论:可见看到,线性化反馈控制,在没有外界扰动的情况下,给予初始状态的内部扰动,控制效果还是不错的。
4.基于线性化反馈的滑膜鲁棒控制
4.1滑模控制器设计
引入具有鲁棒的滑膜控制,只需将上文以满足辅助控制输入项为Hurwitz多项式的v换成滑膜项即可,v = xd''-c*e'-η*sign(s)为了方便调参,这里采用等速趋近律,即s’ = ηsign(s),设计过程如下:
在上述的一般非线性二阶系统基础上,加上扰动项d(t),即
其中,f和g为未知的非线性函数 ,干扰d(t) ≤ D。
①定义误差e = x-xd(注意上文证明处是e = xd-x,这样是为了方便证明系统的稳定性),根据线性化反馈理论,设计控制律:
②使用Lyapunov函数,证明系统稳定性:
将①中控制律代入V',则:
由于d(t) ≤ D,所以d(t) < η,所以V' < 0,证明完毕,该闭环系统渐进稳定。
4.2倒立摆系统
仍采用倒立摆系统,不过和上述单独的线性反馈相比,加上扰动项d(t),即
5.基于线性化反馈控制的滑模控制MATLAB/Simulink仿真
考虑外部扰动d(t) = 10sin(t),取理想信号θd(t) = sint(t),即跟踪该正弦曲线;选取被控对象状态变量为[θ θ’],初始状态为[pi/60,0]。
5.1利用S函数编写被控对象
程序如下:
function [sys,x0,str,ts]=Plant_2_4_1(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case {2, 4, 9 }
sys = [];
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[pi/60 0];%倒立摆初始状态
str=[];
ts=[];
function sys=mdlDerivatives(t,x,u)
g=9.8;mc=1.0;m=0.1;l=0.5;
S=l*(4/3-m*(cos(x(1)))^2/(mc+m));
fx=g*sin(x(1))-m*l*x(2)^2*cos(x(1))*sin(x(1))/(mc+m);
f=fx/S;
gx=cos(x(1))/(mc+m);
gx=gx/S;%g(x,t),用gx是因为怕和重力加速度g混淆
dt = u(1);%扰动
U = u(2);%控制力
dx1=x(2);%x1'
dx2=f+gx*U+dt ;%x2'
sys = [dx1;dx2];
function sys=mdlOutputs(t,x,u)
sys = x;
5.2Simulink模型
扰动d(t) = 10sin(t),建立如下模型:
5.3结果分析
角度θ
角速度 θ'
误差e
误差变化率de
控制输入u
结论:从角位置、角速度和误差曲线可见,该滑模控制器能实现较好的追踪效果,即使前面短时间由于初始状态扰动有较小偏差,但也能很快追踪;从误差变化率看,整个过程已知有较小的抖动出现,但在扰动下基本能够通过控制力消除误差,体现了滑膜控制的鲁棒性;但是从控制输入看,控制输入出现了较大的抖振, 所以个人暂时没能理解怎么解决消抖的现象,可能后续的学习会有体会吧!
学习问题:
1.位置指令/理想信号/追踪信号的导数为什么不能用matlab的diff函数求导提供,如果出现指令信号导数不方便求解的情况该怎么办?因为上篇文章的更正中也出现使用simulink的微分模块有时候会出现错误。可以试试在matlab fcn模块中求导后输入到系统模型中?
如果有帮助,麻烦帮忙点个赞是我最大的分享动力,非常感谢!
注:仅为便利自己学习,错误在所难免,如有侵权,请联系删除,有兴趣的学者可以参考学习交流,谢谢!