本文整理了自抗扰控制ADRC的由来及其原理,主要参考韩京清老师《自抗扰控制技术》。
PID控制:
PID(Proportional-Integral-Derivative)控制是一种常见的反馈控制算法,被广泛应用于工业过程控制和自动化系统中。虽然PID控制具有很多优点,但也存在一些缺点,包括以下几点[参考自抗扰控制技术]:
1.直接以e=v-y的方式产生原始误差不太合理,这里控制目标v是在过程中可以“跳变”,但是对象输出y的变化都有惯性,不可能跳变,要求让缓变的变量y来跟踪能够跳变的变量v,本身就不合理。
2.产生误差信号e的微分信号
3.线性组合不一定是最好的组合方式。PID控制器给出的控制量
4.误差信号e的积分
针对PID的缺陷,ADRC的进行了算法改善:
跟踪微分器(TD)
针对e=v-y原始误差的不合理,在考虑控制目标和控制对象承受能力的约束下,安排过渡过程,避免出现误差过大导致的跟踪时间过长或超调。同时针对微分信号
对于二阶积分串联型系统
以简化的二阶积分器小车系统为例:
sign是符号函数:
当
送入输入信号
对上式离散化可得
h是采样时间,减小h可以提高跟踪性能,但是也会放大噪声
由图可知离散系统进入稳态后会产生高频颤振,这说明连续函数的最优函数不再是该函数离散化后的最优函数,针对离散系统,设计最速综合函数fhan
离散化后的最速函数:
其中h是步长,r是根据过渡过程快慢的需要和系统的承受能力来决定的。
跟踪效果:
从图中可以看出跟踪阶跃或者正弦效果都是很好的。
扩张状态观测器(ESO)
根据测量到的系统输入(控制量)和系统输出(部分状态变量或状态变量的函数)来确定系统所有内部状态信息的装置就是状态观测器。
对于二阶线性系统
写成标准形式
z为x观测器的估计值,Cz为y观测器的估计值,那么
称为经典状态观测器,选择合适的
对于非线性系统:
当
但很多情况下
其观测器为:
如果函数
为了避免高频颤振现象的出现把
观测器写成离散的形式有:
参数
对于ESO的参数整定方法,有一些经验公式:
可以看到最终观测器的输出收敛到实际输出。
非线性反馈控制器
有了跟踪微分器(TD)的过渡过程,可以利用过渡过程的误差信号
然而这种线性组合不一定最好。大量仿真研究表明,采用
其中
由于ADRC具有扰动估计能力及较强的抗干扰性,所以无需依赖积分补偿来消除扰动的影响。故积分项可不添加,即:
将ESO估计的扰动
最终跟踪微分器(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
参考
- 韩京清.自抗扰控制技术[J].前沿科学,2007(01):24-31.
- 韩京清.从PID技术到“自抗扰控制”技术[J].控制工程,2002(03):13-18.
- https://zhuanlan.zhihu.com/p/510927934
- https://zhuanlan.zhihu.com/p/515622797
评论(2)
您还未登录,请登录后发表或查看评论