【转载】自抗扰控制器的学习过程

学习LADRC结构:

1.学习PID的相关知识,作为学习ADRC的基础铺垫,在simulink中搭建模块,通过调节参数,看调节效果,分析Kp,Ki,Kd参数对系统的影响。
2. 介绍ADRC的一些相关知识及其理解LADRC相关的参数及其意义,用Simulink对模型进行搭建,进行仿真测试。
3. 然后通过对论文的阅读,在Simulink中换被控对象,调节参数,看LADRC控制器是否满足控制要求。
4. 接下来理解LADRC的基本思路,通过Matlab编程,来理解实现离散LADRC功能,为以后在其他仿麦呢应用作为铺垫。(难点—需要时间会长一些)
5. 在以后项目中,利用实际工程来利用LADRC。(可能以后会有更新)

LADRC介绍

1.引用论文及其作者介绍

引用文献作者:
韩京清:韩京清,系统与控制专家,我国控制理论和应用的早期开拓者之一。用最优控制理论提出了拦截问题中新的制导概念和方法;在国内率先推动控制系统计算机辅助设计软件的开发和研究;创造性地提出了计算人口“总和生育率”的“生育基数法”;创建了自抗扰控制技术,为我国控制理论与应用的发展作出了重要贡献。(这里来自百度百科,具体作者信息大家可以自己百度,韩老师是ADRC方法的提出者)

高志强:高志强于1987年和1990年在美国圣母大学分别获得电机工程的硕士和博士学位,从1995年起与韩京清研究员长期合作,全面开展自抗扰控制技术的应用研究,使其突破了参数整定的瓶颈口,以高效、鲁棒、节能、简单易行的特点成为工业控制除PID外又一用途广泛的有力工具。自抗扰技术近年来在国内外学术界也受到了普遍的关注。

参考文献:

[1]韩京清.从PID技术到“自抗扰控制”技术[J].控制工程,2002(03):13-18.

[2]Zhiqiang Gao. Scaling and bandwidth-parameterization based controller tuning[P]. American Control Conference, 2003. Proceedings of the 2003,2003.

2.ADRC结构及其分析介绍

从传统 PID 的原理出发 , 分析了它的优缺点,利用非线性机制来开发了一些具有特殊功能的环节 : 跟踪微分器 (TD) , 扩张状态观测器 (ESO) , 非线性 PID(NPID) 等,并以此组合出高品质的新型控制器 - 自抗扰控制器 (ADRC - Active Disturbances Rejection Controller) , 从而形成了新的“自抗扰控制”技术。

PID 的优点 : 靠控制目标与实际行为之间的误差来确定消除此误差的控制策略。
PID 的缺点 : ①误差的取法 ; ②由误差 e 提取de/dt 的办法 ; ③“加权和”策略不一定最好 ; ④积分反馈有许多副作用。

ADRC结构如下:
在这里插入图片描述
其结构分为这几个部分,安排过渡过程,非线性反馈,扩张状态观测器(ESO - Extended state observer),被控对象等这几个主要部分,接下来按照引文文献1[1],一一讲解。

a.安排过渡过程
因为直接用误差的方法不一定好,因为e = r - y这样的方法容易出现超调,这样对于低扰动-高精度控制不能满足要求。
因此安排一个过渡过程v1(t),v2(t)为微分信号,采用的是e = v1(t) - y,有跟踪微分器的阶跃响应为:
在这里插入图片描述
其中变量h为步长,上式中x1,x2为输入向量,r决定跟随速度,h0决定滤波作用,fst(v1,v2,h,r,h)为:
在这里插入图片描述
其中a,d,a0按照系统调节的参数,sgn为符号函数。

b.扩张状态观测器(ESO)
在这里插入图片描述
这里为扩张状态观测器,其中beta01,beta02,beta03,alpha1,alpha2.,epsilon1都为参数然后z的一阶导和z都为状态变量,其中fal函数为:
在这里插入图片描述

