本文整理了自抗扰控制ADRC的由来及其原理,主要参考韩京清老师《自抗扰控制技术》。

PID控制:

PID(Proportional-Integral-Derivative)控制是一种常见的反馈控制算法,被广泛应用于工业过程控制和自动化系统中。虽然PID控制具有很多优点,但也存在一些缺点,包括以下几点[参考自抗扰控制技术]:

1.直接以e=v-y的方式产生原始误差不太合理,这里控制目标v是在过程中可以“跳变”,但是对象输出y的变化都有惯性,不可能跳变,要求让缓变的变量y来跟踪能够跳变的变量v,本身就不合理。

2.产生误差信号e的微分信号 没有太好的方法,只能近似实现,常用 实现,但是当输入信号 被噪声 污染时 ,输出y中的近似微分信号 会被放大的噪声分量 所掩没,无法利用。

3.线性组合不一定是最好的组合方式。PID控制器给出的控制量 是现在的误差 ——比例、过去的误差 ——积分、将来的误差 三者的加权线性组合。实践表明,三者的线性组合不一定是最好的组合方式,为了避免线性组合方式的缺陷就产生了花样繁多的“变增益PD控制器”。能否在非线性领域找到更合适的组合方式是值得探索的。

4.误差信号e的积分 的引入有很多负作用。大量工程实践表明,误差积分反馈的引入,使闭环变得迟钝,容易产生振荡,积分饱和引起的控制量饱和等。

针对PID的缺陷,ADRC的进行了算法改善:

跟踪微分器(TD)

针对e=v-y原始误差的不合理,在考虑控制目标和控制对象承受能力的约束下,安排过渡过程,避免出现误差过大导致的跟踪时间过长或超调。同时针对微分信号 噪声放大严重的问题,使用微分近似公式 来近似微分,传递函数的表达形式为: ,并令 无限接近于 可得所以这个微分器就是一个纯微分环节 s 与一个二阶系统双极点滤波器的乘积,这样可以降低噪声的放大效应。通过使用微分信号,控制系统可以更加敏感地响应输入信号的变化,并快速调整控制输出以减小输出与期望值之间的误差。微分控制可以提供更快的响应速度和更好的跟踪性能,特别是在输入信号有较快变化的情况下。对于跟踪控制,“更快”可以改成“最快”,这就需要采用“非线性跟踪微分器”:

对于二阶积分串联型系统 的最速反馈闭环系统为:

以简化的二阶积分器小车系统为例: 为位置x, 的导数 为速度v, 的导数即为加速度a,期望的位置,速度,加速度均为0,有:

sign是符号函数:

大于0时,小车以加速度-r运动,当 小于0时,小车以加速度r运动。

是根据匀速直线运动的运动学推导而来, —> ,期望最终速度 ,速度有正负号写作 ,最大加速度以参数r表示,当 时,说明到x=0处 ,要以加速度+r进行加速,以达到期望最终速度 ;当 时,说明到x=0处 ,要以加速度-r进行减速,以达到期望最终速度

送入输入信号 (期望的位置)得到:

对上式离散化可得

h是采样时间,减小h可以提高跟踪性能,但是也会放大噪声

由图可知离散系统进入稳态后会产生高频颤振,这说明连续函数的最优函数不再是该函数离散化后的最优函数,针对离散系统,设计最速综合函数fhan

离散化后的最速函数:

其中h是步长,r是根据过渡过程快慢的需要和系统的承受能力来决定的。

跟踪效果:

从图中可以看出跟踪阶跃或者正弦效果都是很好的。

扩张状态观测器(ESO)

根据测量到的系统输入(控制量)和系统输出(部分状态变量或状态变量的函数)来确定系统所有内部状态信息的装置就是状态观测器

对于二阶线性系统

写成标准形式

z为x观测器的估计值,Cz为y观测器的估计值,那么

称为经典状态观测器,选择合适的 矩阵的参数,矩阵 A -LC 稳定时, z (t)渐近地估计状态变量x(t)。根据系统方程(7)列出观测器的微分方程:

对于非线性系统:

和b为已知, 则其观测器可设计为:

但很多情况下 未知 ,那么把 当作扰动,并作为未知的被扩张状态变量

其观测器为:

如果函数 在系统输入u(t)的作用之下,变化不是很剧烈,那么适当选取参数 ,这个状态观测器的各状态变量 一般可以很好的跟踪原系统。但为了消除扰动w(t)的影响,采用非线性效应,把观测器方程(14)改造成

为了避免高频颤振现象的出现把 改成原点附近具有线性段的连续的幂次函数:

观测器写成离散的形式有:

