logo资料库

控制律设计.docx

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
1.1基于滑模变结构控制系统设计
1.2基于Backstepping控制系统设计
第 2 章程序
基于滑模变结构控制系统设计 求的值得时候有: 式(3-7)可以进一步写成: 为了简便我们的计算,我们可以对上式中部分看作一个整体,我们可以取: 对于上一节建立的运动学模型而言,我们为了实现 x 对的跟踪,我们去误 差函数=x−,同理,我们也取=y−。然后我们能够根据已知的信息 写出误差的跟踪方程: 不过在实际运行过程中,由于这种干扰的影响,我们很难实现。但是我们可以预 这时候,我们不妨假设θ的取值范围是(−/2,/2)。当θ能够取到满足我们要 =vcos− =vsin− vcos=1 vsin=2 tanθ=21 θ=arctan21 我们取理想的轨迹跟踪时的航向角为,当θ=的时候,就是理想的状态, 先就将的值设好。我们取: =arctan21 和θ相同,的取值范围我们假设为(0,∞)。我们将1和2的值代入式(3-5) =1− =2− 对于,我们选取滑模函数1=,那么: 1==1− 此时,我们选择控制律1=−11,其中1>0。 同理可得2=−22,2>0。结合式 3-9,我们可以得到实际控制律 υ=1/cos () 先,我们取角度跟踪误差=−。因为本次设计采用滑模变结构进行设计, 上一节我们对位置控制律进行了设计,现在我们对姿态控制律进行设计。首 1.1.1 姿态控制律的设计 可以得到: (3-5) (3-6) (3-7) (3-8) (3-9) (3-10) (3-11) (3-12)
我们令: 3==− ω=−33−33 =33=−323−3|3|≤−323 接下来我们取滑模函数为3=,那么: 3、3均大于 0。 那么3=−33−33,取 也就是≤−23,()≤−23(0),从而完成角度θ的指数收敛。 另外,在信号传输时,我们需要对进行求导运算,不过考虑到求导过程太 复杂,我们使用线性二阶微分器来对进行求解,具体实现如下: 式中, 为微分器的输入信号,1将会对输入的信号进行跟踪,2是对输入信号一阶导数 进行的估计,微分器初始值置零 2=−221− −2 1=2 =2 (3-13) (3-14) (3-15) (3-16) 基于 Backstepping 控制系统设计 由图 3.1 我们可以进一步得到 WMR 的位姿误差模型如图 3.14:
图 3.14 WMR 位姿误差坐标 我们可以选取: 我们令: 则: 接下来进行控制律的设计[18]。 结合式(3-18)、(3-19)可知: 1= + =− +− =p= − − − (1)=0 时,设虚拟输入为α,取= = 1=2/2+2/2 =+1 =+2 1=−12−22<0 取1=+1、2=+2: = 12+22 =2/1 (2)取=−,定义: 2=1+e2/2 2=−12−22+(−) ω=+3 2=−12−22−32≤−22 其中,≤min (1、2、3)。 综合上式,可以得到: 2()≤−22(0) 可以看出2()收敛于零。所以t→0 时,→0,→0,θ→,都收敛于零 此时能够保证式(3-20)的成立[19]。 则 则 我们设 (3-18) (3-19) (3-20) (3-21) (3-22) (3-23) (3-24) (3-25) (3-26) (3-27) (3-28) (3-29)
程序 f-input:指令程序 function [sys,x0,str,ts] = spacemodel(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)]); = 2;%输出量个数,这里是三 = 0;%输入量个数,这里是 0 end function [sys,x0,str,ts]=mdlInitializeSizes%初始化子函数 sizes = simsizes;%生成 size 数据结构 sizes.NumContStates = 0;%连续状态数,默认为 0 sizes.NumDiscStates = 0;%离散状态数,默认为 0 sizes.NumOutputs sizes.NumInputs sizes.DirFeedthrough = 1;%是否存在代数循环,这里是存在 sizes.NumSampleTimes = 1;%采样时间个数是 1 sys = simsizes(sizes);%返回 sizes 数据结构所包含的信息 x0 =[];%设置初值状态 str = [];%保留变量置空 ts = [0 0];%采样时间,这里是 0,表示连续系统 function sys=mdlOutputs(t,x,u) xd=t; yd=sin(0.5*xd)+0.5*xd+1; sys(1)=xd; sys(2)=yd;
f-zitai-ctrl:姿态控制器 function [sys,x0,str,ts] = spacemodel(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 数据结构 sizes.NumContStates = 0;%生成 0 个连续状态数 sizes.NumDiscStates = 0;%生成 0 个离散状态数 = 1;%输出个数是 1 sizes.NumOutputs sizes.NumInputs = 5;%输入个数是 5 sizes.DirFeedthrough = 1;%存在代数循环 sizes.NumSampleTimes = 1;%采样时间个数是 1 sys = simsizes(sizes);%返回 sizes 数据结构所包含的信息 x0 = [];%设置初值状态 str = [];%保留变量置空 ts = [0 0];%采样时间,这里是 0,表示连续系统 function sys=mdlOutputs(t,x,u) dthd=u(1); thd=u(2); th=u(5); the=th-thd;
s3=the; k3=3;xite3=0.50; delta=0.10; kk=1/delta; if abs(s3)>delta ................................................................................................................sats=sign(s3); else .......................................................................................................................sats=kk*s3; end %w=dthd-k3*s3-xite3*sign(s3); w=dthd-k3*s3-xite3*sats; sys(1)=w; f-weizhi-ctrl:位置控制器 function [sys,x0,str,ts] = spacemodel(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 数据结构 sizes.NumContStates = 0;%连续状态量是 0 sizes.NumDiscStates = 0;%离散状态量是 0
= 2;%输出量是 2 sizes.NumOutputs sizes.NumInputs = 5;%输入量是 5 sizes.DirFeedthrough = 1;%存在代数循环 sizes.NumSampleTimes = 1;%采样时间个数是 1 sys = simsizes(sizes);%返回 sizes 数据结构所包含的信息 x0 =[];%设置初值状态 str = [];%保留变量置空 ts = [0 0];%采样时间,这里是 0,表示连续系统 function sys=mdlOutputs(t,x,u) xd=u(1); yd=u(2); xd=t;dxd=1; yd=sin(0.5*xd)+0.5*xd+1; dyd=0.5*cos(0.5*xd)+0.5; x1=u(3); y1=u(4); k1=0.30;k2=0.30; xe=x1-xd; s1=xe; u1=dxd-k1*s1; ye=y1-yd; s2=ye; u2=dyd-k2*s2; thd=atan(u2/u1); v=u1/cos(thd); sys(1)=v; sys(2)=thd;
f-plant:被控对象 function [sys,x0,str,ts] = spacemodel(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 数据结构 sizes.NumContStates = 3;%连续状态量是 3 = 3;%输出量个数是 3 sizes.NumOutputs sizes.NumInputs = 2;%输入量个数是 2 sizes.DirFeedthrough = 0;%存在代数循环 sizes.NumSampleTimes = 1;%采样时间个数是 1 sys = simsizes(sizes);%返回 sizes 数据结构所包含的信息 x0 = [0;0;0];%设置初值状态 str = [];%设置变量置空 ts = [0 0];%采样时间,这里是 0,表示连续系统 function sys=mdlDerivatives(t,x,u) v=u(1); w=u(2); th=x(3); sys(1)=v*cos(th); sys(2)=v*sin(th); sys(3)=w;
分享到:
收藏