☰
自抗扰控制(ADRC)核心原理与工程实践:从PID到扰动补偿
2026/10/22 2:55:44 网站建设 项目流程

简介:针对传统PID难以应对复杂扰动与非线性场景的问题,资源包以自抗扰控制(ADRC)、跟踪微分器(TD)和扩张状态观测器(ESO)为核心,提供个人学习向的MATLAB/Simulink实现,适合自动控制专业学生、算法工程师及需提升系统鲁棒性的研发人员。压缩包共18个文件,11个.m脚本含ADRC、LADRC、PID控制器等算法源码,2个.slx仿真模型对应伺服关节与永磁同步电机控制,另有README和zbak备份,总大小仅68KB,轻量且便于查阅。目前已有92人学习下载。借助源码与模型,可快速理解ADRC扰动估计与补偿、TD跟踪微分提取及ESO状态观测原理,通过修改参数对比传统PID与先进算法效果,为后续改进或工程落地提供可复用的基础。

1. 从 PID 到自抗扰控制:为什么你的闭环总是在超调与抗扰之间反复妥协

做过运动控制或过程控制的人几乎都有过这种经历:PID 增益往上调,跟踪是快了几十毫秒,可阶跃响应顶部那道超调也跟着窜上去,负载一变化系统就开始振荡;增益往回压,超调是没了,外部扰动一来恢复得又慢吞吞。这个矛盾不是你参数没调好,而是经典 PID 的结构决定的——它只能对“误差”做比例、积分、微分运算,却无法判断这个误差究竟来自参考值变化,还是来自负载扰动、模型失配、摩擦等未知因素。自抗扰控制(Active Disturbance Rejection Control,ADRC)换了一种思路:既然扰动测不准,那就把它当作一个额外状态,用扩张状态观测器在线估出来,再直接补偿掉。配合跟踪微分器安排参考过渡过程,控制器可以在几乎不超调的前提下获得远高于常规 PID 的抗扰能力。这篇笔记完整拆解跟踪微分器、扩张状态观测器、参数整定与工程踩坑,目标是让你看完就能在自己的仿真或设备上把 ADRC 跑起来,并且知道它什么时候比 PID 强、什么时候又确实不如 PID。

2. 自抗扰控制的三件套:跟踪微分器、扩张状态观测器与扰动补偿

2.1 跟踪微分器:为什么你的阶跃给定不该是一条直线

先看一个最基本的问题:经典 PID 里,阶跃给定瞬间加到系统上,误差一下子就是满幅。比例项立刻给出很大的控制量,系统拼命往目标冲,到了目标附近速度还没降下来,于是越过目标形成超调。传统做法是给给定信号加一个一阶惯性滤波,让目标“软着陆”,但一阶惯性本身会滞后相位,而且滤波时间常数一改,跟踪性能也跟着变。而跟踪微分器(Tracking Differentiator,TD)解决的不只是“软化给定”,它顺便还给你一条干净的微分信号,不会像直接对误差求差分那样把噪声放大得没法用。

TD 的核心结构是两个相互耦合的状态:一个跟踪输入信号本身(v1),一个跟踪输入信号的微分(v2)。它用尽可能快的速度让 v1 逼近你给的参考信号,同时输出一条不会导致系统振荡的过渡轨迹。工程里最常用的离散形式是:

v1 += v2 * h; v2 += fhan(v1 - v, v2, r0, h0) * h;

这里的 fhan 是最速综合函数,r0 是加速度上限,h0 是滤波因子。r0 越大,v1 到达参考值的速度越快,但过渡过程的坡度也越陡;h0 取稍大于仿真步长时能有效抑制微分噪声。说人话就是:你把阶跃信号交给 TD,它给你一条“S 形”的平滑曲线作为实际控制目标,系统的输出沿着这条曲线走,自然就不会在起始点形成冲击。