c.非线性PID
利用跟踪微分器 ( TD) , 把经典 PID 改造成“非线性 PID ”,如图所示:
在这里插入图片描述
这里TD(跟踪微分器)给出跟踪输出y的量 z1及其微分z2; 误差、积分、微分是由安排的过渡过程和TD
的输出 z1 , z2 来产生的。
在这里插入图片描述
把原先的“加权和”改成“非线性组合”而得“非线性 PID ”。 采用上面提到的fal 函数具有:小误差 , 大增益 ; 大误差 , 小增益的特性。
在这里插入图片描述

3.ADRC算法

这里也是完全采用韩京清老师的算法思路进行介绍,上面介绍的部分是从数学上推导出来的连续的表达式,但是我们在计算机处理中,或者在现实生活中应用采用的是离散的形式。下面部分是韩老师给出的离散算法部分截屏:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.Matalb编程实现并且检验(这个部分不完善,我个人理解仅仅完成一部分,希望能够有人指正和讨论)

在这里以上内容完全是根据韩老师的论文,见引用文献1截屏抄录,仅仅只加上一个自我的浅薄理解。接下来的部分是个人自己按照韩老师论文的自己用matlab编程实现(是否正确还不太确定,希望大家讨论指正),里面注释用中文再次打开会乱码,因此用自己的Chinglish作为注释,还望不要嘲笑。

代码部分:
a.fst函数代码实现:

%%%
%Input Parameter:
%x1: Input vector1
%x2: Input vector2
%r : The speed of element;It up to tracking speed
%h : The filter of element;It determines the strength of filt.
%x : This is input vector.
%
%Output Parameter:
%y : Function output value.
%%%
function y = fst_function(x1,x2,r,h)
Length1 = length(x1);
% Length2 = length(x2);
% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length1);
a0 = zeros(1,Length1);
a = zeros(1,Length1);
% These two parameters are constants.
d  =  r*h;  % This parameter is known.
d0 =  d*h;  % Known.
  for i = 1:Length1
     % This part can get the value of three parameters.
     % get y a0 a,respectively.
     y(i)  =  x1(i) + h*x2(i);  
     a0(i)  = power(d.^2 + 8*r*(abs(y(i))),1/2);
     if abs(y(i)) > d0
       a(i) = x2(i) + (a0(i) - d)./2;
     end
     if abs(y(i)) <= d0
       a(i) = x2(i) + y(i)./h;
     end
     %This is fst function.
     if abs(a(i)) <= d
        y(i) = -r*a(i)./d;
     end
     if abs(a(i)) > d
        y(i) = -r*sign(a(i));    
     end
  end
end

这里是fst函数的fst_function函数,里面参数为随意设置来检验,如下在command windows窗口输入部分:

>> x1 = 0.1:0.2:10;
>> x2 = x1 + 0.01*rand;
>> r = 4;
>> h = 3;
>> y = fst_function(x1,x2,r,h);
>> plot(x1,y);

得到结果为:
在这里插入图片描述
b.fal函数实现

%This function is fal function
%Input Parameter:
%alpha  : Parameter1
%delta  : Parameter2
%epsilon: Input Vector
%
%Output Parameter:
%y : Function output value.
%%%
function y = fal_function(alpha,delta,epsilon) 
Length = length(epsilon);
% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length);
if delta <= 0
   error("Delta must greater than to zero"); 
end
for i = 1:Length
    if abs(epsilon(i)) > delta 
       y(i) = (abs(epsilon(i)).^alpha)*sign(epsilon(i));
    end
    if abs(epsilon(i)) <= delta && delta > 0
       y(i) = epsilon(i)./(delta.^(1 - alpha));
    end
end
end

这里是fst函数的fal_function函数,里面参数为随意设置来检验,如下在command windows窗口输入部分:

>> alpha = 3;
>> delta = 7;
>> epsilon = -19.9:0.1:20;
>> y = fal_function(alpha,delta,epsilon);
>> plot(epsilon,y);

得到结果为:
在这里插入图片描述

