ADRC自抗扰控制:从核心原理到电机电流环实战应用

1. 项目概述:从PID到ADRC,控制算法的“降维打击”

在工业控制、机器人、电力电子这些领域摸爬滚打久了,你一定会对PID控制器又爱又恨。爱它的简单直观,几个参数调来调去,大部分时候都能让系统“动起来”;恨它的“娇气”,面对非线性、强耦合、大时滞或者外部扰动,PID就像个经验不足的舵手,要么反应迟钝,要么剧烈震荡,调参调到怀疑人生是常有的事。我当年调试一个伺服系统,为了应对负载突变,PID参数前前后后改了不下五十版,最后还是加了前馈和各种滤波才勉强能用,过程极其痛苦。

后来接触到自抗扰控制(ADRC),感觉像是打开了一扇新世界的大门。它不像一些现代控制理论那样,需要精确的数学模型,也不像模糊控制、神经网络那样“黑箱”。ADRC的核心思想非常“霸道”:不管系统内部具体是什么结构,也不管外部来了什么妖魔鬼怪(扰动),我统统把它们打包成一个“总扰动”,然后实时估计并补偿掉。剩下的,就是一个被我“驯化”好的、简单的积分串联型系统,用最简单的控制律就能搞定。这种“观测-补偿”的思路,对于咱们这些一线工程师来说,直观又实用。最近在搞永磁同步电机的电流环控制,传统的PI调节器在高速弱磁区或者参数变化时,性能下降明显。换上ADRC后,动态响应和抗扰能力提升了一个档次,参数也更好整定。网上流传的ADRC算法m文件我也研究过不少,有的写得很精妙,有的则存在理解偏差。今天,我就结合自己的实战经验,把ADRC从核心思想到代码实现,掰开揉碎了讲清楚,目标是让你看完就能理解原理,并且能动手在自己的项目里尝试应用。

2. ADRC核心思想与架构拆解:把复杂问题“打包”解决

ADRC的发明者韩京清研究员提出这一理论时,目标很明确:找到一种既不依赖精确模型,又能实现高性能鲁棒控制的方法。它的整体架构可以概括为“三部分”:跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈(NLSEF)。咱们先抛开这些术语,用个生活化的例子来理解。

想象一下你在开车,目标是让车速稳定在100km/h。传统的PID控制器就像是你只盯着速度表(当前误差),发现慢了就多踩点油门,发现快了就松一点。但如果遇到上坡(负载扰动)、逆风(外部扰动)或者车子本身发动机响应特性变了(模型不确定性),你这个“只看速度表”的策略就会很被动,容易产生超调或调节缓慢。

ADRC的做法则像是一个经验丰富的老司机搭配一个智能副驾:

  1. 智能副驾(TD):他不满足于当前速度,还会根据路况和你想要的速度,规划出一条平滑过渡的理想速度曲线。比如从80加速到100,他不会让你瞬间踩到底,而是规划一个既快速又平缓的加速过程,避免冲击。这就是TD的作用——安排过渡过程,并提取出理想的系统状态(比如理想位置、理想速度)。
  2. 超级雷达(ESO):这是ADRC的灵魂。这个雷达不仅能看到车的实际速度和位置(系统输出),还能实时“看见”并估算出所有影响车速的因素总和:包括你踩的油门(控制量)、上坡的阻力、逆风、发动机的损耗等等。它把这些乱七八糟的东西全部打包,估算成一个叫做“总扰动”的信号。ESO的强大之处在于,它不需要知道坡有多陡、风有多大,它只通过观察车的实际运动,就能把这个“总扰动”实时算出来。
  3. 决策大脑(NLSEF):大脑拿到两个信息:一是智能副驾规划的理想状态(来自TD),二是超级雷达提供的实际状态和总扰动估计(来自ESO)。大脑计算两者的误差,并根据误差的大小和变化率,以一种非线性的方式(比如,误差很大时增益大,误差很小时增益小,避免高频颤振)计算出最初的控制力。但是,这还没完!最关键的一步来了:大脑会从初步控制力中,减去雷达估算出的“总扰动”。这样一来,实际作用到车子上的控制指令,就相当于是在一个“无扰动”的理想环境下发出的指令。

