自抗扰控制器(ADRC)作为一种不依赖精确数学模型的控制策略,在工业现场应用中展现出独特的优势。本文将基于一个典型的二阶系统案例,详细解析非线性离散ADRC的实现过程,从理论框架到代码实现,再到参数整定技巧,为工程师提供可直接复用的实战方案。
我们选取一个欠阻尼二阶系统作为控制对象,其传递函数为:
code复制G(s) = 1/(s² + 0.6s + 1)
这类系统常见于机械振动、电力电子等场景,具有以下特征:
传统PID控制器对此类系统往往需要精细调参才能避免超调,而ADRC通过独特的扰动估计机制,能够实现更鲁棒的控制效果。
ADRC的架构包含三个关键组成部分:
跟踪微分器(TD):
扩张状态观测器(ESO):
非线性状态误差反馈(NLSEF):
python复制class NonlinearADRC:
def __init__(self):
self.h = 0.001 # 采样时间(s)
self.r = 100 # 跟踪速度因子
self.h0 = 5*self.h # 滤波因子
# ESO参数
self.beta01 = 100 # 观测器带宽系数1
self.beta02 = 300 # 观测器带宽系数2
self.beta03 = 1000 # 观测器带宽系数3
self.b = 0.5 # 控制增益估计值
# NLSEF参数
self.alpha1 = 0.5 # 非线性因子1
self.alpha2 = 0.25 # 非线性因子2
self.delta = 0.01 # 线性区间阈值
# 状态初始化
self.x1 = 0.0 # TD状态1
self.x2 = 0.0 # TD状态2
self.z1 = 0.0 # ESO状态1
self.z2 = 0.0 # ESO状态2
self.z3 = 0.0 # ESO状态3(总扰动)
self.u = 0.0 # 控制输出
关键参数说明:
python复制def eso(self, y):
e = self.z1 - y # 观测误差
fe1 = self.fal(e, 0.5, self.delta) # 非线性处理
fe2 = self.fal(e, 0.25, self.delta)
# 状态更新
self.z1 += self.h * (self.z2 - self.beta01 * e)
self.z2 += self.h * (self.z3 - self.beta02 * fe1 + self.b * self.u)
self.z3 += self.h * (-self.beta03 * fe2)
return self.z1, self.z2, self.z3
def fal(self, e, alpha, delta):
"""非线性函数"""
if abs(e) > delta:
return abs(e)**alpha * np.sign(e)
else:
return e / (delta**(1-alpha))
ESO工作原理:
python复制def control(self, target, current):
# 跟踪微分器
self.x1 += self.h * self.x2
self.x2 += self.h * self.fhan(target - self.x1, self.x2, self.r, self.h0)
# 状态误差
e1 = self.x1 - self.z1 # 位置误差
e2 = self.x2 - self.z2 # 速度误差
# 非线性反馈
u0 = self.fhan(e1, e2, self.r, self.h0)
self.u = (u0 - self.z3) / self.b # 扰动补偿
return self.u
def fhan(self, x1, x2, r, h0):
"""最速控制综合函数"""
d = r * h0**2
a0 = h0 * x2
y = x1 + a0
a1 = np.sqrt(d*(d+8*abs(y)))
a2 = a0 + np.sign(y)*(a1-d)/2
sy = (np.sign(y+d)-np.sign(y-d))/2
a = (a0+y-a2)*sy + a2
sa = (np.sign(a+d)-np.sign(a-d))/2
return -r*(a/d-np.sign(a))*sa - r*np.sign(a)
控制律特点:
| 参数 | 影响范围 | 调整建议 | 典型取值 |
|---|---|---|---|
| r | 跟踪速度 | 根据响应需求调整 | 10-1000 |
| β01 | 观测器带宽 | 按1-3-5比例设置 | 50-500 |
| β02 | 观测器带宽 | β02≈3β01 | 150-1500 |
| β03 | 观测器带宽 | β03≈5β01 | 250-2500 |
| α1 | 非线性强度 | 0.3-0.8之间调整 | 0.5 |
| α2 | 非线性强度 | 通常取α1/2 | 0.25 |
| δ | 线性区间 | 取测量噪声的2-5倍 | 0.001-0.1 |
初始化ESO参数
调整跟踪速度r
优化非线性参数
验证抗扰性能
调试口诀:
观测带宽定基础,
跟踪速度决快慢,
非线性度控形态,
扰动补偿保鲁棒。
传感器噪声:
量化噪声:
python复制def control_with_antiwindup(self, target, current, u_max):
u = self.control(target, current)
# 抗饱和处理
if abs(u) > u_max:
u = np.sign(u) * u_max
# 观测器抗饱和补偿
self.z3 += self.h * self.b * (u - self.u)
self.u = u
return u
观测器发散:
控制振荡:
稳态误差:
python复制def adaptive_adrc(self, y, target):
# 根据误差自动调整r值
e = abs(target - y)
if e > 0.5:
self.r = 200
elif e > 0.1:
self.r = 100
else:
self.r = 50
return self.control(target, y)
定点数优化:
执行时间优化:
在实际工程应用中,ADRC展现出了对模型不确定性极强的鲁棒性。我曾在一个伺服电机控制项目中采用此方案,相比传统PID,在负载突变工况下将调节时间缩短了60%,且无需精确的电机参数辨识。这种"黑箱"式的控制哲学,正是其在实际工程中的价值所在。