参数 是由系统所用采样步长来决定的(不管什么样的对象,采样步长一样,都可以用相同的

对于ESO的参数整定方法,有一些经验公式:

可以看到最终观测器的输出收敛到实际输出。

非线性反馈控制器

有了跟踪微分器(TD)的过渡过程,可以利用过渡过程的误差信号 和误差微分信号 ,及根据误差信号生成的积分信号 ,实现PID控制:

然而这种线性组合不一定最好。大量仿真研究表明,采用 的适当非线性组合效果更好,通常采用的非线性组合有如下两种形式:

其中

由于ADRC具有扰动估计能力及较强的抗干扰性,所以无需依赖积分补偿来消除扰动的影响。故积分项可不添加,即:

将ESO估计的扰动 补偿到控制器的输出 上,b是控制器的增益,可得到以下两种形式:

最终跟踪微分器(TD),扩张状态观测器(ESO),非线性反馈控制器组成了ADRC算法:

与PID控制效果比较

跟踪效果对比

误差曲线对比

可以看到ADRC的超调量小于PID超调量,且控制误差小于PID控制误差。

附代码

% 跟踪微分器示例高频颤振

% 参数设置
r = 10;   % 常数r
h = 0.01;   % 步长h

% 初始化变量
N = 1000;   % 迭代次数
x1 = zeros(N, 1);   % x1(k)的存储数组
x2 = zeros(N, 1);   % x2(k)的存储数组
u = zeros(N, 1);   % u(k)的存储数组
f = zeros(N, 1);   % f的存储数组

% 初始状态
x1(1) = 0;
x2(1) = 0;

% 迭代计算
for k = 1:N-1
    % 计算控制信号u(k)
    u(k) = 1;   % 这里仅作为示例,可以根据需要修改为不同的输入信号
    
    % 计算跟踪微分器的输出f(k)
    f(k) = -r * sign(x1(k) - u(k) + x2(k)*abs(x2(k))/(2*r));
    
    % 更新状态方程
    x1(k+1) = x1(k) + h * x2(k);
    x2(k+1) = x2(k) + h * f(k);
end
u(k+1) = 1;

% 绘制跟踪效果
t = (0:N-1) * h;   % 时间轴
figure;
plot(t, x1, 'b', 'LineWidth', 1.5);
hold on;
plot(t, u, 'r--', 'LineWidth', 1.5);
xlabel('时间');
ylabel('跟踪器输出');
legend('x1(k)', 'u(k)');
title('跟踪微分器的跟踪效果展示');
grid on;

 

% 跟踪微分器示例正常跟踪
function main()
    % 控制参数
    r = 10;  % 调节参数
    h = 0.01;  % 采样时间步长

    % 初始化状态变量
    x1 = 0;  % 初始状态变量 x1
    x2 = 0;  % 初始状态变量 x2

    % 模拟阶跃响应
    t = 0:h:10;  % 时间范围
    u = 1 * ones(size(t));  % 阶跃输入信号
    y = zeros(size(t));  % 输出信号

    % 期望轨迹
    ref = ones(size(t));  % 期望轨迹

    % 循环计算状态变量和输出信号
    for k = 1:length(t)
        fh = fhan(x1 - u(k), x2, r, h);  % 计算控制量 fh
        x1 = x1 + h * x2;  % 更新状态变量 x1
        x2 = x2 + h * fh;  % 更新状态变量 x2
        y(k) = x1;  % 记录输出信号
    end

    % 绘制阶跃响应曲线和期望轨迹
    figure;
    plot(t, y, 'b', t, ref, 'r--');
    xlabel('时间');
    ylabel('输出信号');
    legend('跟踪曲线', '期望曲线');
    title('跟踪曲线与期望曲线');

end


function fh = fhan(x1, x2, r, h)
    d = r * h^2;
    a0 = h * x2;
    y = x1 + a0;
    a1 = sqrt(d * (d + 8 * abs(y)));
    a2 = a0 + sign(y) * (a1 - d) / 2;
    fsg1 = (sign(y + d) - sign(y - d)) / 2;
    a = (a0 + y - a2) * fsg1 + a2;
    fsg2 = (sign(a + d) - sign(a - d)) / 2;
    fhan = -r * ((a / d) - sign(a)) * fsg2 - r * sign(a);
    fh = fhan;
end

ESO状态估计

function adrc_eso_tracking()

    % 系统参数
    h = 0.01;            % 采样时间步长
    delta = 0.2;         % 死区参数
    alpha = 0.5;         % 非线性函数alpha参数
    beta01 = 10.5;        % 调节器参数
    beta02 = 6.2;
    beta03 = 5.8;
    bu = 1;            % 输入信号bu

    % 初始状态
    z1 = 0.5;
    z2 = 0;
    z3 = 0;
    t = 0;               % 时间
    freq = 1;          % 期望曲线的频率

    % 存储跟踪结果和期望曲线的向量
    z1_history = [];
    y_history = [];

    % ADRC-ESO控制器
    for k = 1:1000
        e = z1 - sin(freq * t);     % 计算误差,期望曲线为sin函数
        fe = fal(e, alpha, delta);
        fel = fal(e, 0.25, delta);

        z1 = z1 + h * (z2 - beta01 * e);
        z2 = z2 + h * (z3 - beta02 * fe + bu);
        z3 = z3 + h * (-beta03 * fel);

        t = t + h;                  % 更新时间

        % 保存当前z1值和目标值到历史记录中
        z1_history = [z1_history, z1];
        y_history = [y_history, sin(freq * t)];
    end

    % 绘制跟踪结果和期望曲线的图形
    figure;
    plot(1:length(z1_history), z1_history, 'b', 'LineWidth', 2);
    hold on;
    plot(1:length(y_history), y_history, 'r--', 'LineWidth', 2);
    hold off;
    xlabel('时间步长');
    ylabel('z1 / y');
    legend('观测状态', '实际状态');
    title('ADRC-ESO观测效果');

end

function output = fal(e, alpha, delta)
    if abs(e) > delta
        output = abs(e)^alpha * sign(e);
    else
        output = e / delta^(1 - alpha);
    end
end

 

参考