所以,ADRC的流程就是:规划理想轨迹 -> 观测并估计所有内外部扰动 -> 基于理想轨迹和实际状态的误差计算控制量 -> 补偿掉估计的扰动 -> 得到最终控制指令。经过这样的处理,无论系统本身多复杂,外部环境多恶劣,被控对象在控制器“眼”里,都近似变成了一个简单的、干净的积分器串联型系统,自然就好控制了。这就是其“自抗扰”能力的根源——自己抵抗、补偿扰动。

2.1 核心组件一:跟踪微分器(TD)—— 柔化指令,提取微分

TD经常被初学者忽略,觉得它不就是给个设定值吗?其实它的作用至关重要。直接给系统一个阶跃设定值,相当于要求输出瞬间跳变,这对于物理系统来说意味着需要无穷大的能量和控制力,必然引起剧烈冲击和超调。

TD的核心作用是“安排过渡过程”。它接收一个跳变的指令信号v,然后输出一个平滑的跟踪信号v1及其微分v2。最经典的TD算法是韩老师提出的最速控制综合函数(fhan)离散形式。它的内部是一个离散差分方程,通过非线性反馈,使得v1能以最快速度无超调地跟踪上v,同时v2v1的合理微分,避免了直接数值微分的噪声放大问题。

在实际编程中(比如写那个ADRC算法m文件),TD的代码可能长这样:

function [v1, v2] = TD(v, v1, v2, h, r) % v: 当前目标值 % v1, v2: 上一时刻的跟踪值及其微分 % h: 离散积分步长 % r: 速度因子,决定跟踪快慢 d = r * h; d0 = h * d; y = v1 - v + h * v2; a0 = sqrt(d*d + 8*r*abs(y)); a = v2 + (a0 - d)/2 * sign(y); if abs(y) > d0 a = v2 + sign(y) * r; end v2 = v2 + h * fsg(a, d, r); % fsg是一个符号函数 v1 = v1 + h * v2; end

注意:参数r非常关键。r越大,跟踪速度越快,但会对噪声更敏感。通常需要根据系统响应能力和采样频率来调整。h就是你的控制周期。

2.2 核心组件二:扩张状态观测器(ESO)—— 扰动估计的灵魂

ESO是ADRC实现“抗扰”的核心。它的思想是将系统的总扰动(包括未建模动态和外部扰动)扩张成一个新的状态变量,然后设计一个观测器对这个新状态(即扰动)进行实时估计。

假设我们有一个二阶系统(很多电机、位置控制都可以简化成二阶):ÿ = f(y, ẏ, w, t) + b*u其中f是未知的内部动态和外部扰动w的总和,b是控制增益(通常可粗略估计)。

ESO把这个系统重新表述为:ẋ1 = x2ẋ2 = x3 + b*uẋ3 = ḟ(假设扰动变化率有界)y = x1这里,x1是系统输出yx2是输出的微分,而x3就是我们扩张出来的状态,用来代表总扰动f

然后,我们设计一个龙伯格观测器(Luenberger Observer)来估计这三个状态:e = z1 - y(观测误差)ż1 = z2 - β01 * eż2 = z3 - β02 * e + b*uż3 = -β03 * e其中z1, z2, z3分别是x1, x2, x3的估计值。β01, β02, β03是观测器增益,需要精心配置以保证观测器稳定且快速。

观测器收敛后,z3就会实时跟踪上总扰动f。这样,我们就“看见”了扰动。在实际的ADRC电流环设计中,y就是反馈的电流值,u是电压指令,z3估计的就是反电动势、电阻电感参数变化、死区效应等所有扰动之和。

2.3 核心组件三:非线性状态误差反馈(NLSEF)与扰动补偿

有了TD给出的理想状态v1, v2,和ESO给出的实际状态估计z1, z2以及扰动估计z3,我们就可以计算控制了。

首先计算误差:e1 = v1 - z1(位置/电流误差)e2 = v2 - z2(速度/电流微分误差)

然后,NLSEF采用一个非线性函数来处理这些误差,经典的是“fal”函数:fal(e, α, δ) = |e|^α * sign(e), 当 |e| > δfal(e, α, δ) = e / δ^(1-α), 当 |e| ≤ δ其中0 < α < 1δ > 0。这个函数的特点是:大误差时增益大,提高响应速度;小误差时增益小,避免高频颤振和平滑控制。δ是一个线性区间,防止在零点附近因函数不平滑导致的抖动。

