基于滑模变结构控制系统设计
求的值得时候有:
式(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
=3 3=−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;