c.根据上述描述的算法,整体总的编程(没有实现成功,希望可以和大家讨论)

% TD + ESO + NLSEF = ADRC
function y = ADRC_Algorithm(Length)
% Call fst and fal function below.
fst = @fst_function;
fal = @fal_function;
% define the length of the variables.
% This can achieve smooth operation.
v1 = zeros(1,Length + 1);
v2 = zeros(1,Length + 1);
Z1 = zeros(1,Length + 1);
Z2 = zeros(1,Length + 1);
Z3 = zeros(1,Length + 1);
epsilon1 = zeros(1,Length + 1);
u0 = zeros(1,Length + 1);
e1 = zeros(1,Length + 1);
e2 = zeros(1,Length + 1);
u = zeros(1,Length + 1);
% Set System Parameters.
r = 0.1;      % r :Speed factor ;It depends on the tracking speed.
h0 = 4;       % h :Filter factor;It determines the strength of the filter.
% Set initial value.
v1(1) = 0.1;  % This is v1(0)
v2(1) = 0.2;  % This is v2(0)
Z1(1) = 0.5;  % This is Z1(0)
Z2(1) = 0.1;  % This is Z2(0)
Z3(1) = 0.7;  % This is Z3(0)
v0 = 8; %This is the Pro_Set or expectation value.(vital)
beta01 = 0.2;
beta02 = 0.3;
beta03 = 0.4;
b = 0.4;
delta = 3.5;
alpha1 = 0.5; %
alpha2 = 0.25; %
% Implemente algorithms and updates the data of parameters in the loop.
for i = 1:Length  
    %Arrange the Transition Process
    v1(i+1) = v1(i) + h*v2(i);
    v2(i+1) = v2(i) + h*fst(v1(i) - v0,v2(k),r,h0);
    %Evaluate the state and total disturbance.
    %ESO Equation
    epsilon1(i) = Z1(i) - y(i);
    %f0(i) = z1(k) + z2(k);   %This function is known,but I don't know its expression.
    %u(i) = u0 - (z3(i) + f0(i))./b;
    %Control yolume formation 
    u0(i) = beta01*fal(e1(i),a1pha1,delta) + beta02*fal(e2(i),alpha2,delta);
    u(i) = u0(i) + Z3(i)/b;
    Z1(i+1) = Z1(i) + h*(Z2(i) - beta01*epsilon1(i));
    Z2(i+1) = Z2(i) + h*(Z3(i) - beta02*fal(epsilon1(i),alpha1,delta)) + b*u(i);
    Z3(i+1) = Z3(i) - h*beta03*fal(epsilon1(i),alpha2,delta);
    %Control yolume formation
    e1(i) = v1(i) - Z1(i);
    e2(i) = v2(i) - Z2(i);
    %data update
    v1(i) = v1(i+1);
    v2(i) = v2(i+1);
    Z1(i) = Z1(i+1);
    Z2(i) = Z2(i+1);
    Z3(i) = Z3(i+1);
end
end
%This function is fst function
%%%
%Input Parameter:
%x1: Input vector1
%x2: Input vector2
%r : The speed of element;It up to tracking speed
%h : The filter of element;It determines the strength of filt.
%x : This is input vector.
%
%Output Parameter:
%y : Function output value.
%%%
function y = fst_function(x1,x2,r,h)
Length1 = length(x1);
% Length2 = length(x2);
% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length1);
a0 = zeros(1,Length1);
a = zeros(1,Length1);
% These two parameters are constants.
d  =  r*h;  % This parameter is known.
d0 =  d*h;  % Known.
  for i = 1:Length1
     % This part can get the value of three parameters.
     % get y a0 a,respectively.
     y(i)  =  x1(i) + h*x2(i);  
     a0(i)  = power(d.^2 + 8*r*(abs(y(i))),1/2);
     if abs(y(i)) > d0
       a(i) = x2(i) + (a0(i) - d)./2;
     end
     if abs(y(i)) <= d0
       a(i) = x2(i) + y(i)./h;
     end   
     %This is fst function.
     if abs(a(i)) <= d
        y(i) = -r*a(i)./d;
     end
     if abs(a(i)) > d
        y(i) = -r*sign(a(i));    
     end
  end
