ADRC自抗扰控制与PID等效推导:传递函数解析及MATLAB实战 自抗扰控制ADRC这玩意儿玩起来确实有意思。我第一次翻韩京清那套框架时第一反应是这不就是把 PID 的误差换成了状态估计吗后来认认真真从传递函数往下一个环节一个环节捋才发现 ADRC 和 PID 之间不是简单的“平替”而是把误差驱动的思路重新做了一遍。这篇就顺着我踩过的路径来聊先拆 ADRC 内核再把“从传递函数推导到 PID 等效”这一步彻底展开最后给出一段可以直接在你的 MATLAB 里跑的实战代码顺带把最近大家常讨论的“扫频法求开环传递函数、截止频率计算”也一起解决掉。这个项目适合谁如果你是只调过 PID、但一直搞不明白 ADRC 所谓“不需要精确模型”到底是怎么做到的那这篇文章就是帮你把中间的窗户纸捅破。如果你已经写过 LADRC但对“等效 PID”这个说法将信将疑那这里的推导和频响对比能给你一个明确的答案。我自己更偏工程实践所以下面所有内容都以可复现、可落地的 MATLAB 代码为主线不会停在理论不落地。1. ADRC 内核拆解三个环节各司其职ADRC 听起来玄乎本质上就干了一套“先估计、再抵消、后控制”的活。你要把被控对象当成一个不知道内部细节的黑箱但黑箱也不是完全没法猜——ADRC 通过一个扩张状态观测器ESO在线估计系统的总扰动再用控制量把这个扰动抵消掉最后剩下的就是一个干干净净的积分串联型对象控制起来自然容易。1.1 TD 跟踪微分器给指令信号安排一条“能走的路”很多刚接触 ADRC 的人上来就被 TD 劝退其实它做的事特别朴素参考信号如果是阶跃直接把阶跃当误差用很容易造成初始控制量爆表也就是所谓的“微分爆炸”。TD 的作用是把参考信号转成一条平滑过渡的轨迹并给出它的一阶、二阶导数让控制器可以提前“知道”参考怎么变化。在实际工程里TD 的价值主要是抑制超调和减少启动冲击。比如电机调速系统给定转速直接砸下去误差瞬间很大如果没有 TD比例项可能直接打到限幅有了 TD 之后参考是逐渐逼近目标值的控制量不会瞬间打满。在我的项目里如果控制系统本身对快速性要求极高TD 并不会成为瓶颈因为它本质上是把指令“降速”不会消耗太多响应带宽。不过要说明白TD 不是 ADRC 的必要条件。线性 ADRCLADRC经常把 TD 省掉只保留 ESO 和线性状态反馈尤其当参考信号本身已经比较平滑或系统输出滤波较好时。是否需要 TD要看你的指令源和执行的物理限制而不是硬套公式。1.2 ESO 扩展状态观测器整台戏的 C 位ESO 是整个 ADRC 的灵魂。它的思路是把对象的“未建模动态 外部扰动 参数偏差 各种耦合”全部打包成一个新的状态叫“总扰动”。然后把这个扩展状态作为第三个、第四个状态去观测再用观测值做补偿。你可以把它理解成一个内置的“虚拟扰动传感器”。以最常见的二阶对象为例不考虑 TD系统的输入输出关系可以写成y f(y, y, w, t) b0 * u其中 f 被称为总扰动。紧接着引入状态变量x1 y x2 y x3 f于是原来的二阶系统被改写成三阶状态方程x1 x2 x2 x3 b0 * u x3 h这里的 h 是总扰动的变化率理论上未知但在 ESO 里不需要知道它只需要把它当做一个需要估计的状态。ESO 的方程如下z1 z2 β1 * (y - z1) z2 z3 b0 * u β2 * (y - z1) z3 β3 * (y - z1)当观测器增益 β1、β2、β3 取得足够合理时z1 会追上 yz2 会追上 yz3 会追上 f。这样你要的总扰动已经由一个在线观测器实时拿到了。把 f 抵消掉之后原来的复杂对象就退化成接近y b0 * u这里的关键是 b0 的选择。b0 是控制通道增益的估计值你不需要把它精确到和真实模型一模一样但你得很清楚b0 如果偏离真实值ESO 会把差异折算到总扰动里去并通过 z3 去补偿。所以 b0 偏差很大时系统依然可以工作表现就是 z3 会“背锅”。但这个背锅是有极限的b0 偏差太大或变化范围太大观测器带宽又不够系统就可能出现振荡甚至发散。1.3 误差反馈与控制律把估计出来的状态变成控制量前面拿到了状态估计值 z1、z2、z3接下来就进入控制量合成环节。对于二阶 LADRC控制律通常采用u (u0 - z3) / b0 u0 kp * (r - z1) - kd * z2这里的 r 是参考输入kp 和 kd 是控制增益。把 z3 减掉就是为了抵消总扰动。假设 z3 估计得足够准确那么整个闭环就等价于在控制一个y u0的二重积分对象。再用 u0 里的比例加微分去配置闭环极点系统自然就成为期望的二阶动态。参数整定上工程上普遍采用带宽法。控制带宽 ωc 决定期望闭环动态观测器带宽 ωo 决定 ESO 的收敛速度。通常取kp ωc^2 kd 2 * ωcβ1 3 * ωo β2 3 * ωo^2 β3 ωo^3这样做的最大好处是你不用瞎试一堆参数只要确定两个带宽值即可。ωo 一般取 ωc 的 3~10 倍具体取决于噪声水平和采样周期。这个“带宽法”本质上把 ADRC 的调参逻辑从“调三个 PID 参数”变成了“调两个带宽”更容易找到规律。2. 从传递函数推导到 PID 等效关键一步怎么迈这是一开始提到“从传递函数推导到 PID 等效”的正题。很多人看 ADRC 的时域方程觉得就是个状态观测器加状态反馈看不出和 PID 有什么关系。但只要把整个闭环控制器从时域转到频域就会发现LADRC 在形式上完全可以整理成“PID 加滤波”的结构只是它的积分作用来源非常特别。2.1 先把被控对象摆成传递函数形式为了推导方便我们用传递函数去表达被控对象。以一个常见的二阶对象为例P(s) 400 / (s^2 12s 20)这个对象的自然频率和阻尼比并不重要重要的是它有一阶和零阶项会给常规 PID 调参带来许多麻烦。如果直接用 PID 去整定你需要确定三个参数并且要反复权衡超调、响应速度和抗扰能力。而 ADRC 的切入方式是先不去管 1 和 0 次项到底是多少通通把它们归入总扰动只保留下面的积分串联形式P_est(s) b0 / s^2这里 b0 取 400也就是控制通道增益的估计值。这一步是整个推导的起点ADRC 认为只要 ESO 能把 12s 和 20 这些项都“吸收”进扰动估计 z3控制设计时就可以基于纯积分模型来进行。换句话说PID 是在和一个又有比例又有微分的对象硬碰硬而 ADRC 在内部先做了一次模型简化。2.2 从时域 LADRC 方程推出等效反馈控制结构现在把上一个小节里的 ESO 方程和控制律联立消去中间状态可以得到从误差到控制量的频域关系。虽然中间代数运算比较繁琐但结论很清晰忽略高阶小项后LADRC 反馈通道可以写成近似形式C_LADRC(s) ≈ Kp * (1 1/(Tis) Tds) * 1/(τ*s 1)也就是说它本身就是一个带滤波的 PID只是这个“PID”的积分项不是直接把误差对时间积分而是由 ESO 内部对 z3 的积分动作自动生成的。为什么积分作用会自己冒出来关键在于 ESO 的第三个状态 z3 的观测方程里有 β3 * (y - z1) 这一项。z3 的估计是动态的当系统存在稳态误差时z1 会一直偏离 y这个偏差会持续累积到 z3 上最终表现为控制量逐渐调整直到误差消除。这个累积效果和 PID 的积分项在功能上等价但是又没有传统积分项那种容易饱和、容易引发大超调的毛病。这也是我认为 ADRC 和 PID 之间最耐人寻味的地方PID 的积分是显式的ADRC 的积分是隐式的、由扰动估计器自适应产生的。对于一阶对象更是如此一阶 LADRC 的等效控制器可以整理成“PI 滤波”的形式而二阶 LADRC 会自然形成“PID 滤波”。这种结构上的继承关系让 ADRC 看起来像是一种更“智能化”的 PID 进阶版而不是完全脱离 PID 的新理论。2.3 角频率域的启示为什么说它是二自由度 PID还要