八、基于干扰观测器的单机械臂滑模控制
8.1 单机械臂模型
通过引入干扰观测器,可精确地估计被控对象的不确定性和外加干扰,从而降低滑模控制中的增益,有效地降低抖振。
不确定单机械臂的动力学方程为
(8.25)
其中为系统输出转角,为转动惯量,为重力,为控制输入,为未知的非线性摩擦,质心距连杆的转动中心为,连杆运动的粘性摩擦为,和非别为相应参数的不确定值,为弹性摩擦系数。
将式(8.25)变为
则不确定单机械臂可采用二阶微分方程来描述:
(8.26)
其中,,和为已知值,代表不确定项、重力项和摩擦项的总和,
8.2 单机械臂模型的滑模控制器设计及分析
滑模面设计为
(8.27)
其中,为位置。
针对被控对象式(8.26),设计滑模控制律为
(8.28)
其中为通过干扰观测器对项的估计值,为项的估计误差。
切换增益系数设计为
(8.29)
Lyapunov函数为
由于
将控制律式(8.28)代入上式,得:
则
可见,为了满足,需要满足。如果对项的估计误差足够小,则切换增益系数可设计成很小的值,从而有效地降低抖振。
8.3 干扰观测器的设计
为了观测干扰项,设计观测器为
(8.30)
其中为对干扰的估计,为对的估计,,和为通过极点配置的增益。
干扰观测器式(9.30)表示为:
(8.31)
(8.32)
8.4 仿真实例
假设单机械臂的动态方程为
(8.33)
其中。
被控对象中,取。采用控制律为(8.28),取,干扰观测器取式(8.31)和式(8.32),取。取,不采用干扰观测器,为了克服项,需要设计,仿真结果如图和如图所示。取,采用干扰观测器,取,仿真结果如图所示。
图9.1 控制输入信号(M=2)
图9.2 位置跟踪及跟踪误差(M=2)
图9.3 干扰及其观测结果(M=2)
仿真程序:
simulink主程序:chap9_5sim.mdl
控制器S函数:chap9_5ctrl.m
function [sys,x0,str,ts]=spacemodel(t,x,u,flag)
switch flag,
case 0,
[sys, x0,str,ts] = mdlInitializeSizes;
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.NumOutputs =1;
sizes.NumInputs =5;
sizes.DirFeedthrough =1;
sizes.NumSampleTimes =1;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [0 0];
function sys = mdlOutputs(t,x,u)
r = u(1);
dr = cos(t);
ddr = -sin(t);
th = u(2);
dth = u(3);
fp = u(5);
e = r-th;
de = dr - dth;
c = 3;
s = de+c*e;
b = 15;
a = 5;
M = 2;
if M ==1 % Traditional with SMC
Kf = 6;
% Kf = 0.15;
ut = 1/a*(c*de+ddr+b*dth+Kf*sign(s));
elseif M ==2 % SMC with observer
Kf = 0.15;
ut = 1/a*(c*de+ddr+b*dth+1*fp+Kf*sign(s));
end
sys(1) = ut;
干扰观测器S函数:chap9_5obv.m
function [sys,x0,str,ts]=s_function(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 =1;
sizes.NumInputs =4;
sizes.DirFeedthrough =0;
sizes.NumSampleTimes =0;
sys = simsizes(sizes);
x0 = [0;0];
str = [];
ts = [];
function sys = mdlDerivatives(t,x,u)
r = sin(t);
dr = cos(t);
ddr = -sin(t);
ut = u(1);
dth = u(3);
x2 = dr - dth;
K1 = 1500;
K2 = 200;
a =5;b = 15;
sys(1) = K1*(x2-x(2));
sys(2) = x(1)-b*x(2)-a*ut+K2*(x2-x(2))+ddr+b*dth+b*x(2);
function sys = mdlOutputs(t,x,u)
sys(1) = x(1);
被控对象S函数:chap9_5plant.m
function [sys,x0,str,ts] = s_function(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts] = mdlInitializesSizes;
case 1,
sys = mdlDerivatives(t,x,u);
case 3,
sys = mdlOutputs(t,x,u);
case{2,4,9}
sys = [];
otnerwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates =2;
sizes.NumDiscStates =0;
sizes.NumOutputs =3;
sizes.NumInputs =1;
sizes.DirFeedthrough =0;
sizes.NumSampleTimes =0;
sys = simsizes(sizes);
x0 = [0;0];
str = [];
ts = [];
function sys = mdlDerivatives(t,x,u)
ut = u(1);
b = 15;
a = 5;
f = 5+0.15*sin(t);
ddth = -b*x(2)+a*ut-f;
sys(1)=x(2);
sys(2)=ddth;
function sys = mdlOutputs(t,x,u)
f = 5+0.15*sin(t);
sys(1) = x(1);
sys(2) = x(2);
sys(3) = f;
作图程序:chap9_5plot.m
close all;
figure(1);
subplot(211);
plot(t,y(:,1),'r',y(:,2),'b');
xlabel('time(s)');
ylabel('Position tracking');
subplot(212);
plot(t,y(:,1)-y(:,2),'r');
xlabel('time(s)');
ylabel('Position tracking error');
figure(2);
plot(t,ut(:,1),'r');
xlabel('time(s)');
ylabel('Control input');
figure(3);
plot(t,f(:,3),'r',t,f(:,4),'b');
xlabel('time(s)');
ylabel('f and fp');
Simulink仿真图和相应S-Function函数的m文件已经打包上传至资源,代码稍有改动,有需要请下载。