end
%This function is fal function
%Input Parameter:
%alpha  : Input vector1
%delta  : Input vector2
%epsilon:
%
%Output Parameter:
%y : Function output value.
%%%
function y = fal_function(alpha,delta,epsilon) 
Length = length(epsilon);
% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length);
if delta <= 0
   error("Delta must greater than to zero"); 
end
for i = 1:Length
    if abs(epsilon(i)) > delta 
       y(i) = (abs(epsilon(i)).^alpha)*sign(epsilon(i));
    end
    if abs(epsilon(i)) <= delta && delta > 0
       y(i) = epsilon(i)./(delta.^(1 - alpha));
    end
end
end

在这里,存在的问题是f0在论文中没有找到其表达式,随意的添加了一个式子,还有存在参数调整的问题还有初始值设定的问题。这些都需要在接下来学习中理解和加入实际的一些工程进行调节,来理解其中意义。
这是学习的开端,接下来是进行PID理解的学习,作为理解ADRC的开始,这是我的第一篇博客,自己以后将会以自己的理解,学习后分享自己的成果,然后大家一起讨论进步。

学习LADRC结构:

1.学习PID的相关知识,作为学习ADRC的基础铺垫,在simulink中搭建模块,通过调节参数,看调节效果,分析Kp,Ki,Kd参数对系统的影响。
2. 介绍ADRC的一些相关知识及其理解LADRC相关的参数及其意义,用Simulink对模型进行搭建,进行仿真测试。
3. 然后通过对论文的阅读,在Simulink中换被控对象,调节参数,看LADRC控制器是否满足控制要求。
4. 接下来理解LADRC的基本思路,通过Matlab编程,来理解实现离散LADRC功能,为以后在其他仿麦呢应用作为铺垫。(难点—需要时间会长一些)
5. 在以后项目中,利用实际工程来利用LADRC。(可能以后会有更新)

LADRC介绍

1.引用论文及其作者介绍

引用文献作者:
韩京清:韩京清,系统与控制专家,我国控制理论和应用的早期开拓者之一。用最优控制理论提出了拦截问题中新的制导概念和方法;在国内率先推动控制系统计算机辅助设计软件的开发和研究;创造性地提出了计算人口“总和生育率”的“生育基数法”;创建了自抗扰控制技术,为我国控制理论与应用的发展作出了重要贡献。(这里来自百度百科,具体作者信息大家可以自己百度,韩老师是ADRC方法的提出者)

高志强:高志强于1987年和1990年在美国圣母大学分别获得电机工程的硕士和博士学位,从1995年起与韩京清研究员长期合作,全面开展自抗扰控制技术的应用研究,使其突破了参数整定的瓶颈口,以高效、鲁棒、节能、简单易行的特点成为工业控制除PID外又一用途广泛的有力工具。自抗扰技术近年来在国内外学术界也受到了普遍的关注。

参考文献:

[1]韩京清.从PID技术到“自抗扰控制”技术[J].控制工程,2002(03):13-18.

[2]Zhiqiang Gao. Scaling and bandwidth-parameterization based controller tuning[P]. American Control Conference, 2003. Proceedings of the 2003,2003.

2.ADRC结构及其分析介绍

从传统 PID 的原理出发 , 分析了它的优缺点,利用非线性机制来开发了一些具有特殊功能的环节 : 跟踪微分器 (TD) , 扩张状态观测器 (ESO) , 非线性 PID(NPID) 等,并以此组合出高品质的新型控制器 - 自抗扰控制器 (ADRC - Active Disturbances Rejection Controller) , 从而形成了新的“自抗扰控制”技术。