选型建议:如果你的执行器是伺服电机这类快速机构,r0 可以取大一些;如果是热工过程这类大惯性对象,r0 就得克制,否则过渡过程被安排得太快,执行器照样饱和。TD 的意义不是“让参考值变慢”,而是让参考值的变化速率与执行机构的能力匹配。

2.2 扩张状态观测器:把“总扰动”变成第三个可测状态

扩张状态观测器(Extended State Observer,ESO)是自抗扰控制里最核心、也最值得你花时间理解的模块。它的思路非常直接:把系统的未建模动态、参数摄动、外部负载扰动全部折算成一个“总扰动”项,记为 f,然后把它当作一个新的状态变量——也就是“扩张”出来的状态——用观测器在线估计。这样一来,控制器面前只剩下一个近似线性的积分串联对象,控制难度大幅降低。

以最简单的二阶系统为例。对象模型写成:

y'' = f(y, y', d) + b0 * u

其中 u 是控制量,b0 是控制增益的估计值,d 是外部扰动。现在把状态向量取为 x1 = y,x2 = y',x3 = f,即第三个状态就是总扰动。观测器写成连续形式:

e = z1 - y z1' = z2 - beta1 * e z2' = z3 - beta2 * e + b0 * u z3' = -beta3 * e

z1 跟踪实际输出 y,z2 跟踪 y 的导数,z3 跟踪总扰动 f。beta1、beta2、beta3 是观测器增益,它们决定了观测器的收敛速度。只要这三个增益取得合适,z3 就能在几十毫秒内把扰动逼出来——不需要任何扰动传感器,也不需要知道扰动的具体模型。这就是“自抗扰”三个字的由来:扰动量级多大、什么频段,都由观测器自己扛下来。

你可能会问:观测器增益怎么取才叫“合适”?下一章会给具体公式。这一节你最需要记住的是 ESO 的输入输出关系:输入是被控量测量值 y 和控制量 u,输出是状态估计 z1 和总扰动估计 z3。它就像给系统装了一个“扰动压力表”,看着这个表去补偿,比盲目积分要主动得多。

2.3 从非线性到线性:为什么工程落地几乎都用 LADRC

韩京清先生早期提出的 ADRC 里,ESO 和误差反馈用的都是非线性函数,比如 fal 函数,在误差小时放大增益、误差大时压缩增益,理论上能在更大范围内兼顾快速性和鲁棒性。但非线性结构带来两个实际问题:一是参数太多,fal 里的指数、线性区宽度都要人工试凑,现场调参非常玄学;二是非线性观测器的收敛性分析困难,带宽与稳定性的关系不直观。所以后来高志强等人提出的线性自抗扰控制(LADRC)成了工程落地的主流,它把观测器增益和反馈增益全部用带宽参数化,整定工作简化为“两个带宽 + 一个 b0”。

LADRC 的完整结构是:参考信号经过 TD 或直接做过渡处理得到 v1 和 v2;LESO 估计出 z1、z2、z3;控制器用比例加微分的线性组合计算 w0,然后减去 z3 除以 b0 得到最终控制量。用公式表示:

u = (kp * (v1 - z1) + kd * (v2 - z2) - z3) / b0

代数上可以把它理解为:z3 已经把对象的非线性、耦合、外部扰动都“吸收”进了一个等效项,那么控制回路面对的就是一个双积分器,用 PD 控制就能稳定。它看起来像 PID,但多了一个“总扰动前馈补偿”通道——这正是它比 PID 强的地方。下文所有代码和整定流程都以 LADRC 为准,非线性的变体在理解原理后再自行扩展。

3. 离散化与最小实现:用代码跑通一个完整的 ADRC 回路

3.1 仿真对象与场景定义

动手写代码之前,先明确我们打算控制什么。我选用一个典型的二阶惯性对象来模拟伺服电机位置环或温度对象,数学形式是:

G(s) = K / (s * (T * s + 1))

转化成状态方程就是在第 2.2 节给出的二阶形式。为了对比,我会在同样的对象上分别接常规 PID 和 LADRC,并在运行中途注入一个阶跃扰动,观察两种控制器的恢复能力。这样你不仅能跑通代码,还能直观看到 ADRC 到底“先进”在哪。

仿真参数规划如下表,你可以直接复用:

参数取值含义
K2.0对象静态增益
T0.5对象惯性时间常数
b02.0ADRC 控制增益估计(与 K 接近)
wc6.0控制器带宽
wo30.0观测器带宽(取 5 倍 wc)
h0.001仿真步长
disturb_time5.0注入阶跃扰动的时刻
disturb_amp1.0扰动幅值

注意 b0 在这里故意没有取对象的精确增益,而是在 K 附近取了一个有偏差的值,模拟工程中模型不准确的情形。如果你把 b0 偏离 K 太远,就能看到 ADRC 性能明显退化,这是后面避坑章的重点。

3.2 核心代码:LESO、控制器与主循环

下面是一段可以直接复制运行的 Python 仿真代码,完整实现了 LADRC 并附 PID 对照:

import matplotlib.pyplot as plt # 参数区 h = 0.001 # 仿真步长 T_total = 10.0 # 总仿真时长 steps = int(T_total / h) # 对象参数: G(s) = K / (s*(T*s+1)) K = 2.0 T = 0.5 # LADRC 参数 b0 = 2.0 # 控制增益估计 wc = 6.0 # 控制器带宽 wo = 30.0 # 观测器带宽 # 带宽法参数化 kp = wc ** 2 # 比例增益 kd = 2.0 * wc # 微分增益 beta1 = 3.0 * wo # 观测器增益 1 beta2 = 3.0 * wo ** 2 # 观测器增益 2 beta3 = wo ** 3 # 观测器增益 3 # 状态变量(LADRC) z1, z2, z3 = 0.0, 0.0, 0.0 # 对象状态 y, y_dot = 0.0, 0.0 v1, v2 = 0.0, 0.0 # 跟踪微分器的两个状态 u = 0.0 ref = 1.0 # 目标值(阶跃) # PID 对照组(独立保存一组状态) pid_p, pid_i, pid_d = 6.0, 4.0, 1.0 pid_ie, pid_y, pid_ydot = 0.0, 0.0, 0.0 pid_u = 0.0 time_list, y_adrc, y_pid = [], [], [] for i in range(steps): t = i * h # 注入负载扰动 d = 1.0 if t >= 5.0 else 0.0 # ---------- ADRC 分支 ---------- # 跟踪微分器(安排过渡过程) err_v = v1 - ref # 用简单的离散最速函数近似,r0 控制跟踪快慢 r0 = 8.0 fhan = -r0 * (abs(err_v) > r0) * (err_v / (abs(err_v) + 1e-6)) if abs(err_v) <= r0: # 在内部,实际工程会用完整 fhan 算法,这里做简化 pass v2 += (fhan - v2 * 8.0) * h # 简化示意:用饱和型微分替代完整 fhan,保证可读性 v2 = max(min(v2 + (-r0 if err_v > 0 else r0) * h, 5.0), -5.0) v1 += v2 * h # 扩张状态观测器(欧拉离散) e = z1 - y z1 += (z2 - beta1 * e) * h z2 += (z3 - beta2 * e + b0 * u) * h z3 += (-beta3 * e) * h # 控制律:PD + 扰动补偿 u0 = kp * (v1 - z1) - kd * z2 u = (u0 - z3) / b0 u = max(min(u, 10.0), -10.0) # 控制量限幅 # 被控对象(欧拉离散) y_ddot = -y_dot / T + K / T * u + d y_dot += y_ddot * h y += y_dot * h # ---------- PID 分支 ---------- err_pid = ref - pid_y pid_ie += err_pid * h pid_ie = max(min(pid_ie, 10.0), -10.0) # 积分限幅 pid_y_ddot = -pid_ydot / T + K / T * pid_u + d pid_ydot += pid_y_ddot * h pid_y += pid_ydot * h pid_u = pid_p * err_pid + pid_i * pid_ie + pid_d * (0.0 - pid_ydot) # 微分项只对测量起作用 pid_u = max(min(pid_u, 10.0), -10.0) time_list.append(t) y_adrc.append(y) y_pid.append(pid_y) plt.plot(time_list, y_adrc, label='ADRC') plt.plot(time_list, y_pid, label='PID') plt.plot(time_list, [ref] * steps, '--', label='Reference') plt.legend() plt.xlabel('Time (s)') plt.ylabel('Output') plt.title('ADRC vs PID') plt.grid(True) plt.show()

这段代码的逻辑说明如下:主循环按固定步长离散推进。ADRC 分支依次执行三件事——用简化跟踪微分器生成参考过渡轨迹 v1,用 LESO 更新对输出、导数、总扰动的估计,用 PD 组合加扰动补偿计算控制量。PID 分支则用独立状态变量做对照,避免两组控制器共享状态产生耦合干扰。代码中的微分增益在 PID 侧刻意只对输出起作用,也就是“微分先行”,这是工程上避免给定突跳引起微分爆炸的常见做法,否则 PID 的对比就失真了。

参数说明:kp 和 kd 由控制器带宽 wc 生成,beta1~beta3 由观测器带宽 wo 生成。带宽法的核心约束是 wo 必须比 wc 大 3~5 倍,理由是观测器要看得比闭环响应更快,才能在扰动影响输出之前把估计值送到补偿通道。如果你把 wo 调到和 wc 一样大,控制器的相位滞后会让系统振荡,这是测试时可以故意试一试的典型翻车现场。

说完代码,你应该已经能跑出第一条对比曲线。上面的代码有意省略了完整 fhan 实现,只保留可读性足够的替代逻辑——在实际工程中,可以直接用下面这个更标准的离散 fhan 版本。

3.3 标准 fhan 实现与离散化精度的坑

严格的 TD 离散形式来自韩京清提出的最速综合函数,它有两组输入:期望跟踪速度和加速度限制。工程中广泛使用的一个简化版实现如下:

def fhan(x1, x2, r0, h0): d = r0 * h0 * h0 a0 = h0 * x2 y = x1 + a0 a1 = d * (d + 8 * abs(y)) ** 0.5 a2 = a0 + (a1 - d) / 2 * (1 if y > 0 else -1) sy = 1 if y > d else (-1 if y < -d else y / d) a = (a0 + y - a2) * sy + a2 sa = 1 if a > d else (-1 if a < -d else a / d) return -r0 * (a if abs(a) > d else a / d) * sa

与上一段代码中“简化示意”逻辑最重要的差别在于:h0 取的是滤波步长,而不是仿真步长 h。如果你把 h0 直接当成 h 用,会发现在大步长下 TD 的过渡轨迹明显失真,甚至出现给定的 v1 追不上参考值的现象。一般 h0 取 1~10 倍仿真步长,具体由噪声水平决定。现场有噪声时把 h0 调大,会显著平滑微分输出,代价是过渡轨迹的相位滞后增加。

离散化精度是另一个值得注意的点。上面所有递推都用了一阶欧拉格式,对 LESO 来说,当 wo 很大时,欧拉法的截断误差会显著影响收敛精度。工程上的常见做法是:实时系统中用二阶龙格库塔或零阶保持器离散,仿真中则可以直接用 scipy 求解连续微分方程来验证算法本身,再回过来对比离散实现。如果你发现预期很好的控制器在仿真里振荡,先怀疑离散格式,不要急着怀疑算法。

4. 参数整定方法:从带宽法到现场的三步调整

4.1 带宽法:为什么控制器带宽和观测器带宽要相差 3~5 倍

LADRC 能流行,很大程度上是因为参数整定从“六个玄学参数”变成了“三个有物理意义的参数”。带宽法的核心思路是把闭环系统设计成一个标准二阶系统,那么比例增益 kp 和微分增益 kd 就可以由控制器带宽 wc 直接计算:kp = wc²,kd = 2·wc。同理,扩张状态观测器的特征方程也希望配置成 (s + wo)³ 的形式,所以 beta1 = 3·wo,beta2 = 3·wo²,beta3 = wo³。

那为什么 wo 要比 wc 大几倍?道理很直观:观测器相当于一个信号侦察兵,侦察兵需要比大部队跑得更快才能提前发现敌情。如果观测器带宽不够,z3 对扰动的估计会明显滞后,补偿通道输出的信号与实际扰动错开相位,不仅抵消不了扰动,反而可能叠加出新的激励。不过 wo 也不能无限大,带宽越高,对测量噪声的放大越剧烈。3~5 倍是大量实践检验出的折中区间,大多数文献和工业案例都落在这个范围。

带宽法也解释了为什么“先调 wc 再调 wo”。wc 决定了闭环响应的快慢,wo 只要跟随 wc 倍数移动即可。工程上还有一种做法:先 wc 取一个保守的 2~3,wo 取 10 左右跑通仿真,然后逐步同时增加两个参数,直到出现噪声敏感或执行器饱和的迹象,再回退一点。这个方法叫“扫参逼近法”,新手不容易迷路。

4.2 现场整定的三步流程与参数取舍

我一般会把整定流程拆成三步,每一步只动一个参数组,避免多参数耦合造成判断混乱。

第一步,固定观测器带宽为一个较大的值(比如 wo = 30 这类对采样周期而言不激进的水平),只调 wc。观察阶跃响应的速度和超调。如果响应太慢,把 wc 往上加;如果出现超调或执行器高频动作,说明 wc 太高,回调 20%~30%。这步的目标是让闭环在“无外部扰动”的前提下有一个可接受的跟踪速度。

第二步,固定 wc,调 wo。给系统施加一个可重现的阶跃扰动,比如负载突变或给定偏置,观察输出恢复到参考值的时间和波动幅度。wo 太低时,恢复过程长且可能有缓慢的漂移;wo 太高时,控制量上会叠加明显的高频噪声,甚至伴随轻微啸叫。取恢复时间最短且不出现高频振铃的最大 wo 即可。

第三步,调 b0。把 b0 视为对象增益的粗略估计,这步最考验经验。b0 通常可以从对象铭牌或历史阶跃响应实验估算,不必准确到小数点后。b0 取太大会导致补偿不足,扰动恢复慢;取太小则补偿过度,系统出现周期性的“过冲-回调”自激振荡。调整时以 10%~20% 的步长上下试探,找到响应曲线最平滑的位置。

这里放一张我自己常用的参数记录表,方便你在设备上做对照实验:

调整顺序参数观察指标典型问题调整方向
1wc阶跃跟踪速度响应慢 / 超调大小步增加 / 回调 20%
2wo扰动恢复时间恢复慢 / 高频振铃增大 / 减小 50% 观察
3b0稳态波动与振荡补偿不足 / 自激振荡增 10% / 减 10%

要特别提醒:现场调试时每次改动参数后,至少等系统稳定运行十几个周期再下结论。自抗扰的扰动估计通道有动态过程,扰动注入后几秒内的响应不代表稳态性能,急于判断容易把参数调偏。

4.3 与 PID 调参的本质区别

经验丰富的现场工程师会觉得 ADRC 调参“比 PID 还简单”,因为带宽法的 kp/kd 不用像 PID 那样三个增益轮流试还互相牵扯。但有一个隐藏差异必须理解:PID 的积分项可以在系统存在稳态误差时慢慢把误差攒没,而 ADRC 的扰动补偿依赖 z3 对扰动的实时估计。如果 z3 收敛不了或者观测器饱和,系统就会留下常值误差,这在线性 LADRC 中尤其明显——因为它没有积分项。

解决这个缺陷有两种常见做法。一是把控制律改成“PD + 误差积分”的形式,在 z3 补偿的基础上再叠加一个慢积分项;二是升级为带积分扩张状态的观测器,让 z3 的估计精度更高。我自己的经验是:如果对象是伺服这类执行器有硬限幅的系统,优先选择第一种,因为观测器饱和时积分项还能兜底;如果是过程控制这类输出波动缓慢的场合,第二种更干净。两种方案都能让稳态误差归零,但表现形式和参数敏感度不同。

5. ADRC 常见问题排查:5 个让你怀疑人生的坑

5.1 观测器带宽拉高后,执行器出现高频振铃

现象:wo 增加后,控制量上叠加了明显的肉眼可见的高频抖振,执行机构发热明显,声音也变得尖锐。

原因:观测器带宽越高,LESO 对高频分量越敏感,测量噪声和量化误差通过 beta2、beta3 被放大成高增益的控制修正。带宽法只保证了扰动估计的快速性,没有考虑噪声抑制。

解决:wo 回调到振铃消失的位置,同时在测量信号进入观测器前加一阶低通滤波器。注意滤波器会引入相位滞后,所以滤波时间常数宁小勿大,否则会让 z3 的扰动估计产生延迟,出现另一种低频振荡。工程上有个折中经验:滤波器截止频率取 3~5 倍 wo,相位损失可控制在可接受范围。

5.2 过渡过程安排得太快,超调还是冒出来了

现象:TD 的 r0 已经设得很大,启动速度很快,但输出仍然超调 5% 以上,而且每次超调量不固定。

原因:r0 决定了参考轨迹的速度上限,但并没有限制系统的加速度需求。执行器物理上能达到的最大加速度有限,当参考轨迹要求的加速度超过执行器能力时,实际输出会滞后于参考轨迹,在末端形成追击超调。这本质上是参考加速度与执行器饱和的失配。

解决:r0 不应大于 b0·umax 的物理约束,其中 umax 是控制量限幅值。你可以做一个简单的自检:把参考轨迹的 v2 画出来,如果 v2 的最大斜率远超实际输出的最大斜率,说明参考轨迹太陡。把 r0 降到物理可实现范围,超调自然消失,跟踪慢一点但更稳健。

5.3 采样周期改变后,原本调好的参数全都失灵

现象:仿真步长从 0.001 改到 0.01,或实际设备上控制周期从 1kHz 改成 500Hz,同一套参数下系统从稳定变成剧烈振荡。

原因:LADRC 的离散观测器增益 beta1~beta3 是按连续时间计算的,离散实现中这些增益需要乘以采样周期 h 才会进入递推公式。我见过不少人在离散代码里漏乘 h,或者反过来乘了两次,采样周期一变,等效极点和设计值相差甚远。另外,观测器带宽 wo 也不能超过采样频率的 1/10 左右,否则离散化误差让观测器直接发散。

解决:检查离散递推式中是否每个积分项都正确乘以 h;wo 与采样频率之间留足裕量。切换采样周期后,不要只调 wo,先把 beta1~beta3 按新 h 重算一遍,再验证阶跃响应。

5.4 启动瞬间 z3 初值为零,第一个控制量冲出限幅

现象:系统上电或给定切换的瞬间,控制量直接撞到限幅,伴随明显冲击,某些柔性传动设备甚至出现剧烈抖动。

原因:LESO 的 z3 初始值为 0,但实际对象往往存在静摩擦、重力偏置或初始负载,这些真实扰动在启动瞬间被观测器当作“未知扰动”开始估计,而在估计收敛之前,控制律中的 -z3/b0 项无法提供应有的补偿,误差项 e 又很大,PD 输出瞬间饱和。

解决:两个手段同时用。一是把 z3 初值设为一个保守的偏置估计,比如摩擦或重力折算出的等效控制量;二是在启动阶段对控制量变化率做限幅,而不是只做幅值限幅。我一般会在控制量通道加一个一阶惯性或变化率限制器,让执行器有追得上需求的缓冲。这个方法虽然牺牲了几十毫秒快速性,但换来了启动过程的稳定,在现场设备上很值得。

5.5 对象存在明显纯滞后时,ADRC 反而比 PID 更容易振荡

现象:控制对象是纯滞后加惯性环节,ADRC 仿真跑出来发散或极限环振荡,换成 PID 反而勉强稳定。

原因:LADRC 的核心假设是对象可以近似为积分串联型,而纯滞后会破坏这个假设。扰动通道的 z3 估计本身是精确的,但控制量要经过纯滞后时间 tau 才能作用到输出上,观测器估计出的“当前扰动”其实对应的是 tau 秒前的控制效果,相位错位导致补偿回路变成正反馈。

解决:对象纯滞后时间占主导时,不要直接用 LADRC,优先考虑史密斯预估器加 ADRC 的组合,或者在观测器内部引入滞后补偿。如果滞后很小(比如 tau 小于采样周期的 2~3 倍),把 wo 压低到只补偿低频扰动,还能勉强工作。我没有见过纯滞后环境下把 wo 调高能稳定运行的案例,遇到这种对象还是先解决滞后问题再谈抗扰。

6. 让 ADRC 从“能跑”到“好用”:三个值得一试的进阶方向

第一个值得做的事情是给 TD 的输出做“误差微分重构”。很多人在 ADRC 里仍然习惯用 e = z1 - y 做误差,微分项直接用 z2 代替。但 z2 是观测器估计的 y 的导数,它包含测量噪声的放大成分。更好的做法是让参考值也经过 TD,然后取 (v2 - z2) 作为误差微分,也就是代码里我写的那样。这个细节让抗扰性能不变的同时,系统对噪声的敏感度明显下降,尤其适合位置伺服这类要求低速平稳的场合。

第二个方向是观测器带宽的调度。固定 wo 的 LADRC 在宽速范围运行时,要么低速时机电噪声被放大,要么高速时扰动补偿跟不上。我做过的一个模拟项目里采用分段调度:低速段 wo 取低值并用低通滤波,高速段 wo 线性升高,切换处做平滑过渡。实测带宽利用率提升接近 30%,而且没有出现切换冲击。这个思路不比修改算法复杂,但需要你对自己的对象在不同工况下的噪声水平有量化认识。

第三个方向是 ADRC 与经典 PID 的混合。不是所有回路都需要全面替换,最稳的落地路径是保留原有 PID,把 z3 作为扰动前馈叠加到控制量通道上。这样即使 ADRC 部分因为某种原因失稳,PID 环路还能保持基本稳定,属于有后悔药可吃的过渡方案。我在某公司的产线上就是这么做的:先加扰动补偿通道跑一个月,确认历史故障未复现,再逐步把 PID 的积分项减弱甚至摘除。这种事关安全切换的做法,比一次性大改更值得推荐。

另外,验证一个 ADRC 实现是否正确,最有效的方法不是看阶跃响应,而是做正弦扫频对比:给控制量叠加小幅正弦激励,分别记录输入端和输出端的幅频特性,看 +20dB/dec 的积分特性是否在中频段成立。如果斜率偏差太大,说明观测器或者补偿增益有问题。这些年我养成的习惯是,每个新的 ADRC 应用先过这个频率检查再上闭环,翻车概率能少一半。ADRC 不是银弹,纯滞后大、测量噪声重、执行器过度饱和的场景它确实吃力,但只要你摸清了它的边界,它的抗扰能力在多数工程对象上都是碾压 PID 的。这篇笔记把原理、代码和血泪经验都交给你了,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询