九、基于模糊自适应增益调整的机器人滑模控制
采用自适应模糊系统,可实现机器人滑模控制中切换增益的自适应逼近,从而消除滑模控制中的抖振。本文设计一类基于模糊自适应增益调整的机器人滑模控制设计方法。
9.1 机器人动力学模型及其结构特性
设关节机械手动态方程为
其中为关节转动角度向量,为维正定惯性矩阵,为维向心哥氏力矩,为维惯性矩阵,为各个关节运动的转矩向量,即控制输入。
机器人动力学系统具有如下动力学特性:
特性1 惯性矩阵是对称正定阵且有界;
特性2 是一个斜对称矩阵,即对任意向量,有
特性3 重力项满足,为的函数
9.2 传统滑模控制律的设计
定义跟踪误差为:
定义误差函数为:
其中
定义
设计控制律为
其中分别为的估计值,为正定矩阵,为正定阵
将式代入式得
其中
定义函数为
对求导
9.3 基于模糊自适应增益调整的机器人滑模控制
9.3.1 模糊系统的设计
已经证明,采用模糊系统可以实现对任意连续函数的精确逼近。因此,可以采用模糊系统自适应逼近控制律的增益。
采用乘积推理机、单值模糊器和中心平均解模糊器来设计模糊系统,系统的输出为:
其中
9.3.2 基于模糊增益自适应调整的滑模控制
基于模糊增益调整的控制律设计为
其中
模糊规则的设计
如果增益不采用模糊逼近,定义函数:
自适应模糊滑模控制律的设计
9.3.4 仿真实例
选二关节机器人力臂系统,其动力学模型为:
机械臂的实际物理参数值见表
仿真程序:chap7_7sim.mdl
控制律子程序:chap7_7ctrl.m
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 = [];
otherwiseerror(['Unhandled flag =',num2str(flag)]);
endfunction [sys,x0,str,ts] = mdlInitializeSizes
global nmn
nmn = 10*eye(2);
sizes = simsizes;
sizes.NumContStates =10;
sizes.NumDiscStates =0;
sizes.NumOutputs =4;
sizes.NumInputs =6;
sizes.DirFeedthrough =1;
sizes.NumSampleTimes =1;
sys = simsizes(sizes);
x0 = [0.1*ones(10,1)];
str = [];
ts = [0 0];function sys =mdlDerivatives(t,x,u)
q1 = x(1);dq1 = x(2);
q2 = x(3);dq2 = x(4);
dq = [dq1;dq2];tol(1) = u(1);
tol(2) = u(2);ddq = inv(M)*(tol'-C*dq-G);
sys(1) = x(2);
sys(2) = ddq(1);
sys(3) = x(4);
sys(4) = ddq(2);function sys = mdlOutputs(t,x,u)
global nmn
qd1 = u(1);qd2 = u(2);
dqd1 = 0;dqd2 = 0;
ddqd1 = 0;ddqd2 = 0;
dqd = [dqd1;dqd2];
ddqd = [ddqd1;ddqd2];q1 = u(3);dq1 = u(4);
q2 = u(5);dq2 = u(6);
dq = [dq1;dq2];e1 = q1-qd1;
e2 = q2-qd2;
e =[e1;e2];
de1 = dq1-dqd1;
de2 = dq2-dqd2;
de =[de1;de2];%The model is given by Slotine and Weiping Li(MIT 1987)
alfa = 6.7;beta = 3.4;
epc = 3.0;eta = 0;
m1 = 1;l1 = 1;
lc1 = 1/2;I1 = 1/12;
g = 9.8;
e1 = m1*l1*lc1-I1-m1*l1^2;
e2 = g/l1;M = [alfa+2*epc*cos(q2)*eta*sin(q2),beta+epc*cos(q2)+eta*sin(q2);beta+epc*cos(q2)+eta*sin(q2),beta];
C = [(-2*epc*sin(q2)+2*eta*cos(q2))*dq2,(-epc*sin(q2)+eta*cos(q2)*dq2;(epc*sin(q2)-eta*cos(q2)*dq1,0];
G = [epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)+(alfa-beta+e1)*e2*cos(q1);epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)];
M0 = 0.5*M;
C0 = 0.5*C;
G0 = 0.5*G;s = de+nmn*e;
dqr = dqd-nmn*e;
ddqr = ddqd-nmn*de;
for i = 1:1:5thta1(i,1) = x(i);
end
for i = 1:1:5thta2(i,1) = x(i+5);
endfsd1 = 0; fsd2 = 0;
for l1 = 1:1:5gs1 = -[(s(1)+pi/6-(l1-1)*pi/12)/(pi/24)]^2;u1(l1) = exp(gs1);
end
for l1=1:1:5fsu1(l1) = u1(l1);fsd1 = fsd1+u1(l1);
end
fs1 = fsu1/(fsd1+0.001);
k1 = thta1'*fs1';for l2=1:1:5gs2 = -[(s(2)+pi/6-(l2-1)*pi/12)/(pi/24)]^2;u2(l2) = exp(gs2);
endfor l2=1:1:5fsu2(l2) = u2(l2);fsd2 = fsd2+u2(l2);
endfs2 = fsu2/(fsd2+0.001);k2 = thta2'*fs2';A = 50*eye(2);
S = 1;
if S == 1K = [100 0;100 0];tol = M0*ddqr+C0*dqr+G0-A*s-K*sign(s);
elseif S == 2 %Adaptive fuzzy gainK = l*[k1 k2]'tol = M0*ddqr+C0*dqr+G0-A*s-K;
end
sys(1) = tol(1);
sys(2) = tol(2);
sys(3) = K(1);
sys(4) = K(2);
被控对象子程序:chap7_7plant.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 = [];
otherwiseerror(['Unhandled flag =',num2str(flag)]);
endfunction [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates =4;
sizes.NumDiscStates =0;
sizes.NumOutputs =4;
sizes.NumInputs =4;
sizes.DirFeedthrough =0;
sizes.NumSampleTimes =0;
sys = simsizes(sizes);
x0 = [0;0;0;0];
str = [];
ts = [];function sys =mdlDerivatives(t,x,u)
q1 = x(1);dq1 = x(2);
q2 = x(3);dq2 = x(4);
dq = [dq1;dq2];%The model is given by Slotine and Weiping Li(MIT 1987)
alfa = 6.7;beta = 3.4;
epc = 3.0;eta = 0;
m1 = 1;l1 = 1;
lc1 = 1/2;I1 = 1/12;
g = 9.8;
e1 = m1*l1*lc1-I1-m1*l1^2;
e2 = g/l1;M = [alfa+2*epc*cos(q2)*eta*sin(q2),beta+epc*cos(q2)+eta*sin(q2);beta+epc*cos(q2)+eta*sin(q2),beta];
C = [(-2*epc*sin(q2)+2*eta*cos(q2))*dq2,(-epc*sin(q2)+eta*cos(q2)*dq2;(epc*sin(q2)-eta*cos(q2)*dq1,0];
G = [epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)+(alfa-beta+e1)*e2*cos(q1);epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)];tol(1) = u(1);
tol(2) = u(2);ddq = inv(M)*(tol'-C*dq-G);
sys(1) = x(2);
sys(2) = ddq(1);
sys(3) = x(4);
sys(4) = ddq(2);
function sys = mdlOutputs(t,x,u)
sys(1) =x(1);
sys(2) =x(2);
sys(3) =x(3);
sys(4) =x(4);
绘图子程序:chap7_7plot.m
close all;figure(1);
subplot(211);
plot(t,y1(:,1),'r',t,y1(:,2),'b');
xlabel('time(s)');
ylabel('Position tracking of joint 1');
subplot(212);
plot(t,y2(:,1),'r',t,y2(:,2),'b')
xlabel('time(s)');
ylabel('Position tracking of joint 2');figure(2);
subplot(211);
plot(t,y1(:,1)-y2(:,2),'r');
xlabel('time(s)');
ylabel('Position tracking error of joint 1');
subplot(212);
plot(t,y2(:,1)-y2(:,2),'r')
xlabel('time(s)');
ylabel('Position tracking error of joint 2');figure(3);
subplot(211);
plot(t,P(:,1),'r');
xlabel('time(s)');
ylabel('Control input 1');
subplot(212);
plot(t,P(:,2),'r');
xlabel('time(s)');
ylabel('Control input 2');