那么初步的控制量u0为:u0 = β1 * fal(e1, α1, δ) + β2 * fal(e2, α2, δ)β1β2是误差增益。

最后,执行关键的扰动补偿u = (u0 - z3) / b这里b就是ESO里那个粗略的控制增益估计。这个公式的意义在于:计算出的理想控制力u0,减去观测到的扰动z3,再除以增益b,就得到了最终应该施加的控制量u。经过这样的补偿,系统方程近似变成了ÿ ≈ u0,一个简单的双重积分器,非常好控制。

3. ADRC参数整定与工程化实践

理论很美,但落到代码上,参数整定是逃不过的坎。ADRC参数看起来比PID多(TD的r,h;ESO的β01, β02, β03, b;NLSEF的β1, β2, α1, α2, δ),但其实有很强的物理意义和整定规律,并非盲目调试。

3.1 “带宽法”参数整定:化繁为简

这是工程上最常用、最有效的方法,由高志强教授提出,将观测器和控制器的性能与“带宽”这一概念挂钩,极大简化了调参。

  1. ESO参数整定:将ESO的特征多项式配置为(s + ω_o)^3,其中ω_o称为观测器带宽。通过极点配置,可以推导出:β01 = 3ω_oβ02 = 3ω_o^2β03 = ω_o^3这样一来,ESO的三个增益就由一个参数ω_o决定了。ω_o越大,观测器收敛越快,对扰动的估计能力越强,但同时对测量噪声也越敏感。一般ω_o设为系统期望闭环带宽的3~10倍。参数b需要大致估计,它代表了控制量对输出的增益,比如在电流环中,b ≈ 1/L(电感倒数),估不准没关系,ESO有一定的鲁棒性,但偏差太大会影响性能。

  2. 控制器参数整定:将误差反馈律线性化(即取α1=α2=1δ设大点),其闭环特征多项式可配置为(s + ω_c)^2,其中ω_c称为控制器带宽。可以推导出:β1 = ω_c^2β2 = 2ω_cω_c直接决定了系统的响应速度。ω_c越大,响应越快,但控制量会越大,也可能激发未建模的高频动态。通常ω_c应小于ω_o的1/3到1/5,以保证观测器比控制器更快,能及时提供准确的扰动估计。

  3. TD参数整定:速度因子r决定了跟踪设定值的最大加速度。理论上r可以很大,但受限于执行机构物理极限和采样频率。步长h就是控制周期。通常先设一个较大的r,观察v1的跟踪曲线,只要不超出执行机构能力且平滑即可。

通过“带宽法”,我们将调参从8-9个减少到3个核心参数:ω_o(观测器带宽)、ω_c(控制器带宽)、b(控制增益估计)。rh相对独立。非线性参数α1, α2, δ在初步整定时可以先设为1(即线性),系统稳定后再微调以优化性能。α通常取0.5~0.75,δ取采样周期附近的值。

3.2 工程实现要点与代码结构

当你动手写那个ADRC算法m文件或C代码时,结构应该清晰。以下是一个面向对象的离散ADRC二阶控制器伪代码框架,非常适合嵌入式实现:

classdef ADRC_2nd properties % TD 参数 h, r; v1, v2; % TD状态 % ESO 参数 beta01, beta02, beta03, b; z1, z2, z3; % ESO状态 % NLSEF 参数 beta1, beta2, alpha1, alpha2, delta; % 其他 u_last; % 上一拍控制量(用于补偿) end methods function obj = ADRC_2nd(h, r, wo, wc, b_est) % 初始化 obj.h = h; obj.r = r; obj.v1 = 0; obj.v2 = 0; % 带宽法设置ESO增益 obj.beta01 = 3*wo; obj.beta02 = 3*wo^2; obj.beta03 = wo^3; obj.b = b_est; obj.z1 = 0; obj.z2 = 0; obj.z3 = 0; % 带宽法设置控制器增益(线性) obj.beta1 = wc^2; obj.beta2 = 2*wc; obj.alpha1 = 1; obj.alpha2 = 1; % 先线性 obj.delta = h; % 线性区间设为步长 obj.u_last = 0; end function [u, states] = update(obj, target, feedback) % 1. TD更新 [obj.v1, obj.v2] = fhan(target, obj.v1, obj.v2, obj.h, obj.r); % 2. ESO更新 e_eso = obj.z1 - feedback; obj.z1 = obj.z1 + obj.h * (obj.z2 - obj.beta01 * e_eso); obj.z2 = obj.z2 + obj.h * (obj.z3 - obj.beta02 * e_eso + obj.b * obj.u_last); obj.z3 = obj.z3 + obj.h * (-obj.beta03 * e_eso); % 3. 计算误差和非线性反馈 e1 = obj.v1 - obj.z1; e2 = obj.v2 - obj.z2; fe1 = fal(e1, obj.alpha1, obj.delta); fe2 = fal(e2, obj.alpha2, obj.delta); u0 = obj.beta1 * fe1 + obj.beta2 * fe2; % 4. 扰动补偿 u = (u0 - obj.z3) / obj.b; % 5. 限幅和保存 u = saturate(u, umin, umax); % 执行器饱和 obj.u_last = u; states = [obj.v1, obj.v2, obj.z1, obj.z2, obj.z3]; end end end

