ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

线性自抗扰控制LADRC实战解析:从总扰动观测到双带宽整定

线性自抗扰控制LADRC实战解析:从总扰动观测到双带宽整定 干控制这行特别是碰上那些模型本来就拧不清楚、外部扰动还一刻不停的对象时PID调来调去总会在“抗扰猛”和“超调飞车”之间反复横跳。后来我认真啃了一遍线性自抗扰控制LADRC算是把这口气顺过来了。LADRC是自抗扰控制ADRC家族里最实用的一个分支——它用线性扩张状态观测器去估算系统内部动态和外部扰动的总和然后在控制量里直接把这笔“总账”抵消掉剩下的控制规律就成了一个朴素的PD加补偿结构。这篇文章专门梳理LADRC最基础的知识点适合刚接触这个概念、想从原理上搞懂并准备往实际项目里落地的同学。1. 为什么需要LADRC从PID的困境说起1.1 PID控制器解决不了什么PID是工业控制里的老黄牛结构简单、鲁棒性强但也别指望它包打天下。我自己的体会是PID本质上在做一件“事后修正”的事误差出来了比例项拉一把积分项慢慢清掉稳态误差微分项试图预测趋势。问题恰恰出在这里。第一积分项是把双刃剑。它确实能消除稳态误差但它会对相位产生滞后而且一旦误差持续存在积分会不停堆积反映到响应上就是超调变大、调整时间变长。你要是把积分增益压小稳态误差又清不干净加大系统又容易振荡。第二实际对象的模型不确定性比教科书里严重得多。真正的被控对象往往有未建模动态、参数随工况漂移、摩擦力、间隙、外部负载突变等等。PID的参数整定是基于某个工作点的一旦工况变到另一个区域原来那套增益就不适用了。第三也是我最想强调的一点PID实际上没有“区分扰动”的概念。它只知道误差大就用力推不管这个误差是来自外部负载突变还是模型参数漂移。所以当我们面对强扰动、快时变的系统时PID就会显得力不从心。1.2 换个思路与其消除误差不如直接观测扰动LADRC的思想和PID完全不在一个维度上。它不再执着于“怎么根据误差来修正”而是先问一个问题这个系统为什么会产生误差答案看起来其实非常朴素因为系统里有一个“总扰动”在捣乱。这个总扰动包含了外部负载、未建模动态、参数摄动、耦合项等几乎所有不确定因素。如果能把这个总扰动估计出来然后在控制量里反向抵消掉那么系统对控制器呈现出来的就只是一个干干净净的积分器串联结构——这时候再想让它怎么动就完全听我们安排了。我习惯打个比方你开车走一段坑洼烂路PID的做法是等车身颠簸了你再打方向修正LADRC的做法是提前看清路面起伏直接调整油门和方向把颠簸在产生之前就压下去。当然现实中不可能完全预知但扩张状态观测器确实能把这种“扰动实时估计”做到足够好的程度。1.3 ADRC到LADRC一次简化带来的普及自抗扰控制最早是韩京清研究员在20世纪90年代提出来的核心框架包括跟踪微分器TD、扩张状态观测器ESO和非线性状态误差反馈NLSEF。非线性形式的效果不错但一个要命的问题是——参数太多了整定全靠经验工程推广特别困难。后来高志强教授把其中的非线性环节全部线性化提出了线性自抗扰控制也就是LADRC。这一简化看起来只是“把非线性函数换成线性增益”但意义非常重大整个控制器的可调参数被压缩到了两个——观测器带宽和控制带宽而且这两个参数都有明确的物理意义和整定方向。从此ADRC从“高手玩具”变成了“工程师工具”这也是LADRC能在运动控制、电力电子、飞行控制等领域迅速铺开的核心原因。2. LADRC核心思想与理论框架2.1 总扰动把一切不确定性装进同一个篮子LADRC的立论基础是“总扰动”这个概念。考虑一个n阶单输入单输出系统y^(n) f(y, y, ..., y^(n-1), w, t) b0 * u这里的f包含了系统内部动态、未建模部分和外部扰动w合起来就叫总扰动。b0是控制增益的估计值一般不需要精确只需要知道一个大概的量级和符号。为什么要这样写因为大部分被控对象无论多复杂在最顶层看来都可以归结为“输入怎么影响输出的最高阶导数”这个问题。摩擦力大、负载重、参数漂了、耦合过来了这些乱七八糟的东西全部是被塞进f里的对控制器而言它们的身份是一样的——都是需要被估计和抵消的扰动。这个“统一视角”非常关键。你不必再去分辨某个误差来源究竟是摩擦还是负载突变因为它们对控制的需求是相同的估计出来补偿掉。2.2 系统描述与扩张状态模型要把总扰动“观测”出来标准做法是把f扩张成一个新的状态变量。设x1 y x2 y ... xn y^(n-1) x(n1) f那么原系统就可以写成一阶微分方程组的形式x1 x2 x2 x3 ... xn x(n1) b0 * u x(n1) f y x1这里x(n1)就是我们扩张出来的状态代表总扰动。f是总扰动的变化率在观测器设计里通常假设它是有界的并不需要知道它的具体值。这样一个n阶系统就变成了n1阶系统。这一步操作在数学上很简单但思想很深刻原本“看不见摸不着”的不确定性现在被形式化成了一个状态可以用标准的状态观测器理论去估计它了。我当初第一次看懂这一步时觉得特别惊艳相当于把哲学问题变成了数学问题。2.3 线性扩张状态观测器LESO的设计有了扩张状态模型下一步就是用线性状态观测器来估计这些状态。观测器方程长这样z A z B u L (y - y_hat) y_hat C z其中L是观测器增益向量L [β1, β2, ..., β(n1)]^TLESO的任务就是让估计状态z快速逼近真实状态x。当观测器收敛时z1 → y z2 → y ... zn → y^(n-1) z(n1) → f观测器带宽这个概念就是从L的选取里引出来的。如果我们把观测器的n1个特征值都配置在同一个位置-s -ωo上也就是让观测器响应速度由ωo决定那么观测器增益向量就有很规整的形式比如二阶系统的情况是β1 3ωo, β2 3ωo², β3 ωo³这个带宽参数化设计让观测器整定变得极其简单想要观测器快一点就把ωo调大怕噪声放大就把它往回调。2.4 控制律从估计值到控制量的路径LADRC的控制律分两步走。第一步设计一个虚拟控制量u0它只负责把系统变成一个理想的积分串联形式第二步用总扰动的估计值z(n1)来抵消真实扰动生成实际控制量u (u0 - z(n1)) / b0虚拟控制量u0通常就是一个PD控制器它的目的是让系统的输出跟踪参考输入ru0 kp(r - z1) - kd1*z2 - kd2*z3 - ...其中kp、kd这些控制器增益也是按带宽参数化来配置的。比如二阶系统控制器增益可以取kp ωc², kd 2ωc这样配置下来闭环系统的特征多项式就变成了经典的s² 2ωc s ωc²阻尼比恰好为1响应特性和你设定的ωc直接相关。我们不需要去抠那些高阶模型的精确极点只要盯着ωc这一个旋钮来调动态响应速度。把控制律和观测器合在一起LADRC的完整结构就很清晰了LESO负责“看”扰动PD加补偿负责“治”系统。观测器带宽ωo和控制带宽ωc一快一慢、一前一后配合默契。3. 带宽参数化LADRC最实用的一步3.1 为什么能简化到只剩两个参数传统ADRC被人诟病最多的就是参数难调。非线性的ESO有几个增益参数非线性状态反馈又有一堆参数再加上跟踪微分器的参数叠在一起十几个参数都能数出来光是理解每个参数的作用就要花半天。LADRC的带宽参数化本质上做了一件事把原本散乱的观测器增益和控制器增益统一映射成两个带宽。观测器的n1个极点全部放在-ωo控制器的n个极点全部放在-ωc这样一来无论系统阶次多高你只需要面对ωo和ωc两个参数。很多人第一次接触LADRC时觉得“太理想化了肯定有坑”。实际用下来我的感受是参数少了确实会牺牲一点点最优性但对绝大多数工程对象来说换来的是巨大的实用性和可移植性。同一个控制器结构昨天挂在电机上今天挂到温度对象上只需要重新估计一下b0、重新调两个带宽就行不用把整条代码推翻重来。3.2 ωo和ωc的物理含义与整定方向ωo是观测器带宽它决定了扩张状态观测器的收敛速度。观测器比系统快才能及时把扰动估计出来供补偿使用。ωc是控制带宽它决定了闭环系统的响应速度——可以粗糙地理解为“系统有多快跟随指令有多快抑制低频扰动的能力有多强”。工程整定上我习惯用一条顺序先估b0这是唯一需要的模型信息取一个大致正确的值。先把ωs设置在一个较小的值比如1到5 rad/s确保系统稳定。逐步增大ωs直到响应速度满足需求但也要注意控制量不要饱和。再把ωs设置在ωs的3到7倍之间具体根据测量噪声程度调整。如果噪声明显适当降低ωs或对测量信号做滤波。3.3 参数整定误区我最常看到的新手问题是把ωo调得远远高于ωs恨不得观测器“瞬间”收敛。理论上观测器越快越好但实际系统有采样频率限制测量信号有噪声ωo太高时观测器会放大高频噪声估计出的“扰动”里全是毛刺控制量也跟着抖。类似地ωs也不是越大越好过高的控制带宽会激发未建模高频动态直接把系统抖振出来。这两个参数本质上是在“扰动估计速度”和“噪声容忍度”以及“响应速度”和“执行器负担”之间做权衡。下面这张表是我个人常用的参数影响速查参数增大后的效果过大的风险b0控制增益估计值变大补偿力度相对变小系统响应变慢稳态误差增大ωs闭环更快跟踪能力更强控制量易饱和激发高频动态ωo扰动估计更快更准噪声放大观测器可能不稳定采样时间Ts——太大会限制可用的ωo和ωs4. 用一阶和二阶系统走通LADRC全流程4.1 一阶系统最简单的热身对象考虑最常见的一阶惯性对象比如一个直流电机的转速模型y a*y b*u d(t)其中d(t)是外部负载扰动。把内部动态ay和外部扰动合并成总扰动f ay d(t)那么系统就可以写成y f b0*u扩张状态设为x1 yx2 f则x1 x2 b0*u x2 fLESO方程是z1 z2 β1(y - z1) b0*u z2 β2(y - z1)一阶系统的观测器增益按带宽参数化取β1 2ωo, β2 ωo²控制律是u (u0 - z2) / b0 u0 kp(r - z1) ωs*(r - z1)当观测器收敛后系统近似变成一阶积分器y ≈ u0 ωs*(r - y)闭环传递函数近似为y r / (1/ωs * s 1)就是一阶惯性环节时间常数直接由ωs决定。想要转速响应快就把ωs调大。这个设计过程线性、透明每一步都有明确的物理意义。4.2 二阶系统工程里的大头很多机电系统比如伺服电机的角位置控制、质量弹簧阻尼系统本质上都是二阶的。二阶系统比一阶多了个加速度通道LADRC处理起来也不难。考虑y f(y, y, w, t) b0*u扩张状态设为x1 yx2 yx3 f则x1 x2 x2 x3 b0*u x3 fLESO方程为z1 z2 β1(y - z1) z2 z3 β2(y - z1) b0*u z3 β3(y - z1)观测器增益取β1 3ωo, β2 3ωo², β3 ωo³控制律采用PD形式u (u0 - z3) / b0 u0 kp(r - z1) - kd*z2 kp ωc², kd 2ωc代入之后系统近似变成y u0 ωc²(r - y) - 2ωc*y整理一下就是标准二阶系统y 2ωc*y ωc²*y ωc²*r阻尼比恰好是1也就是临界阻尼。这意味着在理想情况下系统对阶跃输入没有超调响应速度由ωc决定。这个特性在工程上非常讨喜——不需要反复权衡超调和快速性。4.3 b0那个唯一的“模型痕迹”LADRC号称不依赖模型但有一个地方还是需要粗略的模型信息就是b0。b0表示控制输入对输出最高阶导数的增益大小它决定了“同样的控制量能产生多大的加速度/速度影响”。b0不准会怎样我实测下来的体会是b0偏大控制器会认为“控制量很顶用”实际补偿力度会偏弱导致抗扰能力下降、响应偏慢。b0偏小控制器会认为“控制量不给力”实际补偿过量系统容易出现振荡甚至发散。只要b0在真实值的0.5到1.5倍范围内闭环系统通常还是稳定的拉宽应用面。所以实际工程中b0并不需要精确辨识只需要利用物理常识估算一个量级。比如电机驱动系统你可以根据铭牌参数、额定电流和最大加速度大致估算温度系统可以根据加热功率和升降温速度来粗略推算。关键是数量级别错符号别错。5. 仿真实验快速验证LADRC效果5.1 一个最简单的Python仿真骨架纸上谈兵没用我还是建议动手跑一个仿真。下面给一个我经常用来验证一阶LADRC效果的Python骨架用最普通的欧拉法积分几行代码就能看清核心逻辑import numpy as np import matplotlib.pyplot as plt # 被控对象参数: y a*y b*u d(t) a -0.5 # 对象极点 b 1.5 # 真实控制增益 b0 1.2 # 估计增益故意和真实值有偏差 ts 0.001 t_end 10.0 n int(t_end / ts) # LADRC参数 wc 4.0 # 控制带宽 wo 15.0 # 观测器带宽 beta1 2 * wo beta2 wo ** 2 kp wc # 状态初始化 y 0.0 f 0.0 z1 0.0 z2 0.0 u 0.0 r 1.0 # 参考输入 time [] y_log [] u_log [] z2_log [] for i in range(n): t i * ts time.append(t) y_log.append(y) u_log.append(u) z2_log.append(z2) # 外部扰动: 在第3秒突然加上 if 3.0 t 5.0: d 0.8 else: d 0.0 # 总扰动(真实值) f a * y d # LESO e y - z1 z1 ts * (z2 beta1 * e b0 * u) z2 ts * (beta2 * e) # 控制律 u0 kp * (r - z1) u (u0 - z2) / b0 # 被控对象 y ts * (a * y b * u d)这个骨架虽然简单但已经能把LADRC的三大核心模块都跑起来了对象有内部动态和外部扰动LESO实时估计总扰动控制律做补偿。真实项目中你只需要把这里面的“对象更新”换成实际系统的微分方程或者直接用硬件采集的数据就行。5.2 结果怎么解读三个关键指标跑完仿真后我一般关注三个地方第一是主输出y对参考输入r的跟踪情况。理想情况下系统应该平滑地逼近阶跃输入没有超调因为阻尼比被配置为1。如果看到明显的超调那说明观测器还没收敛好或者b0偏差太大。第二是z2总扰动估计值对真实总扰动f的跟随情况。在第3秒突加扰动时z2应该迅速跟上f的变化这个响应速度就是观测器带宽ωo的直接体现——ωo越大跟得越快但噪声风险也越高。第三是控制量u的曲线。正常情况下扰动出现时控制量会立即跳变以抵消扰动这其实就是一个“前馈补偿”的动作和PID那种等误差出来再修正的行为有本质区别。5.3 初学者最容易掉的坑仿真阶段最常见的坑是我上面这个骨架里也“埋”过的——b0和真实b不一致。很多人直接把b0设成1发现仿真结果不对就开始怀疑LADRC本身有问题。其实LADRC对联的系统设计是有余量的b0差到20%到30%都能正常工作但你要是差个3倍5倍那控制器就会表现出要么飘、要么抖的怪脾气。另一个坑是仿真步长。LADRC本质上是连续域设计但实现必然要靠离散化。仿真步长如果太大LESO很容易发散哪怕原理上没问题。一般来说仿真步长应该至少比1/ωo小一个数量级最好满足ΔT * ωo 0.1。否则观测器在离散世界里根本追不上真值。6. 常见问题与排查技巧实录6.1 LESO状态不收敛怎么办我遇到最多的现象是z1“粘”不住y甚至来回振荡。这一步先别急着怀疑算法先查三件事第一件b0的符号是不是对了b0符号错了整个补偿方向是反的观测器必定发散。这是最低级但也最容易犯的错特别是做实物的时候执行器接反就完蛋。第二件离散步长是不是太小了。LESO本质上是高增益观测器离散化后如果采样频率不够高增益再配上高频极点那就相当于在离散系统里逼近不稳定传递函数。解决办法是降低期望的ωo或者换用更好的离散化方法。第三件测量信号的信噪比。LESO对测量噪声是敏感的尤其是ωo调得很高的时候。如果测量本身就是毛刺估计出的总扰动也会全是毛刺。这时候宁可牺牲一点观测速度也要把ωo降下来。6.2 抗扰效果不佳怎么调抗扰效果差老百姓的话叫“系统反应迟钝”常见原因排行榜如下ωo太低观测器还没看清扰动扰动就已经把系统带偏了。这种时候把ωo往上调一般立竿见影。b0偏大补偿力度不足。适当调小b0相当于给补偿环节“增益放大”。ωc太低闭环抑制低频扰动的能力本来就弱。提高ωc能改善跟踪和低频抗扰但要注意别超调别饱和。我调试时习惯做一组梯度实验固定其他参数把目标参数从小到大扫一遍看输出和控制的响应曲线。这样比盲目调参快得多。6.3 测量噪声大怎么处理总有人问我LADRC是不是对噪声特别敏感说实话任何带高增益观测器的控制方案都逃不脱噪声问题LADRC只是把这个问题摆到了明面上——ωo就是噪声放大器的旋钮。实践中的处理手段无非这么几种一是降低观测器带宽让它别那么敏锐二是对测量信号做低通滤波或跟踪微分器预处理三是用更高阶但有滤波能力的观测器形式。第三种需要修改观测器结构一般工程上不太折腾我建议优先前两种。如果单靠调参数压不住噪声还可以在参考信号那一侧加前置滤波不让参考值突变直接冲击控制器。不过核心原则一直很简单观测器带宽要足够“看清”扰动但别高到把噪声也当扰动。6.4 一页纸读懂LADRC排查速查表现场症状可能原因处理优先序系统发散、状态飞出b0符号错、采样慢先查符号再把ωo调低有超调、跟踪慢ωc偏低、b0偏大先升ωc再微调b0扰动来了回不去ωo偏低、b0偏大先升ωo再降b0控制量高频抖动ωo过高、测量有噪先降ωo再考虑滤波执行器频繁饱和ωc太高、参考突变降ωc加前置滤波器我个人在实际项目里用下来的感受是LADRC最打动人的地方不是它“高级”而是它“好用”。它把传统控制里那些不可言说的调参玄学压缩成了两个物理意义明确的带宽又把扰动的概念从模糊的感觉变成可观测的状态。强烈建议你先用仿真把上面那一套一阶二阶例子跑通再上实物。等你在真实系统上体会到LESO把负载突变“看穿”的那一下你会回来感谢高志强教授这个带宽参数化的。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进