马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
%刘金琨——机器人模糊自适应控制
%4.1 单臂机械手臂直接自适应控制。直接采用的是控制知识,间接是被控对象的知识
%直接型模糊自适应控制是基于模糊系统设计一个反馈控制器U 和一个调整参数向量W的自适应控制规律
%似的系统能够跟踪理想的输出,
%U=W*fx : W is 可调参数,通过自适应规律。 U的输出是模糊自适应控制器输出
%跟踪效果不是很理想。。在转弯处有不好的扰动。
%本控制程序的优点:(1)可以在参数未知的情况下进行控制
%(2) 扰动考虑了摩擦为库伦摩擦和粘性摩擦的情况。设计之初没有考虑扰动。。。在有扰动的情况下扔具有较好的跟踪性能。
%(2) 对控制输出进行模糊设计
%(3)模糊隶属函数难以确定。需要经验。
%(4)经过自适应调整后面的效果越来越好
%(5)可以想象Q的数值越大,误差跟踪响应越快
%(6)控制力矩输出不平缓,这个是个大缺点
function aaa=fuzzy_adaptive_single()
clc
clear all
close all
global Q k1 k2 ranta K1 K2
%初始参数(控制器的调节参数)
Q=[200 0;0 200];k1=0.3;k2=1.5; %事关扰动的大小,Q为李雅普的正定矩阵
K1=10;K2=1; ranta=50; W=0.1*rand(36,1); %ranta
x10=[1;0;W]; %初始值
%程序需要的参数
t=0;tmax=5; n=1; u=0; h=0.001;
while t<tmax
[u,dX]=derives(t,x10,u);
m1=h*dX; t=t+0.5*h;X=x10+0.5*m1; %更新导数
[u,dX]=derives(t,X,u);
m2=h*dX; X=x10+0.5*m2; %更新导数
[u,dX]=derives(t,X,u);
m3=h*dX; t=t+0.5*h; X=x10+m3; %更新导数
[u,dX]=derives(t,X,u);
m4=h*dX;
x10=x10+(1/6)*(m1+2*m2+2*m3+m4);
%输出
YY(:,n)=x10;time(n)=t; UU(:,n)=u; n=n+1;
end
figure(1)
t=time;
RR=[sin(2*pi*t); 2*pi*cos(2*pi*t);-(2*pi)^2*sin(2*pi*t);];
plot(time,RR(1,:),'b',time,YY(1,:),'r',time,RR(2,:),'b',time,YY(2,:),'r');grid on
figure(2)
plot(time,UU,'r');grid on
end
function [U,dX]=derives(t,x10,u)
global Q k1 k2 K1 K2 ranta
%参考对象
r=[sin(2*pi*t); 2*pi*cos(2*pi*t);-(2*pi)^2*sin(2*pi*t);];
E=r(1:2,1)-x10(1:2,1); %仅关注位置和速度误差
%控制规律
%(1)模糊推理输出
xi(1)=x10(1);xi(2)=x10(2); FS1=0;
u1(1)=1/(1+exp(5*(xi(1)+2))); %位置输入的头尾两个隶属度值
u1(6)=1/(1+exp(-5*(xi(1)-2)));
for i=2:1:5
u1(i)=exp(-(xi(1)+1.5-(i-2))^2); %每个输入都有六个模糊子集
end
u2(1)=1/(1+exp(5*(xi(2)+2))); %速度输入的头尾两个隶属度值
u2(6)=1/(1+exp(-5*(xi(2)-2)));
for i=2:1:5
u2(i)=exp(-(xi(2)+1.5-(i-2))^2);
end
for i=1:1:6
for j=1:1:6
FS2(6*(i-1)+j)=u1(i)*u2(j); %模糊规则采用乘积的形式
FS1=FS1+u1(i)*u2(j); %用于重心法,分母项的计算
end
end
FS=FS2/FS1; %推理采用重心法。
%(2) 模糊规则的中心值
W=x10(3:38,:);
U=FS*W; %W为模糊输出采用单点模糊集,各个值代表中心值。
%%%%------------系统计算—(可以更换不同的控制对象)—————————————————————————————————————%
g=9.8;m=1;l=0.25;d=2.0;I=4/3*m*l^2;
tol=U;
told=sign(x10(2))*(k1*abs(x10(2))+k2); %扰动有点特色!!
fx=1/I*(-d*x10(2)-m*g*l*cos(x10(1)));gx=1/I;
%----------------------------------------------------------------------%
dX(1,:)=x10(2);
dX(2,:)=fx+gx*(tol-told);
%----------权值更新------------------------------------%
A=[0 -K2; %注意A的形式是倒数
1 -K1];
P=lyap(A,Q);
dX(3:38,:)=ranta*E.'*P(:,2)*FS.';
end
|