这个框架在每个控制周期被调用一次,输入当前目标值和系统反馈,输出控制量。清晰的状态更新和分离的模块,便于调试和监控。

4. 在电机电流环中的应用与调试实录

将ADRC应用于永磁同步电机(PMSM)的电流环,是检验其性能的绝佳场景。电流环要求响应快、抗扰强,传统的PI调节器在d-q轴解耦和反电动势扰动上需要精细补偿,而ADRC可以将其视为总扰动一并估计补偿。

4.1 模型建立与参数设计

PMSM在同步旋转坐标系下的电压方程(忽略磁饱和等)为:u_d = R*i_d + L_d*di_d/dt - ω_e*L_q*i_qu_q = R*i_q + L_q*di_q/dt + ω_e*(L_d*i_d + ψ_f)其中,ω_e是电角速度,ψ_f是永磁体磁链。可以看到,q轴电压方程中包含了反电动势项ω_e*ψ_f和耦合项ω_e*L_d*i_d,这些都是PI控制器需要额外处理的前馈或解耦项。

在ADRC框架下,我们可以将每个电流环(d轴和q轴独立)建模为一个一阶系统(因为电压方程本身是一阶微分方程):di/dt = ( -R*i + 耦合项/反电动势 + 扰动 + b*u ) / L这里,我们把-R*i/L作为部分已知动态(可以归入b*u或作为已知扰动补偿),而把耦合项、反电动势、参数变化、测量噪声等所有其他因素都打包进“总扰动”f。于是模型简化为:di/dt = f + b*u其中b可以粗略取为1/L(或1/L_d,1/L_q)。

因此,我们需要为每个电流环设计一个一阶ADRC(因为系统是一阶的)。一阶ADRC比二阶更简单:

  • TD:安排电流指令的过渡过程,输出平滑的指令v1
  • ESO:扩张成一阶观测器,估计电流z1和总扰动z2
  • NLSEF:计算误差e1 = v1 - z1,并生成u0
  • 补偿u = (u0 - z2) / b

参数整定依然用带宽法。对于电流环,响应要求很高,假设期望电流环带宽为f_c = 1000 Hz,则ω_c = 2*π*f_c。观测器带宽ω_o可取(3~5)*ω_cb1/L的标称值。

4.2 调试步骤与问题排查

在实际电机平台上调试ADRC电流环,我建议遵循以下步骤:

  1. 准备工作:确保你的电流采样、PWM驱动、Clark/Park变换等基础环节正确无误。先用一个非常保守的PI控制器让电机转起来,作为基准。

  2. 初始化与参数注入:将一阶ADRC参数写入代码。开始时,将ω_cω_o设小(比如对应100Hz带宽),b值给准,NLSEF先设为线性(α=1)。TD的r先设一个中等值。

  3. 开环测试ESO:这是关键一步!在电机静止或低速空载下,给一个很小的、恒定的电压指令u,同时让ADRC算法运行,但不使用其输出的u,而是用你给定的那个小电压。观察ESO估计的电流z1是否跟踪实际反馈电流i,估计的扰动z2是否稳定在一个值附近。如果z1跟踪良好,说明ESO基本工作正常。你可以故意改变一点b值,看ESO的z2如何变化来补偿这个建模误差。

  4. 闭环测试与带宽提升:将ADRC的输出u接入系统,形成闭环。给定一个小的阶跃电流指令。逐步增大ω_c(控制器带宽),观察电流响应速度。同时,按比例增大ω_o(保持ω_o > 3ω_c)。你会看到电流响应越来越快。注意监控控制量u(即电压指令),确保没有饱和。也要观察估计的扰动z2,在负载突变时,它应该快速变化以抵消扰动。

  5. 引入非线性与抗扰测试:当线性ADRC工作稳定后,可以尝试引入非线性fal函数。将α设为0.5或0.75,δ设为几个采样周期的误差值。这通常能进一步平滑小误差段的控制,减少高频噪声。然后进行抗扰测试:突加负载、快速升降速,对比ADRC和PI的电流跟踪波形和恢复时间。

