ADRC——ESO扩张状态观测器simulink实现(含代码)

2022/12/10改

我重新搭建了一个simulink模型文件,已上传网盘:(有问题请评论提出,有空会改正)

链接:https://pan.baidu.com/s/1EIfzICPp2XgwKr7Uhzv-aA 
提取码:2579

1、理论基础

        主要参考韩老的论文:《从PID技术到"自抗扰控制"技术》。

对于系统:

 这是一个常见的二阶系统,适用于牛顿-欧拉方程中,位置/速度及角度(姿态)/角速度的控制。

F=m \ddot x \\ \tau=J\dot w+w \times JW

上述皆可化成二阶系统(6)的形式。

        对于(6)式中的f(x_1,x_2,t),  通常为未知项:因为包含建模不准确性而引起的内部干扰和系统外部干扰,那么建立观测器的形式为:

 转化为离散形式(因为绝大多数实际控制系统为离散系统):

e_1=z_1-y\\ z_1(k+h)=z_1(k)+h*z_2-h*\beta_{01} e_1 \\ z_2(k+h)=z_2(k)+h*z_3-h*\beta_{02} fal(e_1,\alpha_1,\theta)+h*bu \\ z_3(k+h)=z_3(k)-h*\beta_{03} fal(e_1,\alpha_2,\theta)

其中:h为采样时间。fal函数为:
 

其中fal函数类似于一个低通滤波和一个变参滤波器的叠加,用于逼近e。

理解以上的知识之后即可在simulink下搭建仿真模型了。

2、simulink

1、先搭建这样一个二阶系统:类似于m=1的位置控制系统(F=ma):

\dot x_1=x_2 \\ \dot x_2=f(x_1,x_2.t)+F

其中 f(.)  为系统扰动。

 搭建模型如下(暂时没有加 f(.) )

x的状态反馈加了白噪。

2、搭建ESO

        根据上面的离散公式,建立matlab func,代码如下(代码和上面的公式一一对应):

function [z1_hat,z2_hat,z3_hat] = fcn(y,u)

h=0.001;
alpha1=0.5;
alpha2=0.3;

beta01=100;
beta02=2500;
beta03=12000;

delta=0.01;

persistent z1 z2 z3
if isempty(z1)  
    z1=y;
    z2=0;
    z3=0;
end

z1k=z1;
z2k=z2;
z3k=z3;

e1=z1-y;

z1=z1k+h*z2k-h*beta01*e1;
z2=z2k+h*z3k-h*beta02*fal(e1,alpha1,delta)+h*u;
z3=z3k-h*beta03*fal(e1,alpha2,delta);


z1_hat=z1;
z2_hat=z2;
z3_hat=z3;
end


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

采样时间为0.001s,注意将matlab仿真时长定为0.001s(定步长)。其余参数都是随便给的,没这么调。

模块写出来是这样的:

y为状态x的估计,u的输入F,输出为z1,z2,z3的估计。

3、将ESO加入控制系统中

参考韩老论文:

我们实现红色部分:

需要注意 接入ESO模块的u的位置以及扰动加入系统的位置。

memory模块避免代数环问题。

4、控制效果

首先是对x的控制,期望轨迹为一个sin曲线,跟踪效果较好(可以自行搭建不带ESO扰动补偿的控制系统进行对比,自行调整PID和ESO参数以达到较好效果)

其次是对扰动的估计:本次仿真扰动 f(.)。

 其估计效果也还可以。对x1和x1微分的估计效果应该都还可以。

5、总结

  1. ESO的matlab代码可以直接用,适当调整参数即可。
  2. ESO是ADRC的核心,是自抗扰的核心,常将ESO和神经网络,自适应控制等结合。
  3. ESO的滤波效果和TD(微分跟踪器)差不多。
  4. 最后,对韩老在控制领域和ADRC技术等领域的贡献致敬!

                

### ADRC 控制器离散化实现方法 ADRC(Active Disturbance Rejection Control,自抗扰控制)作为一种先进的控制策略,在处理复杂动态系统时表现出色。为了适应数字控制系统的需求,ADRC控制器通常需要进行离散化处理。 #### 1. 扩张状态观测器 (ESO) 的离散化 扩张状态观测器ADRC的核心组件之一,用于实时估计系统的总扰动。其连续时间模型可以表示为: \[ \dot{\hat{x}} = A\hat{x} + B(u + f(t)) + L(y - C\hat{x}) \] 在离散化过程中,采用零阶保持法或Tustin变换将上述方程转换为差分方程形式。假设采样时间为\( T_s \),则离散化的ESO表达式如下所示[^1]: ```python def discrete_ESO(x_hat, u, y, A, B, C, L, Ts): """ 计算离散化后的扩展状态观察器输出 参数: x_hat -- 当前时刻的状态估计值 u -- 输入信号 y -- 输出测量值 A,B,C,L-- 系统矩阵 Ts -- 采样周期 返回: next_x_hat -- 下一时刻的状态估计值 """ # 使用欧拉向前差分离散化 next_x_hat = x_hat + Ts * (A @ x_hat + B*(u+f(t)) + L@(y-C@x_hat)) return next_x_hat ``` #### 2. 跟踪微分器(TD)的离散化 跟踪微分器的作用是在不影响原系统特性的前提下平滑输入变化并提供可靠的导数计算。对于TD部分,同样可以通过数值积分的方法将其转化为适合计算机执行的形式[^2]。 ```python def discrete_TD(r, h, alpha, beta, Ts): """ 实现离散化的跟踪微分器 参数: r -- 参考轨迹 h,beta -- TD参数 alpha -- 平滑因子 Ts -- 采样间隔 返回: z -- 追踪输出及其各阶导数组成的向量 """ # 初始化变量z=[r,r',...,r^(n)] n = len(alpha)-1 z = np.zeros((len(alpha),)) for i in range(n,-1,-1): if i==0: z[i]=(alpha[i]*Ts*z[i]+h*r)/(beta[i]*Ts+h) else: z[i]=alpha[i]*(z[i-1]-z[i])+beta[i]*z[i] return z ``` #### 3. 非线性状态误差反馈(NLESO) 非线性状态误差反馈机制旨在提高系统的鲁棒性和响应速度。该环节的设计基于李雅普诺夫稳定性理论,并引入了非线性项以增强对不确定因素的抑制能力。具体实现方式取决于所选的具体应用场景和技术路线[^3]。 ```python def NLESF(e, b0, k1, k2): """ 构建非线性状态误差反馈律 参数: e -- 状态偏差 b0,k1,k2-- 增益系数 返回: uf -- 最终控制作用力 """ uf = -(k1*e[0]+k2*np.sign(e[0]))/(b0+abs(e[0])) return uf ``` 综上所述,通过对各个子模块分别实施离散化操作,最终构建起完整的离散型ADRC架构。值得注意的是,在实际应用中还需要考虑诸如量化噪声、有限字长效应等因素的影响,因此建议结合具体情况调整算法细节[^4]。
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值