一、自抗扰控制算法简介

自抗扰控制(Active Disturbance Rejection Control, ADRC)是由韩京清先生于1998年正式提出,其独特之处在于它把作用于被控对象的所有不确定因素归结为“未知扰动”,而用对象的输入输出数据对它进行估计并补偿[1]。自抗扰控制最大的优点就是不要求被控对象有精确的数学模型,是不依赖模型的控制算法,其控制结构图如下:

图1 自抗扰控制结构图

二、自抗扰控制各模块的Simulink实现

本文以二阶被控对象为基础建立二阶自抗扰控制器的Simulink模型,算法以朱斌老师编著的《自抗扰控制入门》[2]一书为准。

设有二阶对象:

[公式] (1)

[公式] (2)

  • 跟踪-微分器(TD)与安排过渡过程

其算法如下:

[公式]

对应的离散算法如下:

[公式] (3)

式中, x1 为输入信号v的跟踪信号; x2  x1 的微分信号; h 为采样周期; r0 决定信号的跟踪速度,称为”速度因子“; h0 对信号的噪声起滤波作用,称为”滤波因子“;fhan() 为一种最速综合函数,其作用为较好的安排参考信号的过渡过程,使之不发生超调。具体形式如下:

[公式] (4)

注:标红处原书为 r ,此处更改为 r0 

其中, r0  h0 为控制器可调参数。

跟踪微分器的Simulink模块搭建如下图所示:

图2 跟踪-微分器的Simulink实现

图中的Matlab Function模块为 fhan() 函数,内容如下:

% ADRC中的fhan函数(最速综合函数,TD、NLSEF使用)
function fhan = fhan(x1,x2,r0,h0)
d = r0 * (h0^2);
a0 = h0 * x2;
y = x1 + a0;
a1 = sqrt(d * (d + 8 * abs(y)));
a2 = a0 + sign(y) * (a1 - d)/2;
sy = (sign(y + d) - sign(y - d))/2;
a = (a0 + y - a2) * sy + a2;
sa = (sign(a + d) - sign(a - d))/2;
fhan = -r0 * (a / d - sign(a)) * sa - r0 * sign(a);

下面以单位阶跃信号的跟踪效果来验证离散跟踪微分器的能力。搭建Simulink模块如下:

图3 跟踪-微分器的单位阶跃响应

设置解算器为固定步长,采样周期 h=0,01  h0=0.01  r0=1 ,得到以下图形:

图4 跟踪-微分器对单位阶跃信号的跟踪效果

  • 非线性状态误差反馈控制律(NLSEF)

NLSEF有两种组合形式。

  1. NLSEF第一种形式如下:

[公式] (5)

[公式] (6)

第一种非线性状态误差反馈控制律的Simulink模块搭建如下图所示:

图5 第一种非线性状态误差反馈控制律的Simulink实现

图中的Matlab Function模块为 fal() 函数,内容如下:

% ADRC中的fal函数(非线性函数,ESO及NLSEF使用)
function y = fal(x,a,delta) % delta代表δ
    if abs(x) <= delta   % abs()函数为取绝对值或者复数的幅值
        y = x / (delta^(1-a));
    else
        y = sign(x) * (abs(x)^a); % sign()为符号函数
    end

2. NLSEF的第二种形式如下:

[公式] (7)

式中, c 为阻尼因子; r 为控制器增益; h1 为精度因子; fhan() 与(4)式定义相同。

第二种非线性状态误差反馈控制律的Simulink模块搭建如下图所示:

图6 第二种非线性状态误差反馈控制律的Simulink实现

图中的Matlab Function模块为 fhan() 函数,内容见上文。

  • 扩张状态观测器(ESO)

扩张状态观测器是ADRC的控制理念体现,是ADRC中最重要的一环。它将系统总扰动扩张成一个新的系统状态量,通过系统的控制输入、输出将扩张的状态变量观测出来并加以补偿。其算法如下:

[公式] (8)

图7 扩张状态观测器的Simulink实现

对应的离散形式如下:

[公式] (9)

h 为采样周期;其余参数与上文定义相同。

离散形式的扩张状态观测器Simulink模块搭建如下图所示:

图8 离散扩张状态观测器的Simulink实现

下面以正弦信号输入来验证扩张状态观测器的观测效果。搭建Simulink模块如下:

图9 验证扩张状态观测器的观测效果

图10 扩张状态观测器的观测效果

三、结语

  1. 基于目前对自抗扰控制的认知有限,且对Matlab使用还不太熟悉的情况,文中可能会有些错误的地方,希望能在今后的研究中及时发现错误、改正错误;
  2. 下一步将对以上模块进行封装并添加自定义库,便于今后的仿真模块搭建。

参考

  1. ^韩京清. 从PID技术到“自抗扰控制”技术[J]. 控制工程. 2002(03): 13-18.
  2. ^朱斌. 自抗扰控制入门[M]. 北京: 北京航空航天大学出版社, 2017.