搞自控的人,大概率都听过这样一句话:PID调得好,下班走得早;PID调不好,头发掉得早。这句话戏谑归戏谑,背后其实是很多工程师的真实处境——面对强耦合、大惯量、强扰动的被控对象,固定增益的PID往往不够用,于是不得不加前馈、加解耦、加自适应……系统越改越复杂,参数越来越多,最后连自己都说不清每个参数到底在干什么。这就是我当初转向线性自抗扰控制(LADRC,Linear Active Disturbance Rejection Control)的原因。如果你也在跟扭矩波动、负载突变、模型不确定性较劲,这篇文章就是写给你看的。
LADRC不是凭空冒出来的新花样,它脱胎于韩京清先生提出的自抗扰控制(ADRC),后由高志强教授在“带宽参数化”思路上做了线性化落地,让这套理论从学术论文走进程控代码。它最核心的价值在于:不再依赖精确的数学模型,而是把内部动态和外部扰动统一当作“总扰动”,用一个扩张状态观测器(ESO)把它估出来、再补偿掉。换句话说,PID在跟误差打架,LADRC在跟扰动的根因打架——方向完全不同。这篇博文是LADRC系列的第一篇,我会从最基础的概念讲起,把“为什么需要它”“它的框架是什么”“线性化怎么实现”“关键参数怎么整定”这些地基问题讲透,给后面聊实际工程案例打好底子。适合正在做控制系统设计、读论文读到ADRC但不知道从哪下手的同学,也适合已经在用PID、想给自己多留一条技术路线的工程师。
1. 为什么LADRC值得学:从三个让PID抓狂的场景说起
1.1 场景一:负载突变时,积分项为什么“帮倒忙”
先看一个非常典型的场景:你负责一套卷绕张力控制系统,卷径从空卷到满卷,转动惯量可能变化好几倍,而且物料换卷的瞬间张力会突然跳变。用常规PID,比例项看到误差立刻出力,但刚度有限;积分项为了消除稳态误差,一直在慢慢累积。问题是,积分累积的速度永远赶不上扰动变化的速度——扰动是阶跃式的,积分是斜坡式的,两者之间永远隔着一层。更麻烦的是,当张力传感器信号跳变或丢失时,积分项会一路“冲顶”,产生严重的积分饱和,等信号恢复,系统要花很长时间才能从饱和状态“退”回来,误差反而被拉得更大。
我见过不少工程师用抗积分饱和、条件积分、变速积分这些办法去修修补补,能缓解,但始终没解决本质问题:PID本质是误差驱动,它被误差拖着走,永远在“追”误差,而没有直接问“这个误差到底是谁造成的”。
1.2 场景二:模型不可靠,前馈加了等于白加
第二个让PID吃力的场景是“模型不完全可知”。做机电伺服的人最清楚,一个看似简单的Jθ̈ = Kt·i + τd方程,实际运行中J随负载变化,摩擦系数随温度和速度变化,电气时间常数随绕组温度漂移,还有死区、滞环、间隙……如果按标称模型算一个前馈量,模型一偏,前馈方向甚至可能反了,性能比不加还差。
LADRC的思路在这里发生了根本转向:既然精确模型搞不定,那我就不依赖它。把模型偏差、未建模动态、外部扰动全部打包成一个“总扰动”,用观测器实时估计、实时补偿。模型只需要提供一个大致的“控制增益b0”,相当于知道踩油门的“大致反应比例”,剩下的误差都靠观测器“摸”出来。
1.3 场景三:多回路级联,参数交叉影响让人头皮发麻
再有一个场景是层级嵌套。比如无人机姿态-速度-位置三环、电机电流-速度-位置三环,层与层之间的带宽必须拉开才能稳定。普通PID三环,每一环都有一堆参数,改内环会影响外环,改外环可能激发内环谐振,调试顺序稍有不慎就要推倒重来。
LADRC的优势在于,每一层都可以用“观测器带宽+控制器带宽”两个参数描述动态特性,整个系统的带宽关系非常透明,内环比外环快3~5倍的设计规则清清楚楚,不再是一团乱麻。这也是很多团队尝到甜头后不愿意退回纯PID的原因。
2. ADRC核心思想拆解:TD、ESO和NLSEF分别干了什么
2.1 跟踪微分器(TD):给信号安排一条“平稳路线”
讲LADRC之前,得先把ADRC的完整框架说清楚,因为LADRC是从它简化来的。ADRC经典三件套:跟踪微分器(TD)、扩张状态观测器(ESO)、非线性状态误差反馈(NLSEF)。
跟踪微分器解决的是“参考信号跳变”的问题。比如机械臂末端要从A点快速走到B点,如果直接给一个阶跃指令,执行器会拼命冲,但物理系统根本受不了这种加速度冲击。TD的作用就是同时输出的参考轨迹及其微分信号——也就是给参考信号“平滑化”,规划出一条既快又稳的路径,并把这条路径的“速度”也解算出来。
工程上,TD还承担一个额外职责:提取信号的微分。直接对带噪声的传感器信号求导,噪声会被放大到不可用;TD通过跟踪过程间接获得微分,相当于加了滤波,提取出来的速度信号平滑可用。这个思想后来在LADRC里依然重要,只是实现形式更简洁了。
2.2 扩张状态观测器(ESO):控制系统的“雷达”
ESO是整个ADRC框架的灵魂。普通状态观测器能估计系统状态变量,但ESO多了一个“扩张”状态——把总扰动当作一个额外的状态变量一起估计出来。
这个想法的巧妙之处在于:我们不需要知道扰动从哪里来、长什么样、是线性的还是非线性的,只要它可观测、有界,ESO就能实时追着它跑。用一个类比来说,ESO就像雷达,不只看到目标(状态),还看到目标身后的“遮挡物”(扰动),然后实时上报:“当前总扰动约等于多少,请补偿。”
在ADRC早期版本里,ESO用的是非线性函数(最典型的是fal函数,带幂次和线性区间切换),好处是收敛快、精度高,缺点也很致命——参数多、稳定性分析困难、调参高度依赖经验。这就直接引出了后面的线性化。
2.3 非线性状态误差反馈(NLSEF):用“大误差大增益、小误差小增益”取代积分
ADRC的第三件套是非线性状态误差反馈。传统PID靠积分消除稳态误差,但积分有滞后性。韩院士的洞察是:误差大时用小增益防止超调,误差中等时用大增益获得快速响应,误差小时用大增益压住扰动——非线性增益曲线可以人为设计出“大误差小增益、小误差大增益”的非线性关系(本质是近似一个变增益PD控制器),从而在不需要积分项的前提下实现无静差控制。
这打破了“必须用积分才能消静差”的惯性思维。只要观测器能把扰动补偿到位,系统近似成为纯积分串联型,PD就够用了,积分带来的相位滞后和饱和问题自然消失。这是ADRC与PID在控制哲学上最根本的分野。
3. 从非线性到线性:LADRC的简化逻辑与带宽参数化
3.1 高志强教授的关键一步:为什么敢把非线性“砍掉”
ADRC理论很优美,但在2000年代初期很难进入工程界。原因非常现实:fal函数里的幂指数α、线性区间δ、非线性反馈的增益β1、β2、β3……这些参数谁调谁知道,彼此之间耦合严重,没有一个清晰的物理意义,调参基本靠“玄学”。而且非线性系统的收敛性证明非常困难,学术界好发文章,工程界不敢用。
高志强教授做了一个“降维打击”式的简化:把非线性ESO改成线性观测器,把非线性状态反馈改成线性PD组合。从结构上,LADRC退化成了“线性扩张状态观测器(LESO)+ PD控制器”的组合,但它保留了ADRC最核心的思想——扰动估计与补偿。这一步的价值在于,一个原本需要试凑很多参数的控制器,被提炼成三个参数:观测器带宽ωo、控制器带宽ωc、控制增益b0。这三个参数全部有明确的物理意义和整定规则。
3.2 带宽参数化的推导:为什么是“3倍、3倍、1倍”
带宽参数化不是拍脑袋想出来的,它源于一个非常朴素的数学目标:让观测器的特征方程变成(λ+ωo)的n次方标准形式。
以二阶对象为例,扩张后的系统是三阶的(两个原状态+一个总扰动状态)。线性观测器的特征方程为:
λ³ + β1·λ² + β2·λ + β3 = 0
如果把期望的观测器极点都配置在同一个位置,即λ = -ωo处,那么期望特征方程是:
(λ + ωo)³ = λ³ + 3ωo·λ² + 3ωo²·λ + ωo³
对比系数,立刻得到:
β1 = 3ωo,β2 = 3ωo²,β3 = ωo³
这就是“三倍、三倍一次方、一倍三次方”的来历。控制器的PD增益同样通过带宽参数化配置:
kp = ωc²,kd = 2ωc
这意味着整个LADRC参数整定从一个“搜索问题”变成了一个“选带宽问题”——你只需要回答“系统希望多快”,再根据硬件约束定一个ωo和ωc的比例关系,参数就齐了。
3.3 线性化之后,丢掉了什么、保留了什么
很多对ADRC了解不深的人会担心:把非线性变成线性,是不是把精华也丢了?这个问题要辩证看。丢掉的确实是“大误差小增益、小误差大增益”这种精细的非线性调节能力,但换来的是:
- 稳定性分析工具丰富:线性系统理论、频域分析、鲁棒控制理论都能用;
- 参数物理意义明确:带宽就是带宽,跟系统的响应速度直接挂钩;
- 实现成本极低:不需要查表、不需要分段函数,几行C代码就写完;
- 调参门槛大幅下降:从“调5到6个参数”变成“调1到2个参数”。
从大量工程实践来看,LADRC在中低频段的表现与非线性ADRC几乎无差别,只在极高速、极大扰动的工况下,非线性版本略有优势。但对绝大多数工业对象来说,那点优势不值得付出成倍的调参代价。
4. LESO的数学原理与实现细节
4.1 二阶对象的三阶扩张状态方程怎么列
看一个最常见的二阶对象模型,比如电机位置环:
ẍ = f(x, ẋ, w, t) + b·u
其中f代表所有内部动态、未建模动态和外部扰动的总和,b是控制增益的真实值。我们不知道f的精确表达式,但假设它可观测。定义状态变量:
x1 = x(位置)x2 = ẋ(速度)x3 = f(总扰动,扩张状态)
假设总扰动变化缓慢,即ḟ约等于0(这不是要求f恒定,而是要求f的变化率相对于观测器收敛速度足够慢,实际由观测器带宽兜底),就可以写出扩张后的状态方程:
ẋ1 = x2 ẋ2 = x3 + b·u ẋ3 = 04.2 LESO观测器方程与增益配置的实现逻辑
根据状态方程构造线性扩张状态观测器(LESO):
ż1 = z2 + β1·(y − z1) ż2 = z3 + β2·(y − z1) + b0·u ż3 = β3·(y − z1)其中y是实际测量输出,z1跟踪y,z2跟踪ẋ,z3跟踪总扰动。β1、β2、β3按上一节带宽参数化的结果配置:
β1 = 3ωo β2 = 3ωo² β3 = ωo³这里有一个工程上必须说清楚的细节:模型里用的是b0(控制增益的估计值),而不是真实b。LESO在运行中会同时面对“b0与b不一致”带来的建模误差,这个误差同样会被归入z3这个总扰动状态中去,由观测器一并估计。这是LADRC对模型不确定性宽容的数学根源。
4.3 离散化实现是初学者最常翻车的地方
理论方程看着清爽,写进代码就是另一回事了。连续域设计的观测器增益,在离散化之后会引入一个非常隐蔽的问题:观测器极点从连续域映射到离散域时,位置会发生偏移。如果你的控制周期是1kHz,ωo取30 rad/s,偏移还不明显;但当你把ωo推到150甚至200 rad/s,也就是控制周期的1/10以上时,直接使用连续域增益会导致观测器实际行为与设计偏差越来越大,极端情况下离散化后直接不稳定。
工程中常用的离散化方法有三种:前向欧拉、后向欧拉、双线性变换(Tustin)。我自己的习惯是:
- 控制器周期在1kHz以上、ωo小于采样频率的1/20时,前向欧拉完全够用,代码最简单;
- 控制器周期在500Hz到1kHz之间,建议用双线性变换,精度和实现复杂度平衡最好;
- 对快速系统(比如电力电子变换器),直接在设计时就把离散极点配置到指定位置,不要通过连续域转换,用MATLAB的
place函数在离散域求解增益最稳。
写代码时还有一个所有教程都不会提醒你的细节:LESO的递推要使用上一时刻的u(控制量),不是当前时刻的u。因为实际代码中控制量是先算出来、后输出到执行器的,如果写成先更新观测器再算控制律,观测方程里用的u和实际作用于对象的u就差了整整一个周期。这个时序问题会导致观测误差在高带宽下急剧放大,是我帮人排查LADRC调试问题时遇到过最多的低级错误。
5. LADRC的完整控制律与闭环带宽整定
5.1 控制律u = (u0 − z3) / b0到底在干什么
LADRC的控制律非常简单:
u = (u0 − z3) / b0其中z3是LESO对总扰动的实时估计,u0是一个虚拟控制量。把u代入原对象模型,会得到有趣的约简:
ẍ = f + b·u ≈ f + b·(u0 − z3) / b0如果b0近似等于b,且z3近似等于f,则f和z3相互抵消:
ẍ ≈ u0这就是LADRC最核心的魔法:原本那个带扰动的复杂对象,在控制器的视角里被“校正”成了一个简单的双重积分器。剩下的任务就简单了——设计u0去控制一个纯积分串联对象,PD就绰绰有余:
u0 = kp·(r − z1) − kd·z2注意这个等式的微妙之处:不直接用测量值y和ẏ,而用观测器输出z1和z2。原因是LESO自带滤波效果,观测器输出的z1、z2比原始传感器信号更干净,尤其是速度信号z2避免了直接微分的噪声放大问题。这一点在工程上价值巨大。
经过带宽参数化,kp和kd设置为:
kp = ωc² kd = 2ωc此时闭环系统的传递函数近似为一个标准的二阶系统:
G(s) ≈ ωc² / (s² + 2ωc·s + ωc²)
阻尼比为1,临界阻尼,无超调,调节时间约等于4.4/ωc。这个结论非常漂亮——你选一个ωc,就精确知道系统会多快稳定,不再需要反复试凑。
5.2 观测器带宽ωo与控制器带宽ωc的整定关系
LADRC参数整定的核心关系就一个:观测器带宽必须明显高于控制器带宽。
为什么?因为LESO的作用是“实时供应”扰动估计和状态估计,如果观测器本身反应慢,控制律拿到的是一个滞后的补偿量,扰动不但没被抵消,反而可能被错误放大。从频域角度看,观测器通道的滞后会降低相位裕度。
经验法则是:
- 最简单:
ωo = 3~5ωc。这是高志强教授在各种论文和课程里反复推荐的比例,适用于大部分机电系统; - 测量噪声小时可适当加大,取
ωo = 5~10ωc,扰动抑制更积极; - 测量噪声大时反而要降低,取
ωo = 2~3ωc,通过牺牲一部分扰动估计带宽换取平滑性。
还有一个反直觉的坑:把ωo调得过高,不一定会让系统更好。观测器带宽高于传感器采样频率的1/10时,离散化误差和测量噪声会被放大,z2(速度估计)和z3(扰动估计)可能出现高频抖振,这些抖振通过控制律直接输入执行器,造成不必要的发热和磨损。我调试某型转台时就踩过这个坑,把ωo从80调到120,扰动抑制确实好了,但电流环开始出现明显的毛刺声,最后不得不回调到100并加了低通滤波才平衡。
5.3 控制增益b0的工程辨识技巧
b0可以理解为“单位控制量能产生多大加速度”的估计值。它不要求精确,但对系统稳定性影响很大:b0偏大会导致补偿不足,扰动抑制能力下降;b0偏小会导致过补偿,甚至引发振荡。
工程上辨识b0有两条路:
离线辨识法:给对象一个恒定的控制输入u,等系统进入匀加速阶段后,测量输出的二阶差分除以u,就是近似的b0。比如位置环系统,给定恒定速度指令,记录位置曲线,拟合二次项系数就得到b0。也可以在开环下给阶跃控制量,直接测加速度变化率。
在线自整定法(渐近法):先用一个偏保守的估计值让系统稳定运行,然后观察LESO输出的z3(总扰动估计)是否呈现“脉冲样跳变”。如果z3在控制量突变时刻出现大的尖峰,说明b0不准确,此时根据z3尖峰的方向调整b0——若z3尖峰与控制量同符号,说明b0偏小;反符号则偏大。一般来说,b0做到“真实值的60%到150%之间”LADRC都能稳定工作,这个容错范围对工程应用非常友好。
另一个不得不提的工程细节:当控制量饱和(比如PWM占空比打满)时,LESO的观测方程里用的u是饱和后的值还是计算值,结果截然不同。如果用的是饱和前计算出来的u,观测器会以为对象正在接受一个很大的输入,从而低估补偿需求,等退出饱和时z3已经偏离实际,系统会出现延迟纠正的现象。正确做法是:观测器必须使用饱和后的实际输入值,在代码里就是clamp之后、送往执行器之前的值。这个问题在LADRC里与PID的积分饱和问题同样致命,但比积分饱和更难察觉。
6. 从理论到应用:LADRC适合什么场景、不适合什么场景
6.1 已经验证过的典型应用案例
LADRC在工程上推广速度很快,我梳理几个坡度较小的典型应用,供刚开始接触的人找感觉:
- 电机伺服系统(位置环/速度环):这是LADRC最经典的试验田。负载转动惯量变化、摩擦转矩突变、齿槽转矩脉动,这些扰动的频率和幅值都很适合LESO发挥作用。很多文献实现了“无速度传感器”的转速估计,因为LESO的z2本质上就是一个速度估计器;
- 无人机/导弹姿态控制:飞行器在飞行中气动参数变化剧烈,模型不确定性大,LADRC不需要精确知道气动导数就能稳住姿态,而且姿态环和角速度环可以统一用LADRC实现,结构比PID串级更简洁;
- 电源变换器(Buck/Boost等):输入电压突变和负载突变是电源设计最头疼的事,LADRC的扰动补偿能力在电压环上有天然优势,尤其是数字化电源里实现成本很低;
- 运动控制与机器人:机械臂关节的惯量随姿态变化,LADRC可以在不依赖精确动力学模型的前提下保持轨迹跟踪精度;
- 过程控制(温度、压力、流量):大惯性、纯滞后明显,常规PID很难兼顾响应速度和超调,LADRC配合适当的滤波器可以得到比PID更顺滑的过渡过程。
6.2 工程边界:什么情况下LADRC可能不是最优解
再好的方案也有边界。LADRC不能包打天下,以下情况你要特别警惕:
- 测量噪声极大或严重丢包:LESO需要足够好的测量信号作为输入。如果传感器噪声和有效信号的比值很高,观测器带宽只能压低,而控制器带宽也跟着受限,性能可能还不如调教精良的PID加滤波器;
- 执行器存在明显非对称性和强非线性:比如液压系统的死区、伺服阀的滞环非常严重时,LESO把非线性当作扰动估计没有问题,但控制量饱和后系统可达性下降,观测器可能被迫在无解的输入条件下工作;
- 系统存在纯滞后:LADRC的扰动补偿模型默认控制量立即作用于加速度,如果对象本身有大的纯滞后,LESO的估计会明显超前于实际输出,直接套用会出现超调。这时候需要引入Smith预估器或设计专门的滞后补偿结构,不能拿LADRC硬套;
- 非常高的频段要求:LADRC有源抑制中低频扰动很出色,但在高频段,观测器带宽受采样频率和噪声双重限制,高频扰动抑制能力并不突出。对振动抑制要求极高的精密装备,还是得结合专门的谐振控制器或陷波滤波器。
6.3 学习LADRC的实操路径建议
我的建议是,别一上来就啃高志强教授的原始论文。按照“先会跑通仿真,再理解为什么能跑通,最后替换到真实系统”的路径:
- 用Simulink或Python搭一个二阶对象模型,先不加扰动,把LADRC闭环跑通,观察z1、z2、z3三个观测变量是否分别跟踪位置、速度和总扰动。这是建立“观测器直觉”最重要的一步;
- 逐步加入模型不确定性、外部扰动、量测噪声,观察LADRC的表现退化过程,体会ωo和ωc的相对关系如何影响控制质量;
- 对比PID与LADRC:在同一对象、同一扰动下,把两套参数都调到“你认为的最佳”,再对比阶跃响应和抗扰能力。这个对比过程会让你真正理解两种方法在思路上的差异;
- 在真实硬件上先跑位置环或转速环,尽量选择你熟悉的对象,这样可以把注意力集中在观测器时序、饱和处理这些实现细节上,而不是被对象本身的问题干扰;
- 最后再回头读经典论文。有了“跑通”的经验,再去读原理推导,你会对每个公式背后的工程动机有更深的感受,而不是停留在数学推导层面。
我自己的体会是,LADRC的入门最大障碍不是数学,而是思维惯性。大多数用惯了PID的人,潜意识里还是会去“调比例、调积分、调微分”,遇到问题就下意识地去找“再加一个环路会不会更好”。LADRC要求你换一套坐标系去思考问题——不问“误差怎么变化”,而问“扰动是什么、补偿到位没有”。一旦过了这个坎,你会发现许多以前需要专门设计复杂控制结构才能解决的问题,用LADRC一个框架就能统一处理,系统的层次感一下子清晰了很多。
后面的系列文章里,我会接着聊LADRC的实际参数整定全流程、与PID串级的对比实验数据、以及在具体硬件平台上的离散化实现和调试技巧。如果你正打算把某个对象切换到LADRC控制,建议先把这篇的基础概念吃透,尤其是LESO的时序和b0的辨识方式,这两块是实际项目中最容易出问题、也最能体现调试水平的地方。别急着抄代码,先把“总扰动”这个概念在脑子里扎根,后面所有的细节都会水到渠成。