1. 二阶非线性ADRC控制器的工程实现
自抗扰控制器(ADRC)作为一种不依赖精确数学模型的控制方法,在工业控制领域展现出强大的鲁棒性。本文将基于Python实现一个离散化的二阶非线性ADRC控制器,针对典型的欠阻尼二阶系统进行控制。
1.1 被控对象特性分析
我们选取的测试对象是一个标准二阶系统,其传递函数为:
code复制G(s) = 1/(s² + 0.6s + 1)
这个系统具有以下特点:
- 阻尼比ζ=0.3,属于欠阻尼系统
- 自然频率ωn=1 rad/s
- 阶跃响应会有约37%的超调量
- 上升时间约1.5秒
传统PID控制器对这种系统往往需要精心调节参数才能获得满意的控制效果,而ADRC则通过独特的扰动估计和补偿机制,能够更鲁棒地处理这类控制问题。
1.2 ADRC核心架构解析
ADRC包含三个关键组成部分:
- 跟踪微分器(TD):生成过渡过程信号,避免设定值突变引起的超调
- 扩张状态观测器(ESO):估计系统状态和总扰动
- 非线性状态误差反馈(NLSEF):产生控制量
这种架构的优势在于将系统内部动态和外部扰动统一视为"总扰动",通过ESO实时估计并补偿,大大降低了对精确数学模型的依赖。
2. 离散化实现细节
2.1 采样时间选择
在离散化实现中,采样时间h的选择至关重要:
python复制self.h = 0.001 # 采样时间
选择依据:
- 根据香农采样定理,应远小于系统最小时间常数(本例约0.1s)
- 考虑实际控制器的计算能力
- 折中考虑控制精度和计算负荷
经验法则:采样频率应为系统带宽的5-10倍。对本系统,选择1kHz采样率是合理的。
2.2 跟踪微分器实现
跟踪微分器的离散化实现:
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)
其中fhan()是最速控制综合函数,其参数选择要点:
- r:决定跟踪速度,r越大跟踪越快但可能引起振荡
- h0:滤波因子,通常取(3-10)倍采样周期
2.3 扩张状态观测器设计
ESO是ADRC的核心,其离散化实现:
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
参数设计原则:
- beta系列参数构成观测器带宽
- 典型关系:β01:β02:β03 ≈ 1:3:5
- b是被控对象增益的估计值
2.4 非线性函数实现
ADRC中使用了两种关键非线性函数:
- fal()函数:
python复制def fal(self, e, alpha, delta):
if abs(e) > delta:
return abs(e)**alpha * np.sign(e)
else:
return e / (delta**(1-alpha))
参数说明:
- alpha:决定非线性强度(0<α<1)
- delta:线性区间阈值
- fhan()函数:
python复制def fhan(self, x1, x2, r, h):
d = r * h**2
a0 = h * x2
y = x1 + a0
a1 = math.sqrt(d * (d + 8 * abs(y)))
a2 = a0 + math.copysign((a1 - d)/2, y)
sy = (math.copysign(1, y + d) - math.copysign(1, y - d))/2
a = (a0 + y - a2) * sy + a2
sa = (math.copysign(1, a + d) - math.copysign(1, a - d))/2
return -r * (a/d - math.copysign(1, a)) * sa - r * math.copysign(1, a)
这是最速控制综合函数,能提供平滑快速的跟踪性能。
3. 参数整定方法与调试技巧
3.1 参数影响分析
-
跟踪速度因子r:
- 增大r可提高跟踪速度
- 但过大会导致控制量饱和或系统振荡
- 典型值范围:10-1000
-
ESO带宽参数β:
- β01决定基本观测速度
- β02、β03通常取β01的3倍和5倍
- 带宽越高,扰动估计越快,但对噪声更敏感
-
非线性参数α:
- 取值0-1之间
- 接近1时更接近线性
- 接近0时非线性更强
3.2 调试步骤建议
-
首先调整ESO参数:
- 从β01=100开始
- 按1:3:5比例设置β02=300,β03=1000
- 观察状态估计精度
-
然后调节跟踪微分器:
- 初始r=100
- h0=5h
- 观察跟踪速度和超调
-
最后微调非线性参数:
- α1=0.5,α2=0.25
- δ=0.01
- 根据响应曲线调整
3.3 抗饱和处理
实际工程中必须考虑执行器饱和问题:
python复制def control(self, target, current):
# ...原有计算...
if self.u > self.umax:
self.u = self.umax
elif self.u < self.umin:
self.u = self.umin
return self.u
同时应在ESO中加入抗饱和补偿,避免观测器发散。
4. 性能测试与结果分析
4.1 阶跃响应测试
设置目标值为1的阶跃信号,得到如下响应特性:
- 上升时间:约0.5秒
- 超调量:<5%
- 稳态误差:0
相比传统PID控制(超调约37%),ADRC展现出明显的优势。
4.2 抗扰动测试
加入幅值为0.2的sin(5t)扰动后:
- 输出波动幅度<0.01
- 完全抑制了低频扰动
- 对阶跃跟踪无影响
这验证了ESO出色的扰动估计和补偿能力。
4.3 鲁棒性测试
改变被控对象参数±30%:
- 保持原控制器参数不变
- 控制性能基本维持
- 仅轻微影响超调量
这表明ADRC对模型不确定性具有较强的鲁棒性。
5. 工程应用注意事项
5.1 噪声处理
实际系统中测量噪声会影响ESO性能:
- 增加前置滤波器
- 适当降低ESO带宽
- 调整fal()函数的δ参数
5.2 计算资源考虑
- 非线性函数计算较复杂
- 可考虑预先计算查找表
- 在资源受限平台可简化非线性函数
5.3 参数自适应
对于时变系统,可考虑:
- 在线调整b的估计值
- 根据运行状态自动调节ESO带宽
- 实现参数自整定算法
在实际项目中,我们通常先用这个基础版本验证算法可行性,然后根据具体应用场景进行优化和扩展。ADRC的强大之处在于其框架的灵活性,可以根据不同控制需求调整各部分结构和参数。