资讯动态

自抗扰控制结合迭代学习:压电执行器迟滞非线性补偿策略

发布时间:2026/9/16 16:36:14 来源:尧图企业网站定制
简介面向自动控制领域中研究迟滞非线性系统的工程师和研究生这份资源提供将自抗扰控制ADRC与迭代学习控制ILC相结合的MATLAB实现用于解决迟滞模型带来的跟踪精度下降与扰动估计难题。压缩包内共2个文件均为.m脚本分别对应基于模型逆的ADRC与D型迭代学习控制方案代码紧凑但结构完整便于在此基础上扩展参数或对比不同补偿策略。包体大小为1KB重点展示核心控制逻辑。已有468人学习下载适合正在学习非线性ADRC、迟滞补偿或迭代控制应用的读者。通过运行两个脚本可直观观察ESO对系统状态的估计效果以及模型逆补偿对迟滞非线性的抑制作用帮助理解ADRC与ILC结合时控制器参数调整和收敛性能变化为论文写作或课程设计提供可直接运行的示例。1. 迟滞非线性碰到 ADRC为什么跟踪还差一截压电陶瓷定位台、磁致伸缩驱动器这类执行器在正弦扫描时正行程和反行程的输入输出曲线不重合形成一条滞回环。你给同样的电压上升时和下降时位移不一样闭环里表现为明显的相位滞后和零点附近的平顶畸变。PID 压得住稳态却压不住这个动态环路误差这时候很多人会转向 ADRC指望扩张状态观测器把迟滞当成扰动一起处理。结果呢跟踪误差比 PID 小一半但曲线在峰谷附近依然有规律的凹陷。原因在于迟滞不是慢变扰动它和输入方向、速率强相关是典型的与状态耦合的非线性。ADRC 的 ESO 能估计总扰动但估计能力受观测器带宽限制而迟滞分量在每次轨迹上还呈现出重复性。既然误差在每次迭代都长成差不多同一个形状迭代学习控制就能把这一部分记为“已知偏差”用前馈修正补掉。这篇文章把迟滞建模、韩京清提出的 ADRC 核心构成、以及迭代控制在同一条 ADRC 跟踪链路上串起来讲从模型选型到参数整定再到误差收敛判据给一套可以直接落到 Python 仿真的做法。适合做压电、液压、精密运动控制的工程师也适合把 ADRC 用在带非线性执行器强耦合场景的研究生。2. 迟滞模型选型Bouc-Wen 与 PI 的分工和辨识2.1 三种常用迟滞模型怎么选迟滞建模绕不开三个名字Preisach、Bouc-Wen、Prandtl-Ishlinskii。它们的数学形式和用途差异很大选错模型会让后续补偿策略跑偏。实际工程里我一般按下面这张表做取舍。模型数学形式在线辨识难度逆补偿适用性典型场景Preisach双重积分加权回环算子高需要大量离线数据差求逆困难磁材料仿真、精度验证Bouc-Wen一阶微分方程 内状态 z中4~6 参数一般多作为被控对象控制系统仿真、状态观测器设计Prandtl-Ishlinskii多个 play 算子的加权叠加低线性最小二乘即可强解析逆可求压电执行器前馈补偿、迭代学习选型的判断标准很简单如果你要的是“仿真里有一个足够真实的迟滞被控对象”用 Bouc-Wen 最顺手微分方程可以直接塞进控制仿真循环如果你要的是“给执行器加一个可计算的前馈逆补偿”用 PI 模型因为它的逆模型还是 PI 结构权重和阈值可以解析计算在线辨识也便宜。Preisach 精度高但工程代价太大除非做材料级仿真否则不推荐作为控制方案的首选。2.2 Bouc-Wen 迟滞模型把滞回写成微分方程Bouc-Wen 把迟滞输出拆成线性项和滞回子状态两部分。子状态 z 的演化受输入速率方向的调制所以天然具备回环特性。公式写出来是y k_u · u − zdz/dt A·du/dt − β·|du/dt|·|z|^(n−1)·z − γ·(du/dt)·|z|^n其中 y 是执行器输出位移u 是控制输入z 是滞回状态k_u 是线性刚度系数A、β、γ、n 控制回环的幅值、胖瘦和光滑度。注意输出里是减号z 越大输出损失越大这是模型直观对应“磁场滞后于场强”的物理现象。这个模型有个好处它是一阶微分方程不需要记录完整输入历史仿真时状态变量只有 z 一个非常适合放进控制回路里做实时测试。下面给出一个可直接运行的 Python 仿真片段用欧拉法做数值积分模拟正弦电压驱动下的迟滞输出import numpy as np def bouc_wen_step(u, du, z_prev, dt, params): Bouc-Wen 迟滞子状态一步更新 参数说明: u 当前控制输入 du 输入变化率 z_prev 上一时刻滞回状态 dt 采样周期 params 含 A, beta, gamma, n 的参数字典 dzdt (params[A] * du - params[beta] * np.abs(du) * np.abs(z_prev)**(params[n] - 1) * z_prev - params[gamma] * du * np.abs(z_prev)**params[n]) z z_prev dt * dzdt y params[k_u] * u - z return y, z # 参数组无量纲化后的压电定位台k_u 是线性增益系数 params {A: 1.0, beta: 0.5, gamma: 0.3, n: 1, k_u: 1.2} dt 1e-4 t np.arange(0, 2, dt) u 10 * np.sin(2 * np.pi * 1.0 * t) # 1 Hz 正弦扫描 z 0.0 y np.zeros_like(u) for i in range(len(t)): du (u[i] - u[i - 1]) / dt if i 0 else 0.0 y[i], z bouc_wen_step(u[i], du, z, dt, params)这段代码核心是 dzdt 的三项分解A·du 是驱动项负责让滞回状态跟随输入运动方向β 项带绝对值保证回环转折处平滑γ 项控制滞回环在零点附近的饱和度。仿真时 du 用前向差分近似采样周期 dt 要至少比输入最高频率高 50 倍以上否则 dzdt 数值积分误差会表现为回环抖振。参数 n1 是工程里最常见的取值n 大于 1 时回环顶部会变尖但辨识难度显著上升。2.3 PI 模型与最小二乘权重辨识PI 模型用一组 play 算子的加权和表示迟滞。每个 play 算子是一个带记忆的滞回门限函数权重 w_i 是非负的阈值 r_i 决定算子宽度。输出形式是y(t) Σ w_i · H_{ri} u逆模型依然保持 PI 结构所以做前馈补偿非常自然你想让输出走一条直线就先把参考轨迹送给逆 PI 模型生成预畸变的控制电压。PI 模型的权重辨识是线性问题用最小二乘就能解。采集一组覆盖工作范围的输入输出数据后构造算子矩阵然后求解非负最小二乘即可。因为权重要满足物理上的无源性不能出现负值所以用 scipy.optimize.nnls 而不是普通 lstsq。提示PI 模型补偿的是静态迟滞回环。输入频率升高后回环会变宽、形状偏移那是动态迟滞和蠕变效应PI 只靠权重预补偿压不住。高频场景需要在 ADRC 侧留足带宽余量或者把 ILC 的迭代补偿放在前馈通道上这个在第 4 章展开。PI 模型的在线辨识成本是三种模型里最低的韩京清提出的 ADRC 核心构成里ESO 负责估计未建模部分PI 逆模型只需要补偿掉大部分——从工程角度讲模型补偿讲究“够用”讲究精度会拖慢开发节奏。我们的策略是Bouc-Wen 写进被控对象PI 做静态前馈ADRC 收尾抹平残差迭代控制处理重复性误差。3. 非线性 ADRC 扩张状态观测器的设计与跟踪链路3.1 韩京清 ADRC 的四个核心构件非线性 ADRC 指的不是单纯把误差做非线性变换而是韩京清提出的那套完整结构跟踪微分器、扩张状态观测器、非线性状态误差反馈、扰动补偿。跟踪微分器专门处理参考信号解决“参考突变导致执行器饱和”的问题扩张状态观测器把未建模动态和外部扰动合并成一个扩张状态进行估计非线性状态误差反馈用的是 fal 函数在误差大时用低增益避免超调误差小时用高增益提高稳态精度。这套结构和 PID 最本质的区别在于非线性 ADRC 对模型依赖度更低它不需要知道迟滞的精确方程只需要知道执行器增益数量级 b0剩下的全装进总扰动。扩张状态观测器是整套结构的核心它的输入是控制量 u 和被控对象输出 y输出三个状态z1 跟踪输出z2 跟踪输出速度z3 跟踪总扰动。这个 z3 就是我们用来对抗迟滞的关键。迟滞非线性任何时候都是可观测的总扰动状态的一部分只要 ESO 带宽够它就能把迟滞的相位滞后“看进来”。3.2 迟滞被并入总扰动的合理性很多人问迟滞是有记忆的非线性直接并进总扰动不会被“记住”吗答案是 ESO 里的 z3 每一拍都在重新估计它跟随的是当前时刻的总扰动力不是记忆里的某个值。Bouc-Wen 的 z 状态是动态变化的ESO 观测的是动态变化的合成效果。缺点也有ESO 的估计带宽有限迟滞产生的扰动若含有高频分量估计不过来的部分就会残余在跟踪误差里。这个残余量在固定参考轨迹下是重复性的正好成为迭代控制要处理的对象。所以迟滞并进总扰动不是“掩盖问题”而是先让 ADRC 解决大部分把剩下的重复残差交给 ILC。3.3 离散 NLADRC 完整实现与参数整定工程里常见做法是直接跳过连续域推导在采样周期 T 固定的前提下按离散形式写参数也更直观。一个完整的离散非线性 ADRC 控制器按执行顺序包含参考跟踪、ESO 观测、非线性误差反馈、扰动补偿四步。直接给可运行的代码框架def fal(e, alpha, delta): 非线性幂次函数小误差线性化大误差保持幂次特性 if abs(e) delta: return abs(e)**alpha * np.sign(e) return e / (delta**(1 - alpha)) def adrc_loop(y_meas, u_prev, v_ref, state, dt, p): 离散化非线性 ADRC 一步 状态结构: [z1, z2, z3, v1, v2] p 中需包含: b0, beta01, beta02, beta03, kp, kd, alpha, delta, r_adrc z1, z2, z3, v1, v2 state # 1. 跟踪微分器安排参考过渡过程抑制超调 e_v v_ref - v1 v2 v2 dt * (-p[r_adrc] * fal(e_v, 0.5, dt)) v1 v1 dt * v2 # 2. 扩张状态观测器用输出估计状态与总扰动 e_eso z1 - y_meas z1 z1 dt * (z2 - p[beta01] * e_eso) z2 z2 dt * (z3 - p[beta02] * fal(e_eso, 0.5, p[delta]) p[b0] * u_prev) z3 z3 dt * (-p[beta03] * fal(e_eso, 0.25, p[delta])) # 3. 非线性状态误差反馈 e1 v1 - z1 e2 v2 - z2 u0 p[kp] * fal(e1, 0.5, p[delta]) p[kd] * fal(e2, 0.5, p[delta]) # 4. 扰动补偿控制量除以 b0 并扣除总扰动 u (u0 - z3) / p[b0] return u, [z1, z2, z3, v1, v2]代码里值得解释的关键参数b0是控制通道增益估计值它不要求精确等于 Bouc-Wen 模型里的 k_u差个 30% 以内 ESO 都能补回来这是 ADRC 最实用的特性beta01/beta02/beta03是 ESO 增益按照带宽 ω_o 设计时大致取3ω_o, 3ω_o², ω_o³工程上还会再乘一个 1.5 到 2 的系数补偿离散化损失alpha取 0.5 和 0.25 是韩京清原文的经验值分别对应 ESO 状态和总扰动通道delta是 fal 函数的线性区间边界一般取 0.01 到 0.1太小会让非线性陷入抖振太大则退化成线性高增益。fal函数的核心逻辑是误差小于 delta 时用线性段避免 0 附近的增益无穷大误差大于 delta 时用幂次实现小增益大误差、大增益小误差的平滑过渡。ESO 带宽 ω_o 是最重要的整定参数。它决定了 z3 对总扰动的估计速度也决定了能否压住迟滞回环的扭曲部分。建议初始取对象闭环带宽的 10 倍左右然后观察 z3 波形如果 z3 里能看到明显的迟滞回环形状说明估计是有效的如果 z3 波形平缓说明迟滞进了未观测的高频段跟踪误差会在峰谷处加大。所有 ADRC 参数里b0 的符号不能选反正作用执行器就是正数增益给大时先动 beta03 而不是 kp因为 z3 通道直接影响稳态残余。4. 迭代控制与 ADRC 并联重复轨迹下的误差收敛4.1 什么场景适合在 ADRC 外面加 ILC迭代学习控制适合的是同一个轨迹一遍遍重复的动作比如半导体制造里的压电平台做晶圆扫描一个批次内轨迹完全相同迟滞造成的误差形状也几乎一致。上一遍的误差本身就是这一遍可以学习的“已知信息”这正是 ADRC 处理不了而 ILC 擅长的部分ADRC 处理的是不依赖历史的当前扰动ILC 处理的是依赖历史路径的重复性偏差。两者不冲突ADRC 在回路内做实时补偿ILC 在回路外做逐次修正。如果一个工程里轨迹每次扫描方向不同、幅值随机ILC 没有可学习的重复信息此时继续加迭代控制只会把上一遍的错误叠加进这一遍造成误差发散而非收敛。判断标尺就一条每轮轨迹起始状态一致且参考轨迹一致误差序列才具备可学习性。4.2 反馈打底、前馈修正的并联结构常见的组合方式有串联和并联两种。串联结构是先把 ADRC 看作内环ILC 放在参考信号通路上做参考整形缺点是整形的信号经过 ADRC 的跟踪微分器会被二次改造学习效果打折。并联结构更稳妥ILC 的输出直接叠加在 ADRC 控制量之前形成前馈修正。此时 ILC 面对的是一个已经包含 ADRC 反馈作用的等价对象收敛判据更直观。从工程实践看我一般先让 ADRC 单独闭环跑一遍记录误差序列再开启 ILC确认误差范数随迭代次数下降而不是一上来就同时调两套参数。4.3 P 型迭代更新律与 Q 滤波器ILC 的更新律写成离散形式是u_ff k1 Q(q) · (u_ff k L · e k )其中 k 是迭代次数索引t 是单次轨迹内的时间索引L 是学习增益Q 是 Q 滤波器作用于整个更新信号。P 型 ILC 指的是只用误差本身不用误差导数对迟滞这种与位置相关的非线性P 型已经足够。Q 滤波器是本节的真正重点没有 Q 滤波的 ILC 会在高频段放大测量噪声几轮迭代后控制量高频振荡加 Q 滤波相当于给学习带宽设上限。实现一个带 Q 滤波的离线迭代学习核心步骤是记录每轮误差、滤波后再累加from scipy.signal import butter, filtfilt def run_ilc(plant_func, r, iterations6, L0.6, cutoff15, dt1e-4): 并联 P 型 ILCplant_func 是离散 ADRC 闭环的响应函数 r 参考轨迹序列 L 学习增益 cutoff Q 滤波器截止频率 u_ff np.zeros_like(r) # 零相位 Butterworth 滤波器避免 Q 滤波引入相位滞后 b, a butter(2, 2 * cutoff * dt, btypelow) for k in range(iterations): y plant_func(r, u_ff) # ADRC 闭环响应 e r - y # 当前迭代误差 e_f filtfilt(b, a, e) # 零相位 Q 滤波 u_ff u_ff L * e_f # 学习律累加 return u_ff代码逻辑要点每一次迭代先让整个 ADRC 闭环带着当前的前馈修正跑完整个轨迹等轨迹结束后才更新 u_ff这属于离线批次 ILC工程上容易实现且稳定性好。filtfilt 是零相位滤波和普通 lfilter 的区别是它先正向再反向各滤一遍解决 ILC 中最忌讳的相位失真。学习增益 L 取值在 0.3 到 0.8 之间比较安全太大对模型误差敏感两轮就发散太小要迭代十几轮才看到效果。迭代收不收敛有一个可量化的判据若参考轨迹的频带宽度为 ω_r则截止频率 cutoff 至少取 2 倍到 3 倍 ω_r并且要求多个频点满足|Q(jω) · (1 − L · P_cl(jω))| 1P_cl 是 ADRC 闭环等价对象的频率响应。如果违反这个条件误差会在某个频段振荡放大而不是逐次衰减。实际观察曲线时有一个特征误差范数前两轮下降很快第三轮出现小反弹多半是 Q 滤波器设置过宽把噪声频段也学进去了。关于 ADRC 闭环等价对象 P_cl有一点经常被忽略它包含了 ESO 的观测带宽影响而不是简单的执行器模型所以叠加上 ILC 之后ESO 带宽不足造成的相位滞后部分也能通过学习修正从本质上弥补了 ADRC 在记忆性非线性上的短板。5. 验证和调参用误差曲线判断该动哪个增益5.1 把跟踪误差拆成周期重复项和随机扰动项迟滞场景下开启 ILC 之后最容易产生的一个现象是误差曲线变得非常诡异有的频点降下去了有的频点反而涨上来。这时候不要急着调增益先把误差序列拆开看。在一样的轨迹下连续跑四次如果四次的误差几乎重合说明误差主导成分是重复性的这部分应该交给 ILC 或者前馈补偿如果多次误差波动随机、单次曲线毛糙那是传感器噪声和 ESO 带宽受限的混合表现加大迭代增益只会让下一轮更毛糙。做法上可以保存每轮误差数组按点取平均得到重复项用总误差减去重复项得到随机项比较两者能量占比。占比超过 30% 的时候优先检查测量通道的滤波是否到位而不是继续调 ILC 学习增益。5.2 三个典型症状对应的参数动作误差症状大概率原因优先调整对象整体相位滞后、峰谷处误差凹陷ESO 带宽不足增大 beta01/beta02/beta03观察 z3 波形迭代开始时误差下降正常第三轮后振荡ILC 学习增益偏大或 Q 滤波过宽减小 L 到 0.3cutoff 减半稳态误差小但有高频抖振fal 函数 delta 过小delta 调到 0.05 以上或改用线性 ESOESO 带宽判断有个直观方法单独把 z3 状态和实际输出误差画在同一张图里如果 z3 的相位显著落后于误差的相位变化说明观测器跟不上扰动变化加大 beta03 比加大 kp 更有效。这里动增益有个顺序原则先调大 beta03 两倍看 z3 是否跟上若 z3 出现明显振荡说明 ESO 处于临界过阻尼换回原来数值改调 delta。ILC 发散时不要靠调 L 硬压先把 Q 滤波器 cutoff 降到参考最高频率的 3 倍确认不再振荡后再逐步往上抬。5.3 一套从零起步的整定顺序把整套系统部署到新设备上时我习惯按固定顺序推进先用 PI 逆模型离线补偿迟滞把开环回环尽量掰直然后切换到 ADRC用线性 ESO 参数先闭环取 b0 等于辨识得到的 k_ubeta 按 3 倍带宽设置确认闭环稳定后再把 ESO 的误差通道换成 fal 非线性函数观察 z3 跟踪速度最后在重复轨迹下开启 ILC从 L0.3、cutoff3 倍最高参考频率开始每轮记录误差范数。这套顺序保证每次只引入一个变量出问题时能立刻定位是哪一层引入的而不至于拖到整条链路都发散掉。验证收敛性的最后一招是记录相邻两轮前馈修正量的变化幅度。当修正量从“可见的锯齿形”变成“几乎为一条直线”时说明迭代学习已经饱和再增加迭代次数不会带来实质收益此时该做的事是把 ILC 冻结住、只保留最后学习到的那份前馈信号作为固定补偿保留在通道里之后控制系统就退化为一个 ADRC 加固定前馈的常规结构既保留了迟滞补偿效果又避免迭代过程在扰动突变的批次中引入错误修正。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价