
在工业现场摸爬滚打过的工程师对PID那套“误差-比例-积分-微分”的组合拳基本都再熟悉不过。但当你碰到强耦合、大滞后、参数时变或者外部扰动复杂的对象时PID调来调去总是顾此失彼积分饱和、微分噪声、鲁棒性差的问题接踵而至。线性自抗扰控制LADRC正是这几年从学术界杀进工程界的一匹黑马它把“扰动估计与补偿”这个思想做到了极简且可落地尤其适合那些模型不清晰、扰动又很猛的被控对象。这篇博文我就从最基础的知识讲起把LADRC的来龙去脉、核心公式和设计思路掰开揉碎了说清楚给刚接触这个方向的朋友搭一个完整的知识骨架。这篇内容适合谁看如果你是做运动控制、电力电子、过程控制或者无人机飞控的工程师正在为PID的极限性能发愁或者你是控制专业的学生想弄明白ADRC和LADRC到底差在哪LADRC的“带宽参数化”为什么这么神奇——看完这篇你至少能在原理层面把它吃透并知道自己下一步该往哪个方向使劲。后续我也会继续更新LADRC的仿真搭建与实物调试篇这篇先把地基打牢。1. 为什么是LADRC从PID说起1.1 PID的“老三样”到底缺什么很多刚接触控制的人会有一个错觉PID用得好天下没有难调的系统。这话对了一半。PID本质上是一种“基于误差消灭误差”的哲学比例项负责“看见误差就出力”积分项负责“把残留的稳态误差清零”微分项负责“预判误差走势提前刹车”。这种思路在单输入单输出、线性时不变、扰动不剧烈的系统里确实非常能打以至于吃了几十年老本还在工业界占据绝对统治地位。但PID的短板同样明显。首先积分项是一把双刃剑它为了消除稳态误差不停地累加一旦执行器饱和或者误差方向突然反转积分就可能过度积累带来超调甚至发散这就是著名的积分饱和问题。其次微分项天生对噪声敏感位置式PID里一个高频抖动的传感器信号经过微分放大器放大后执行器会被逼得高频率颤动往往需要低通滤波器“压着打”但滤波又引入了相位滞后动态性能跟着变差。更深层的问题在于PID的所有控制动作都建立在一个假设上误差就是一切问题的根源。但它从不问这个误差是怎么来的是外部扰动导致的还是模型参数变化导致的还是被控对象本身就是非线性强耦合的。PID不管是哪种原因都只做同一件事——按照误差的比例、累积和变化率去修正。这就像一个人发烧了只知道吃退烧药却不去分辨是病毒感染还是细菌感染能压住一时但治不了根。1.2 ADRC到LADRC从复杂到可工程化的关键一跳为了解决PID“只看误差、不问病因”的问题韩京清先生在九十年代提出了自抗扰控制Active Disturbance Rejection Control, ADRC核心思想是把系统的未建模动态、参数摄动、外部扰动统统看作一个“总扰动”然后用一个扩张状态观测器ESO把这个总扰动实时估计出来并在控制律中直接补偿掉。这个思想非常漂亮相当于给控制器装了一个“扰动透视镜”一边看误差一边看扰动能顶多大劲然后对抗着出招。但早期的ADRC是高度非线性的里面用了一大堆非线性函数比如fal函数、非线性状态误差反馈律等等。韩老师的原版ADRC虽然理论上很美参数却多得让人头皮发麻观测器增益、控制律增益、非线性函数的形状参数、滤波因子……一整套下来二三十个参数要调工程人员看了直接劝退。更麻烦的是非线性ADRC的理论分析非常困难稳定性证明、收敛性分析都绕不开非线性这个坎学术研究推进得并不顺畅。后来高志强教授做了一个至关重要的简化既然非线性形式太复杂那我就把扩张状态观测器的收敛速度、控制律的增益全部“带宽参数化”用线性形式替代非线性形式。这一刀切下去效果是革命性的。LADRC的参数从几个甚至几十个锐减到三个核心参数观测器带宽ωo、控制器带宽ωc和补偿因子b0。原来那个需要深厚数学功底才能驾驭的控制器变成了一个“小学生也能上手调参”的算法。正是这一步简化让ADRC从论文里的数学模型走下了产线在运动控制、电源控制、温度控制等领域扎下了根。1.3 LADRC到底解决了什么问题我的理解里LADRC解决的核心问题可以浓缩成一句话如何让控制器在不需要精确数学模型的前提下依然获得良好且一致的控制性能。传统PID的增益往往要针对具体工况反复调整换一个负载、换一条产线参数原来那套PID参数可能就失效了而LADRC通过在回路中引入一个实时扰动估计器把“模型失配”和“外部干扰”造成的误差在源头上抵消掉剩下的控制任务就变成了一个简单的“积分串联型对象”的控制这时候用PD甚至P控制就能获得非常好的性能。换句话说LADRC把“艰难的控制问题”硬生生转化成了一个“简单的控制问题”。艰难的部分扰动估计交给扩张状态观测器去解决简单的部分比例-微分反馈留给控制工程师去设计。这种“重构控制问题”的思路我认为是LADRC对控制工程最有启发性的贡献。只要b0估得八九不离十LADRC对模型参数的赖赖度会显著低于传统PID这也是为什么它能在很多“模型说不清、扰动又很大”的工业对象上大放异彩。2. LADRC的核心思想与数学框架2.1 总扰动一个把模型误差和外部干扰“打包处理”的概念要理解LADRC第一道坎就是“总扰动”这个概念。我当年刚接触时习惯性地把扰动理解为“外部负载力矩的突变”或者“电源电压的波动”但实际上LADRC里的总扰动范围要大得多。它把被控对象和理想模型之间的所有偏差都算进去外部的扰动输入、内部的参数不确定性、被忽略的高阶非线性动态甚至执行器的非理想特性只要最终体现为“输入到输出的增益或动态行为与理想模型不一致”都可以塞进总扰动这个筐里。这么做的好处非常直观控制器不再关心这个扰动是谁引起的也不用单独为每一种扰动设计补偿回路。它只需要回答一个问题——如果除掉控制量本身系统输出实际受到了多大的影响把这个影响估计出来之后用负反馈的方式“抵消”掉就相当于把一个复杂多变的真实对象“改造”成了一个干净的理想对象。打个比方你买了一台二手车发动机实际状态谁也不清楚总扰动就像那台车的“实际路况综合因子”LADRC不去修发动机而是在油门踏板上叠加一个反向补偿让这辆二手车跑起来和一台车况良好的新车感觉差不多。从数学上说对于一个n阶系统我们把最高阶导数受到的扰动统一记作f(x, ẋ, w, t)其中x是系统状态w是外部扰动t是时间。广义上讲f可以是完全未知的非线性函数但只要它的取值是有限的、变化速度在一定范围内LADRC就可以通过扩张状态观测器把它估计出来。这就是“自抗扰”三个字的底气所在——它自己有能力对抗扰动而不是靠先验模型预知扰动。2.2 从对象模型到状态空间描述我们以一个最典型的二阶系统为例来推公式。假设被控对象满足ẍ f(x, ẋ, w, t) b0 u其中u是控制输入ẍ是系统输出的二阶导数b0是我们对控制增益的估计值。注意这里b0不要求精确等于系统真实的控制增益b只要数量级差不多就行偏差的部分会被总扰动f吸收。f里包含了所有“说不清楚的因素”未建模动态、参数偏差、外部干扰、非线性项等等。为了用状态空间的方法处理我们定义状态变量x1 xx2 ẋx3 f其中x3就是扩张出来的“总扰动状态”。之所以把f扩张成一个状态是因为这样可以把它当作一个可观测的变量来处理这就是“扩张状态”这个名字的由来。于是系统的状态方程可以写成ẋ1 x2 ẋ2 x3 b0 u ẋ3 ḟ这里我们假设ḟ未知但有界也就是总扰动的变化率是有限的。在实际系统中这个假设基本都能满足因为工业扰动通常不会出现物理上不可能实现的瞬时跳变。有了这个状态方程整个问题就变成了如何设计一个观测器从可测的输出x1出发把三个状态x1、x2、x3都估计出来。第三项x3的估计值就是LADRC实施扰动补偿的关键信息。2.3 LESO线性扩张状态观测器是怎么工作的所谓观测器本质上就是一个“状态模拟器校正项”。我们知道系统的动态方程就用一个软件模型去复现它的状态轨迹再用“模型输出与实际输出的误差”乘以一个增益来校正估计偏差。经典的龙伯格观测器就是这么干的。LADRC里用的LESO就是龙伯格观测器在扩张状态系统上的直接应用。对照上面的状态方程LESO的完整形式是ż1 z2 β1(x1 - z1) ż2 z3 β2(x1 - z1) b0 u ż3 β3(x1 - z1)其中z1、z2、z3分别是x1、x2、x3的估计值β1、β2、β3是观测器增益。从结构上看LESO的输入有两个一个是系统实际输出x1与观测器输出z1的误差x1 - z1另一个是控制量u。u的输入项里面带一个b0这相当于告诉观测器“我施加了多少控制力”控制力的效果会体现在状态更新中这样观测器在估计状态时就不会把控制量的影响误判为扰动。为了分析观测器的收敛行为我们定义估计误差e1 x1 - z1e2 x2 - z2e3 x3 - z3。对误差求导并合并化简可以得到误差动态方程。如果增益β1、β2、β3取得合适使得误差动态矩阵是赫尔维茨稳定的那么估计误差就会逐渐收敛到零也就是z3能够逼近真实的f。关键来了怎么取β1、β2、β3高志强教授给出的答案是带宽参数化令β1 3ωo β2 3ωo² β3 ωo³此时误差动态特征多项式的极点全部配置在-ωo处ωo就是观测器带宽。ωo越大观测器收敛越快估计越“贴身”但对噪声也越敏感。这是一对与生俱来的矛盾在实际调参时一定要权衡后面我会专门讲。3. 控制器设计带宽参数化的精髓3.1 状态误差反馈控制律的设计观测器把状态和总扰动都估出来了接下来就是用这些估计值构造控制律。LADRC控制律的标准形式是u (u0 - z3) / b0其中u0是一个中间控制量z3是总扰动的估计值。这个式子的物理意义非常清晰如果z3对真实f的估计是准确的那么控制量u进入系统后产生的效果是b0u恰好等于u0 - z3再叠加真实扰动f之后系统的动力学就变成ẍ f b0u f (u0 - z3) ≈ u0看到没经过这一步补偿原来的非线性、扰动频繁的复杂对象被“压缩”成了一个纯积分串联对象ẍ u0。这就是扰动补偿的魔力它把控制设计的主战场从“如何对付未知的f”转移到了“如何设计u0来驱动一个简单的双重积分器”。这一步是LADRC最核心的算力所在也是它跟反馈线性化在思想上同源的地方只不过反馈线性化需要精确模型而LADRC用观测器估计值代替了精确模型。既然等效对象变成了ẍ u0那我们就可以用最朴素的状态反馈来设计u0。考虑参考输入为r并假设参考轨迹的二阶导数信息已知或可近似忽略设计u0 kp(r - z1) kd(ṙ - z2)注意很多资料里为了简化会直接写成u0 kp(r - z1) - kd z2也就是不考虑参考信号的导数项这在跟踪缓变信号时问题不大但在快速轨迹跟踪场合最好把参考速度前馈加上。把u0代入ẍ u0并假设观测器已经收敛z1 ≈ xz2 ≈ ẋ得到闭环误差动态ë kd ė kp e 0其中e r - x。可见闭环系统的性能完全由kp和kd决定。同样的高志强教授的带宽参数化在这里再次发力kp ωc² kd 2ωc这时闭环特征多项式的极点全部位于-ωc处ωc就是控制器带宽。到此为止LADRC的完整设计只剩下两个可调参数ωo和ωc外加一个表示控制效率的b0。3.2 带宽参数化为什么LADRC只有两个参数很多第一次接触LADRC的人都会惊讶这么简单的参数结构真的能控制复杂的工业对象吗我当时也很怀疑直到自己亲手在仿真里把PID调了半小时没搞定的对象用LADRC十分钟就压住了才明白带宽参数化的威力所在。带宽参数化的本质是把一个复杂的多极点配置问题降维成“所有极点放在同一个位置”的简单问题。虽然把所有极点放在同一位置在理论上不是最优的比如和巴特沃斯配置相比阻尼比不够理想阶跃响应会有一点超调但它换来了无与伦比的简洁性和工程可用性。更重要的是ωc和ωo这两个参数背后都有明确的物理含义ωc决定闭环响应速度ωo决定扰动估计的收敛速度。调参时你可以非常直观地根据期望的动态响应去选定ωc然后让ωo取3到5倍ωc保证观测器收敛速度显著快于闭环动态又能避免过大的噪声放大。这种“所见即所得”的调参方式比PID的kp、ki、kd三个参数之间互相牵扯要友好得多。我后来在带学生时也常说LADRC调参是“先把一个旋钮拧到位再拧另一个”而PID调参是“三个旋钮互相打架”。当然少参数并不等于无脑。ωo太大观测器会把传感器噪声当真扰动来估计控制量会高频抖振ωc太大等效积分串联对象的状态反馈增益过高即使没有外部噪声执行器的速率极限和饱和特性也会被激发出来。调参不是盲目放大而是找到“观测器跟得上、控制器压得住、执行器扛得住”的甜点区间。3.3 扰动补偿通道的物理意义我们再看一下u (u0 - z3)/b0这个控制律的结构。它其实分成了两条通道一条是u0/b0负责“根据参考和状态误差输出控制力”另一条是-z3/b0负责“根据扰动估计输出反向抵消力”。第二条通道就是所谓的扰动补偿通道也是“自抗扰”三个字的直接落点。从能量角度看-z3/b0这一项的物理意义相当于一个前馈补偿器它不等扰动造成可见的误差就直接在控制量中注入反向分量。相比PID要等误差出现后才慢慢积分追赶LADRC的扰动补偿具有“未雨绸缪”的性质。当然这里的“未雨绸缪”要打一个引号因为观测器估计扰动本身也需要时间如果ωo足够大补偿几乎是实时的如果ωo不够大补偿会滞后但即便如此也比纯反馈的PID快得多。这里还需要注意b0的影响。b0是控制增益的估计值它的准确性直接决定补偿通道的强度。如果b0估得偏大意味着控制器认为单位控制量对输出的影响力更强那么补偿量会被低估实际补偿会不足反之b0估得偏小补偿会被高估甚至出现过补偿导致的高频震荡。好消息是只要b0偏差在±30%以内LADRC依然能维持出色性能这个容错度在工程上是十分珍贵的。顺带提一句b0的估计通常可以从开环阶跃实验中得到给系统一个阶跃输入测量输出的稳态加速度两者相除就是这个工作点附近的b值。4. 实操要点调参步骤与注意事项4.1 从零开始一个二阶对象的仿真搭建要点理论讲完不上手试一把总觉得飘。这里我用一个弹簧-质量-阻尼系统作为示例对象方程是m ẍ -c ẋ - kx u d(t)其中m是质量c是阻尼系数k是弹簧刚度d(t)是外部扰动。我们假设控制器对模型参数一无所知只知道b0的估计值。为了模拟真实场景让仿真模型里的参数和控制器设计时假设的参数存在偏差这样才考验LADRC的鲁棒性。搭建仿真时建议按如下顺序推进先建立被控对象模型比如用Python的scipy或MATLAB/Simulink输出x、x_dot并在某个时间点注入阶跃扰动d。实现LESO的三个状态方程使用固定步长求解器。注意观测器的离散实现要选择和控制器相同的步长避免在连续模型下调试得很好、一离散化就发散的尴尬。按照u (u0 - z3)/b0生成控制量并设置执行器饱和限幅防饱和逻辑必须一起写进去。参考输入给一个阶跃或斜坡信号用带宽参数化公式计算kp、kd、β1β2β3。从ωc 10 rad/s、ωo 50 rad/s开始调试观察输出和扰动估计值的轨迹。我记得自己第一次搭LADRC仿真时最大的教训是求解步长没设够小。LESO实质上是一个高增益观测器ωo取到50以上时求解步长若还停留在1毫秒很容易出现数值刚性导致的发散表象上误以为是参数超限。后来把步长缩小到0.1毫秒级别一切就正常了。离散化步长的问题在实物中更是重中之重后面我会单独强调。4.2 调参顺序与经验法则LADRC的调参顺序我总结为三步走先定b0再调ωc最后顶ωo。第一步是b0。如果你对对象有一定先验知识比如知道电机力矩常数和负载转动惯量可以用b0 ≈ (力矩系数)/(转动惯量)来粗估如果完全没有先验知识就在对象工作点附近做一次开环阶跃实验测量输出稳态加速度速度变化率和输入幅值的关系比值就是b的近似值。这里一定要记住b0不需要精确偏差别超过一个数量级就行。第二步定ωc。ωc直接对应你期望的闭环响应速度可以根据参考跟踪要求初步设定。一个实用的起点是让1/ωc大致等于期望的上升时间的三分之一到二分之一。比如期望上升时间0.3秒那么ωc可以先取10到15 rad/s。如果系统响应太肉就加大ωc如果出现振荡就减小ωc。这个阶段可以把ωo设成3倍ωc左右让观测器收敛速度明显快于闭环动态。第三步才是通过加大ωo来对抗扰动。如果扰动下的最大动态偏差下坠深度超出指标就增大ωo观察扰动估计z3是否更“贴身”地跟随真实扰动的变化。当在示波器上看到控制量出现明显的高频抖动或者输出端出现沙沙作响的噪声时说明ωo已经顶到头了应该往回退一点找到一个“扰动抑制最强但噪声还能接受”的平衡点。这三步里最常见的错误是跳过b0直接死磕ωo结果发现ωo怎么调扰动都抑制不住其实是因为b0偏差太大补偿通道本身就在“帮倒忙”。4.3 工程中常见的坑第一个坑是执行器饱和。LADRC的扰动补偿通道输出的反向控制量可能非常大如果执行器限幅了而观测器仍然按照未饱和的控制量u来计算状态预测就会造成“观测器看到了一个它没做过的控制动作”状态估计将快速失真严重时直接发散。解决办法是在代码里给观测器的输入用和实际输出到执行器相同的饱和值或者像抗饱和PID那样加一个条件积分/跟踪反算机制。很多文献里不会写这个细节但工程中不处理它LADRC分分钟教做人。第二个坑是传感器噪声与高带宽观测器的冲突。LESO把输出噪声也当作状态的一部分去估计当ωo很大时噪声会被放大并注入控制量。解决思路一般有两条一是给测量信号做预处理滤波但这会引入相位滞后需要权衡二是用一个带噪声抑制的观测器形式比如在误差项前面加一个低通整形不过这会增加设计复杂度通常只在追求极致性能时才用。对大多数应用来说把ωo压到噪声可接受范围是更务实的做法。第三个坑是b0的辨识问题尤其在控制增益随工作点变化剧烈的系统中。比如气动系统气源压力不同时单位电压产生的推力差别很大或者伺服系统在低速和高速时的等效增益不同。这种情况下可以离线在不同工作点测量b0值做一个简单的增益调度表也可以在线用递推最小二乘实时估计b值。不过要提醒一句在线辨识b0要非常谨慎辨识偏差和扰动叠加在一起时观测器会反馈出一个“虚构的扰动”反而把系统搞乱。对于第一期基础篇我建议先从固定b0做起把LADRC的基本行为摸透了再碰增益调度。5. 与PID的对比性能边界与适用场景5.1 理论对比结构带来的差异我整理了一个LADRC和PID的对比表方便大家对照着看。这个表不是要证明LADRC全面碾压PID而是让你理解两者适用域的差异对比维度传统PIDLADRC模型依赖程度不需要模型但增益绑定工况不需要精确模型仅需粗估b0扰动抑制方式误差出现后靠积分追赶观测器实时估计前馈式补偿参数个数与关联性3个以上互相牵制核心3个物理意义明确独立可调对非线性/时变对象的适应差换工况需重新调参强总扰动自动吸收未建模动态噪声敏感性微分项对噪声敏感高带宽观测器对噪声敏感理论分析难度成熟但线性为主线性LADRC可用经典工具分析工程落地成熟度极高工具链齐全快速上升已有芯片级/驱动级应用从这个表能看出LADRC和PID其实是两种不同的控制哲学。PID相信“误差可以引导系统走向正确”而LADRC相信“知道了扰动能动多少我直接把它干掉”。前者是被动响应型后者是主动对抗型。对于扰动频繁且幅度大的系统主动对抗当然优势明显对于扰动很小、模型又很干净的系统PID完全够用没必要为了新颖而新颖。5.2 什么时候用LADRC什么时候别用基于我自己的项目经历我建议在这些场景优先考虑LADRC一是对象模型参数随工况漂移明显比如机械臂不同负载、电机不同转速下的转动惯量变化二是外部干扰幅度大且频繁比如轧钢过程中的冲击负载、风载下的天线伺服系统三是系统本身可以近似为积分串联型对象比如电流环、速度环、温度对象这类对象用LADRC效果奇好。不太推荐LADRC的场景也有几个一是系统是大纯滞后对象比如长管道温度控制LADRC的基本假设扰动可被即时估计并补偿会被滞后打破这时候需要先在回路里加史密斯预估器或者改观测器结构不是LADRC的简单应用能搞定的。二是传感器噪声特别恶劣且无法改善的场合观测器会把噪声凶猛放大性能可能还比不上一个调好的PI控制器。三是执行器本身极其脆弱、不允许出现大幅度高频动作的系统LADRC的补偿通道天生就会产生较为剧烈的控制动作对执行器寿命有影响。另外要注意LADRC并不是“万能药”它和PID是互补关系。很多实际项目中我把LADRC用作内环电流环/速度环控制器外环仍然保留PI结构或者把PID嵌套在LADRC的外面做参考整形效果相当好。控制没有银弹只有合适的工具和会用工具的人。6. 写在后面我的实际体会与下一步方向这篇文章把LADRC的基础知识搭了一个完整的框架从PID的痛点引出自抗扰思想再线性化落地到LADRC讨论了总扰动、LESO、带宽参数化和控制律设计最后给出了调试步骤和常见坑。我不敢说每个公式都推导得面面俱到但工程上要起步的这些东西我认为已经足够扎实了。根据我自己的调试经验刚开始用LADRC时最容易犯的错就是“太贪”——希望ωo和ωc都很大觉得这样性能就一定好。实测下来系统的瓶颈往往不是控制器而是传感器噪声和执行器物理极限。一个调得好的LADRC不是各项指标都拉满的LADRC而是在扰动抑制和噪声容忍之间找到平衡点的LADRC。所以如果你刚入门请保持耐心多观察z3的波形多体会“扰动估计”这件事在回路中是怎么运作的。一旦你把z3和真实扰动的对应关系“看顺眼”了LADRC的理解就算真正到位了。下一篇我会用Python写一个完整的仿真实例把移动平均扰动、阶跃扰动下的LADRC表现与PID对比展示出来同时给出离散化实现的完整代码。这里面有不少坑比如固定步长离散LESO的系数怎么推导、抗饱和怎么处理、参考轨迹前馈怎么加都是实战中摸爬滚打出来的经验。咱们下篇见。