基于比例切换控制的滑模控制直线一级倒立摆
>> clear all;
>> close all;
>> global C M0 F
>> ts=0.02;
>> T=30;
>> TimeSet=[0:ts:T];
>> para=[];
>> options=odeset('RelTol',1e-3,'AbsTol',[1e-3 1e-3 1e-3 1e-3]);
>> x0=[0.5,0.3,0,0];
>> [t,xout]=ode45('DxnamicModel',TimeSet,x0,options,para);
>> x1=xout(:,1);
>> x2=xout(:,2);
>> x3=xout(:,3);
>> x4=xout(:,4);
>> s=C(1)*x1+C(2)*x2+C(3)*x3+C(4)*x4;
>> if F==1
M0=40;
u=-M0*sign(s);
elseif F==2
beta=30;
delta=0;
for k=1:1:T/ts+1
u(k)=-beta*(abs(x1(k))+abs(x2(k))+abs(x3(k))+abs(x4(k))+delta)*sign(s(k));
end
end
figure(1);
plot(t,x1,’r’);
xlabel(‘time(s)’;ylabel(‘Cart Position’);
figure(2);
plot(t,x2,’r’);
xlabel(‘time(s)’);ylabel(‘Pendulum Angle’);
figure(3);
plot(t,s,’r’);
xlabel(‘time(s)’;ylabel(‘s’);
figure(4);
plot(t,u,’r’);
xlabel(‘time(s)’;ylabel(‘u’);
function dx=DxnamicModel(t,x,flag,para)
global C M0 F
M=5;m=1;a=1;C1=1;g=9.81;
a32=-3*(C1-m*g*a)/(a*(4*M+m));
a42=-3*(M+m)*(C1-m*g*a)/(a^2*m*(4*M+m));
b3=4/(4*M+m);
b4=3/(4*M+m);
A=[0,0,1,0;
0,0,0,1;
0,a32,0,0;
0,a42,0,0];
b=[0;0;b3;b4];
%Ackermann's formula
n1=-1;n2=-2;n3=-3;
C=[0,0,0,1]*inv([b,A*b,A^2*b,A^3*b])*(A-n1*eye(4))*(A-n2*eye(4))*
(A-n3*eye(4));
s=C*x;
F=2;
if F==1
M0=40;
u=-M0*sign(s);
elseif F==2;
beta=30;
delta=0;
u=-beta*(abs(x(1))+abs(x(2))+abs(x(3))+abs(x(4))+delta)*sign(s);
end
dx=zeros(4,1);
f0=0.5;
ft=f0*sin(3*t);
dx=A*x+b*(u+ft);
基于指数趋近率的滑模控制一级倒立摆
clear all;
close all;
global C M A b eq k
ts=0.02;
T=30;
TimeSet=[0:ts:T];
para=[];
options=odeset('RelTol',1e-3,'AbsTol',[1e-3 1e-3 1e-3 1e-3]);
x0=[0.5,0.3,0,0];
[t,xout]=ode45('DynamicModel',TimeSet,x0,options,para);
x1=xout(:,1);
x2=xout(:,2);
x3=xout(:,3);
x4=xout(:,4);
s=C(1)*x1+C(2)*x2+C(3)*x3+C(4)*x4;
if M==2
k=10;
eq=5.0;
for kk=1:1:T/ts+1
xk=[x1(kk);x2(kk);x3(kk);x4(kk)];
sk(kk)=C(1)*x1(kk)+C(2)*x2(kk)+C(3)*x3(kk)+C(4)*x4(kk);
slaw(kk)=-eq*sign(sk(kk))-k*sk(kk);
u(kk)=inv(C*b)*(-C*A*xk+slaw(kk));
end
end
figure(1);
plot(t,x1,'r');
xlabel('time(s)');ylabel('Cart Position');
figure(2);
plot(t,x2,'r');
xlabel('time(s)');ylabel('Pendulum Angle');
figure(3);
plot(t,s,'r');
xlabel('time(s)');ylabel('s');
if M==2
figure(4);
plot(t,u,'r');
xlabel('time(s)');ylabel('u');
end
function dx=DynamicModel(t,x,flag,para)
global C M eq A b k
M=1.096;m=0.109;b=0.1;l=0.25;I=0.0034;g=9.81;
a22=-(I+m*l^2)*b/(I*(M+m)+M*m*l^2);
a23=m^2*g*l^2/(I*(M+m)+M*m*l^2);
a42=-m*l*b/(I*(M+m)+M*m*l^2);
a43=m*g*l*(M+m)/(I*(M+m)+M*m*l^2);
b2=(I+m*l^2)/(I*(M+m)+M*m*l^2);
b4=m*l/(I*(M+m)+M*m*l^2);
A=[0 1 0 0;0 a22 a23 0;0 0 0 1;0 a42 a43 0];
b=[0;b2;0;b4];
n1=-1;n2=-2;n3=-3;
C=[0,0,0,1]*inv([b,A*b,A^2*b,A^3*b])*(A-n1*eye(4))*(A-n2*eye(4))*(A-n3*eye(4));
s=C*x;
M=2;
eq=5.0;
if M==1
slaw=-eq*sign(s);
elseif M==2
k=10;
slaw=-eq*sign(s)-k*s;
elseif M==3
k=10;alfa=0.50;
slaw=-k*abs(s)^alfa*sign(s);
elseif M==4
k=1;
slaw=-eq*sign(s)-k*s^3;
end
u=inv(C*b)*(-C*A*x+slaw);
dx=zeros(4,1);
f0=0.5;
ft=f0*sin(3*t);
dx=A*x+b*(u+ft);