PID 的优点 : 靠控制目标与实际行为之间的误差来确定消除此误差的控制策略。
PID 的缺点 : ①误差的取法 ; ②由误差 e 提取de/dt 的办法 ; ③“加权和”策略不一定最好 ; ④积分反馈有许多副作用。

ADRC结构如下:
在这里插入图片描述
其结构分为这几个部分,安排过渡过程,非线性反馈,扩张状态观测器(ESO - Extended state observer),被控对象等这几个主要部分,接下来按照引文文献1[1],一一讲解。

a.安排过渡过程
因为直接用误差的方法不一定好,因为e = r - y这样的方法容易出现超调,这样对于低扰动-高精度控制不能满足要求。
因此安排一个过渡过程v1(t),v2(t)为微分信号,采用的是e = v1(t) - y,有跟踪微分器的阶跃响应为:
在这里插入图片描述
其中变量h为步长,上式中x1,x2为输入向量,r决定跟随速度,h0决定滤波作用,fst(v1,v2,h,r,h)为:
在这里插入图片描述
其中a,d,a0按照系统调节的参数,sgn为符号函数。

b.扩张状态观测器(ESO)
在这里插入图片描述
这里为扩张状态观测器,其中beta01,beta02,beta03,alpha1,alpha2.,epsilon1都为参数然后z的一阶导和z都为状态变量,其中fal函数为:
在这里插入图片描述

c.非线性PID
利用跟踪微分器 ( TD) , 把经典 PID 改造成“非线性 PID ”,如图所示:
在这里插入图片描述
这里TD(跟踪微分器)给出跟踪输出y的量 z1及其微分z2; 误差、积分、微分是由安排的过渡过程和TD
的输出 z1 , z2 来产生的。
在这里插入图片描述
把原先的“加权和”改成“非线性组合”而得“非线性 PID ”。 采用上面提到的fal 函数具有:小误差 , 大增益 ; 大误差 , 小增益的特性。
在这里插入图片描述

3.ADRC算法

这里也是完全采用韩京清老师的算法思路进行介绍,上面介绍的部分是从数学上推导出来的连续的表达式,但是我们在计算机处理中,或者在现实生活中应用采用的是离散的形式。下面部分是韩老师给出的离散算法部分截屏:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.Matalb编程实现并且检验(这个部分不完善,我个人理解仅仅完成一部分,希望能够有人指正和讨论)

在这里以上内容完全是根据韩老师的论文,见引用文献1截屏抄录,仅仅只加上一个自我的浅薄理解。接下来的部分是个人自己按照韩老师论文的自己用matlab编程实现(是否正确还不太确定,希望大家讨论指正),里面注释用中文再次打开会乱码,因此用自己的Chinglish作为注释,还望不要嘲笑。

代码部分:
a.fst函数代码实现:

%%%
%Input Parameter:
%x1: Input vector1
%x2: Input vector2
%r : The speed of element;It up to tracking speed
%h : The filter of element;It determines the strength of filt.
%x : This is input vector.
%
%Output Parameter:
%y : Function output value.
%%%
function y = fst_function(x1,x2,r,h)
Length1 = length(x1);
% Length2 = length(x2);
% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length1);
a0 = zeros(1,Length1);
a = zeros(1,Length1);
% These two parameters are constants.
d  =  r*h;  % This parameter is known.
d0 =  d*h;  % Known.
  for i = 1:Length1
     % This part can get the value of three parameters.
     % get y a0 a,respectively.
     y(i)  =  x1(i) + h*x2(i);  
     a0(i)  = power(d.^2 + 8*r*(abs(y(i))),1/2);
     if abs(y(i)) > d0
       a(i) = x2(i) + (a0(i) - d)./2;
     end
     if abs(y(i)) <= d0
       a(i) = x2(i) + y(i)./h;
     end
     %This is fst function.
     if abs(a(i)) <= d
        y(i) = -r*a(i)./d;
     end
     if abs(a(i)) > d
        y(i) = -r*sign(a(i));    
     end
  end
end

猜你喜欢

转载自blog.csdn.net/qq_42249050/article/details/106364684
今日推荐