常见问题与排查表

现象可能原因排查与解决思路
系统发散、振荡1.ω_oω_c过大,超出系统有效带宽。
2. 参数b估计严重偏差。
3. 控制量饱和未处理。
1. 大幅降低ω_oω_c,从很慢的响应开始调。
2. 检查b值符号和量级。可通过开环ESO测试,给一个阶跃u,看z1的变化斜率,斜率应约等于b*u
3. 在输出u后加入硬限幅,并将限幅后的值反馈给ESO(如上面伪代码的u_last),这是关键!
ESO估计值z1有较大静差1. ESO增益不足,观测器收敛慢。
2. 测量反馈y有恒定偏差或噪声过大。
1. 适当增大ω_o,提高观测器带宽。
2. 检查电流采样校准和滤波。ESO本身有一定滤波作用,但前端噪声过大会影响估计精度。
扰动估计z2噪声大1.ω_o过高,放大了测量噪声。
2. 反馈信号y噪声大。
1. 降低ω_o,在响应速度和噪声抑制间折衷。
2. 对反馈信号y进行一阶低通滤波,但需注意引入相位滞后。或者,可以考虑使用降阶ESO等变体。
动态响应慢,不如PI1.ω_c设置过低。
2. TD的r过小,指令过渡太慢。
3. 非线性参数α太小或δ太大,导致误差增益始终很低。
1. 在稳定前提下,逐步增大ω_c
2. 增大TD的r
3. 检查fal函数输出,确保在动态过程中e较大时,非线性函数能输出足够大的值。可暂时切回线性(α=1)对比。
切换负载时电流恢复慢扰动估计z2响应不够快。增大ω_o,提高观测器对扰动变化的跟踪速度。同时检查b值是否准确,不准确的b会降低补偿效率。

4.3 实测心得与进阶技巧

经过多个项目的实践,我总结出几点心得:

  • “b”值不必精确:ESO对b有很强的鲁棒性。b的估计值在真实值的0.5到2倍范围内,系统通常都能稳定工作,只是性能略有差异。这大大降低了工程应用门槛。
  • TD并非必须:对于很多伺服系统,指令本身变化并不剧烈,或者对指令跟踪的平滑性要求不高时,可以省略TD,直接用目标指令作为v1,其微分v2设为0。这能简化算法,特别是在一阶ADRC中。
  • 注意离散化与计算延时:上面给出的ESO和TD公式都是欧拉离散化。在高带宽或低采样率下,可能需要更高精度的离散化方法(如双线性变换)。另外,从采样、计算到PWM更新产生的固有延时(通常1-2个控制周期),会影响高带宽下的稳定性,必要时需要在ESO模型或控制律中考虑延时补偿。
  • 从一阶ADRC开始:很多物理系统(如电流环、温度控制)本质是一阶的。从一阶ADRC入手,参数更少(ω_o,ω_c,b),调试更简单,理解更深刻,成功后再扩展到二阶位置/速度环。
  • 与现有框架融合:你不需要完全抛弃现有的控制框架。例如,可以在原有PI电流环的基础上,保留PI作为误差反馈(即u0的计算),然后加上ESO进行扰动估计和补偿,形成一种“PI+扰动观测器”的复合结构,这是一种平滑的迁移策略。

ADRC的魅力在于它提供了一种统一、强大的框架来处理不确定性和扰动。它不一定在所有场景下都碾压PID,但在模型不确定性强、扰动频繁的场合,其优势非常明显。调试的关键在于理解带宽参数ω_oω_c的物理意义,以及ESO那个“扰动估计与补偿”的核心动作。当你看到在负载突加时,z2瞬间跳变并抵消了扰动,电流几乎无静差地恢复跟踪,那一刻你就会觉得,之前所有的调试都是值得的。