ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

从PID调参困境到ADRC自抗扰:核心原理、代码实现与工程避坑

从PID调参困境到ADRC自抗扰:核心原理、代码实现与工程避坑

简介:传统比例积分微分控制在面对强扰动、模型不确定性和非线性对象时,往往难以同时兼顾快速性与稳定性;该学习资源围绕自抗扰控制、跟踪微分器和扩张状态观测器三条主线,提供了一套完整的MATLAB脚本与Simulink仿真模型实现,帮助自动化、机器人及航空航天控制方向的初学者系统理解先进PID的改进思路。压缩包共含十八个文件,主体为十一个m脚本、两个slx仿真模型及一个Markdown说明文档,另有少量备份文件,整体大小仅六十八KB,便于快速下载与本地实验。脚本覆盖自抗扰控制、线性自抗扰控制、跟踪微分器、扩张状态观测器、比例积分微分控制器以及差分进化、神经网络等辅助算法,仿真模型则构建了伺服关节与永磁同步发电机场景。通过对照传统比例积分微分控制与改进算法的响应曲线,读者能够直观掌握扰动估计与补偿的机理,并在此基础上进行参数调试和二次开发。目前已有九十二人学习下载,适合作为课程设计或科研入门的基础代码库。

1. 先进PID控制算法:当PID调参变成玄学,ADRC凭什么接棒

现场调试自动化设备时,PID调参经常被当成一门玄学:给定一大就超调,微分一大噪声跟着放大,外部扰动一来,好不容易调出来的参数又要推翻重来。先进PID控制算法里的自抗扰控制(ADRC),就是为了打破这个循环出现的——它保留PID的误差反馈思想,用跟踪微分器(TD)解决参考信号微分提取的难题,用扩张状态观测器(ESO)把内扰、外扰、未建模动态打包成"总扰动"实时估计并补偿掉。适合谁?做伺服、运动控制、温控、电源、飞行控制的工程师,尤其是被模型不确定性和外部扰动反复折磨的现场调试人员。下面我从TD、ESO讲到完整闭环代码,最后收在现场调参踩过的坑上。

2. 跟踪微分器(TD):把参考信号和它的微分一起干净地提取出来

2.1 为什么PID的微分项总被噪声绑架:参考信号求导为什么难

PID里的D环节理论上要的是误差的导数,但实际工程里几乎没人敢直接对误差做差分。两个原因:一是参考信号通常是阶跃或者梯形,切换瞬间误差导数是一个无限大的脉冲,差分出来的D输出直接打满执行机构;二是测量噪声高频分量在差分运算里被大幅放大,原本为了抑制超调加的D,最后变成把抖动灌进控制量的元凶。所以很多现场干脆把D设成0,用PI硬扛,代价是超调和振荡只能靠手动折中。

跟踪微分器的思路和"低通滤波再差分"完全不同。它构造一个二阶动态系统,让它的状态 x1 去跟踪参考信号 v,状态 x2 自然就是 x1 的导数,也就是 v 的"广义微分"。关键在"跟踪"两个字:x1 是被安排的过渡过程拉过去的,不是直接跳过去的,所以 x2 不会出现阶跃对应的无穷大脉冲;同时这个跟踪过程本身有滤波作用,x2 对高频噪声的响应远没有直接差分那么敏感。这样做还有一个附带收益——安排过渡过程,起步时控制量不会瞬间顶满,对执行机构和机械冲击都友好得多。

很多工程师试过用一阶惯性滤波对参考求导,发现滞后大、噪声还是压不住。区别在于:一阶惯性滤波只对幅值衰减,不改变"突变输入必然对应尖峰输出"的本质;而TD是在加速度受限的约束下做最速跟踪,它输出的微分天然被限幅,噪声响应也被结构化地压下去。这也是为什么ADRC里TD既承担微分提取,又承担参考整形,两个任务一个模块就做完了。

2.2 用fhan实现跟踪微分器:最速控制综合函数的离散代码

经典非线性TD的离散形式,核心是一个叫fhan的函数,它解决的是"二阶积分器在控制量受限时如何最快到达平衡点"的问题。这里"最快"是数学上的最速控制,不是调参调出来的快。fhan的输出是加速度指令,幅度被限制在 r 以内,r 就是跟踪速度上限。

import math def fhan(x1, x2, r, h): # x1: 位置误差(v1 - ref) # x2: 速度 # r: 跟踪速度上限(加速度约束) # h: 采样周期 d = r * h * h a0 = h * x2 y = x1 + a0 a1 = math.sqrt(d * d + 8.0 * r * abs(y)) if abs(y) <= d: a2 = x2 + a0 / h else: a2 = x2 + 0.5 * (a1 - d) * math.copysign(1.0, y) if abs(a2) <= d: return -r * a2 / d return -r * math.copysign(1.0, a2)

这个函数看起来绕,其实它是在算一条切换边界:位置误差 y 在边界内还是边界外,决定用线性段还是饱和段输出。d = r·h² 是边界宽度,a1 是考虑目标可达性后的修正项,a2 是虚构的控制量,最后根据 a2 落在边界内还是边界外决定返回值是线性比例还是直接拉满。参数 r 决定了加速度上限,h 必须是实际运行周期。

有了fhan,TD本身就是一个两步的欧拉积分:

def update_td(v1, v2, ref, r, h): # v1: 跟踪信号, v2: 跟踪信号的微分, ref: 参考目标 fh = fhan(v1 - ref, v2, r, h) v1_new = v1 + h * v2 v2_new = v2 + h * fh return v1_new, v2_new

注意传入fhan的第一个参数是 v1 - ref,不是 v1。这样做的意义是让 v1 去追 ref,v2 作为中间速度自然承接下来。很多初写TD的人把符号搞反,结果 v1 一路追飞。代码逻辑不复杂:先用当前的误差和速度算出加速度 fh,再按欧拉法推进两个状态。x1(即v1)跟踪参考信号,x2(即v2)跟踪参考信号的变化率,这两个量后面会直接喂给控制律。

2.3 r和h怎么设:跟踪速度、相位滞后与噪声放大的取舍

r 是最容易误导人的参数。它代表跟踪的"加速度上限",r 越大 v1 逼近 ref 越快,v2 的峰值也越高,参考信号里携带的量化噪声和测量毛刺会被 v2 成比例放大,再进入控制律的 e2 项。所以 r 的取值原则不是"想多快就设多大",而是按执行机构能承受的能力来定。运动控制里,r 大致对应最大加速度,取设备标称加速度的 70%~80% 比较安全;温度控制这类执行机构功率有限的场合,r 通常取很小,让 v1 慢速爬升,避免加热棒一上电就全功率冲击。

给一个工程近似:对幅值为 ref 的阶跃,TD的过渡时间大约在 4·sqrt(ref/r) 量级。比如 ref=1、r=8 时,过渡时间约1.4秒。想验证这个公式对不对,跑一次仿真看 v1 的上升沿就行。h 必须等于实际控制周期,不能拿仿真步长凑数。h 一旦和实际中断周期不一致,fhan 里 d = r·h² 的边界就是错的,现象是跟踪要么明显变慢要么在目标附近小幅振荡。另外,TD不仅用在参考侧,也常用在反馈侧:把编码器位置送入TD取速度,比直接对位置差分干净得多,这是很多人忽略的用法。

3. 扩张状态观测器(ESO):把"总扰动"当第三个状态实时估出来

3.1 总扰动到底是什么:内扰、外扰、未建模动态统一进一个变量

先看一个二阶对象的一般写法:y'' = f(y, y', w, t) + b0 * u。这里的 u 是控制量,b0 是输入系数,f 就是"总扰动"——它把摩擦力、阻尼变化、未建模非线性、外部负载、参数漂移全部打包成一个标量。ADRC的核心假设是:我不需要知道 f 长什么样,我只需要一个状态把它实时估出来,然后在控制量里把它抵消掉。这相当于把整段不确定部分当成一个黑匣子,只关心它的"总效果",不关心内部结构。

为什么敢这么干?因为对反馈控制来说,系统内部的耦合和非线性,最终都体现在输出加速度上;外部扰动也一样。只要能估计出这个等效加速度扰动,控制律就能补回去。这也是ADRC对模型精度要求低的原因:它不需要精确建模,只需要一个大致准确的 b0。b0 是输入增益的数量级,现场标定方法很简单——开环给一个已知控制量阶跃,测稳态加速度变化,b0 ≈ Δy''/Δu。运动控制里用电流指令和加速度计就能标,温控里用功率和温度变化率也能标。b0 不必很准,但不能差一个数量级,否则补偿方向对不上,后面会讲到这会引发什么毛病。

3.2 非线性ESO离散方程与fal函数:三个状态各在干什么

ESO比对象多一个状态,这就是"扩张"二字的来历。拿3.1的二阶对象说,ESO有三个状态:z1 估计 y,z2 估计 y',z3 专门估计总扰动 f。离散递推如下:

def update_eso(z1, z2, z3, y, u, h, wo, b0, delta): # z1/z2/z3: 观测器三个状态 # y: 测量输出, u: 上一拍实际施加的控制量 # wo: 观测器带宽, b0: 对象输入系数估计, delta: fal线性段宽度 e = z1 - y beta1 = 3.0 * wo beta2 = 3.0 * wo * wo beta3 = wo * wo * wo z1 = z1 + h * (z2 - beta1 * e) z2 = z2 + h * (z3 - beta2 * fal(e, 0.5, delta) + b0 * u) z3 = z3 + h * (-beta3 * fal(e, 0.25, delta)) return z1, z2, z3 def fal(e, alpha, delta): # 非线性函数:大误差快追,小误差细调 if abs(e) <= delta: return e / (delta ** (1.0 - alpha)) return math.copysign(abs(e) ** alpha, e)

逐项看:第一行是误差,z1 和测量 y 的差;z1 的更新用线性误差,这是普通状态观测器的标准形式;z2 的更新里出现了 b0·u,这是把已知的控制输入注入进观测器,否则 z3 永远估不对;z3 的更新只用误差驱动,没有输入项,靠的就是"扰动会在输出上留下痕迹"这个原理,误差里天然携带扰动信息,观测器沿着误差方向把 z3 逼到真实总扰动上。

两个 fal 的 alpha 分别取 0.5 和 0.25,这是经典非线性ESO的取值。它的作用是:误差大的时候增益高,收敛快;误差小的时候增益低,抗噪好。但注意 fal 在零点附近有线性段,由 delta 决定,目的就是防止 e 接近0时增益过大导致抖振。delta 一般取测量噪声幅度的2~3倍,常见范围0.005~0.05,具体怎么权衡第5章细说。

3.3 观测器带宽wo:3个增益一次定完的参数化方法

给非线性ESO配参数最怕拍脑袋。如果三个 beta 一个一个试,很难试出稳定组合。工程上通行做法是带宽参数化:把 beta1、beta2、beta3 按表里这样绑定,只留 wo 一个自由度。这样ESO的特征方程近似为 (s+wo)³,wo 直接决定三个状态收敛的带宽,物理意义非常清楚。

参数表达式作用现场初值
beta13·woz1 的误差反馈增益wo 取 wc 的 3~5 倍
beta23·wo²z2 的误差反馈增益同上
beta3wo³z3 的误差反馈增益从 3 倍 wc 往上调
wo观测器带宽估计收敛速度以控制量不抖为上限

wo 越大,z1、z2、z3 收敛越快,对扰动的响应越迅速,但测量噪声也被放大得越狠,最终体现在控制量毛刺上。wo 取控制器带宽 wc 的3~5倍,是"跟得上又不至于把噪声灌满"的均衡点。还有一条硬约束:wo·h 必须明显小于1,经验上别超过0.3~0.5,这关系到离散化之后ESO是否还能稳定,第5章会专门讲。另外提一句:如果现场噪声实在压不住,把 fal 替换成纯线性 e,整个ESO就退化成线性扩张状态观测器,这就是LADRC的雏形,第6章展开。

4. 从方程到可运行代码:自抗扰控制器完整闭环仿真

4.1 控制律合成:PD组合加扰动补偿,u=(u0-z3)/b0的物理含义

TD和ESO都就位后,控制律反而很简单。先算一个中间量 u0,形式上和PD一样:u0 = kp·(v1 - z1) + kd·(v2 - z2)。注意这里用的是TD的 v1、v2 和ESO的 z1、z2,不是直接用测量反馈和它的差分。kp、kd 也可以用带宽法绑定:kp = wc²,kd = 2·wc,这样闭环特性近似一个带宽为 wc 的二阶系统,还是只有一个参数。

得到 u0 之后,真正的控制量是u = (u0 - z3) / b0。这句话是整个ADRC的精华:z3 是总扰动估计,把它除以 b0,就是"抵消扰动需要额外补多少控制量";减掉它之后,对象在控制器眼里变成了一个干净的纯双积分系统 y'' ≈ u0。这也是为什么上面PD那一串可以放心地按 wc 设计——它面对的不是那个又带摩擦又带负载的对象,而是一个被"人工掰直"的对象。只要ESO收敛,z3 跟得上真实总扰动,这个补偿就一直有效,这就是自抗扰三个字的落地形式。

4.2 最小Python闭环仿真:TD、ESO、控制量一次跑通

下面是一份可以直接复制运行的完整仿真。被控对象我故意放了一个带阻尼、带弹簧项、还叠加正弦扰动的二阶系统,模拟"模型大概知道但又不完全准确"的现场情况。外部扰动在第3秒注入一个0.5的阶跃,用来观察ESO的补偿效果。

import math h = 0.001 # 控制周期/仿真步长,单位秒 T = 6.0 # 仿真总时长 N = int(T / h) # 控制器参数(整定思路见3.3和第5章) r = 8.0 # TD跟踪速度 wc = 6.0 # 控制器带宽 wo = 30.0 # 观测器带宽,一般取3~5倍wc b0 = 1.0 # 对象输入系数估计值 delta = 0.01 # fal线性段宽度 def fal(e, alpha, d): if abs(e) <= d: return e / (d ** (1.0 - alpha)) return math.copysign(abs(e) ** alpha, e) def fhan(x1, x2, r, h): d = r * h * h a0 = h * x2 y = x1 + a0 a1 = math.sqrt(d * d + 8.0 * r * abs(y)) if abs(y) <= d: a2 = x2 + a0 / h else: a2 = x2 + 0.5 * (a1 - d) * math.copysign(1.0, y) if abs(a2) <= d: return -r * a2 / d return -r * math.copysign(1.0, a2) def plant(x1, x2, u, t): # 对象: y'' = -1.8*y' - 0.9*y + u + 0.4*sin(3t) + 外部扰动 d_ext = 0.5 if t >= 3.0 else 0.0 return -1.8 * x2 - 0.9 * x1 + u + 0.4 * math.sin(3.0 * t) + d_ext # 状态初始化 x1, x2 = 0.0, 0.0 # 对象真实状态 z1, z2, z3 = 0.0, 0.0, 0.0 # ESO三个状态 v1, v2 = 0.0, 0.0 # TD输出 u = 0.0 ref = 1.0 rec = {'t': [], 'y': [], 'z3': [], 'u': []} for i in range(N): t = i * h # 1) 先测量,再用ESO估计(顺序和实机一致) e_obs = z1 - x1 z1 = z1 + h * (z2 - 3.0 * wo * e_obs) z2 = z2 + h * (z3 - 3.0 * wo * wo * fal(e_obs, 0.5, delta) + b0 * u) z3 = z3 + h * (-wo * wo * wo * fal(e_obs, 0.25, delta)) # 2) TD跟踪参考并提取微分 fh = fhan(v1 - ref, v2, r, h) v1 = v1 + h * v2 v2 = v2 + h * fh # 3) 控制律:PD组合 + 扰动补偿 e1 = v1 - z1 e2 = v2 - z2 u0 = wc * wc * e1 + 2.0 * wc * e2 u = (u0 - z3) / b0 # 4) 推进对象(欧拉法) ddx = plant(x1, x2, u, t) x1 = x1 + h * x2 x2 = x2 + h * ddx if i % 20 == 0: rec['t'].append(t) rec['y'].append(x1) rec['z3'].append(z3) rec['u'].append(u)

跑完把 rec 里的 t 和 y 画出来,会看到三条值得关注的曲线。输出 y 约在1.5秒到达 ref=1.0,超调很小,这是TD安排了过渡过程的结果;z3 在0~3秒之间稳定在对象内部扰动附近,反映的是阻尼项、弹簧项和正弦扰动合并后的"总扰动"实时值;第3秒外部阶跃注入时,z3 在0.3秒内跟上新扰动,y 的偏差被压在0.1以内,这就是扰动补偿在工作。

想验证ADRC的鲁棒性,最粗暴的办法是改对象:把 plant 换成y'' = -5y' - 3y + 1.5u + sin(20t),b0 保持1.0不动,你会发现系统依然稳得住,只是动态响应略变。这套代码我建议保留下来当测试台,以后遇到新对象,先改 plant 看ESO和补偿行为,再上实机,比直接在设备上试错安全得多。

4.3 嵌入式C实现:定时中断里的代码与输出限幅抗饱和

仿真通了,落地大多是C代码。下面是定时中断里跑的核心逻辑,控制周期由中断保证等于 H:

/* 定时中断里每 H 秒调用一次,H=0.001s */ #define WC 6.0f #define WO 30.0f #define B0 1.0f #define DELTA 0.01f #define R 8.0f #define H 0.001f #define U_MAX 10.0f /* 执行机构输出上限 */ #define U_MIN -10.0f static float z1, z2, z3, v1, v2; static float u_out; static float fal(float e, float alpha, float d) { if (e >= -d && e <= d) return e / powf(d, 1.0f - alpha); return copysignf(powf(fabsf(e), alpha), e); } float adrc_run(float y_meas, float ref) { float e_obs, fh, e1, e2, u0, tmp; /* ESO:用上一拍实际输出的 u_out */ e_obs = z1 - y_meas; z1 += H * (z2 - 3.0f * WO * e_obs); z2 += H * (z3 - 3.0f * WO * WO * fal(e_obs, 0.5f, DELTA) + B0 * u_out); z3 += H * (-WO * WO * WO * fal(e_obs, 0.25f, DELTA)); /* TD */ fh = fhan(v1 - ref, v2, R, H); v1 += H * v2; v2 += H * fh; /* 控制率 */ e1 = v1 - z1; e2 = v2 - z2; u0 = WC * WC * e1 + 2.0f * WC * e2; tmp = (u0 - z3) / B0; /* 限幅,并把实际输出回馈给ESO,这是抗饱和的关键 */ if (tmp > U_MAX) u_out = U_MAX; else if (tmp < U_MIN) u_out = U_MIN; else u_out = tmp; return u_out; }

这段代码里最容易被忽略的是最后那个限幅。如果只做限幅而不把限幅后的值回写给ESO,观测器会一直按未受限的控制量积分,z3 越积越大,等扰动过去或给定变化时,控制量会猛冲一下才恢复,这就是积分饱和,现象很像"过冲特别大"。回写 u_out 之后,ESO 知道真实执行情况,z3 不会被虚高的补偿量带偏。现场调试新板子时,还要确认中断周期和 H 一致,我见过不止一次仿真步长0.001、实机中断2ms但代码里H还是0.001的情况,结果就是系统莫名振荡。

5. ADRC参数整定避坑:5个现场最常见故障与排查

下面这5条是我在多个项目里反复踩过的坑,每条都按"现象、原因、解决"讲清楚。碰上问题先对照现象定位,别一上来就动所有参数。

5.1 现象:ESO高频抖动,控制量毛刺多

现象:运行后 z2、z3 有高频小幅度振荡,控制量 u 上叠加明显毛刺,执行机构有嗡鸣声。

原因:wo 相对采样噪声取得太高,或者 delta 太小,fal 在零点附近的增益过大,把测量噪声和量化误差放大成了估计振荡。很多人一上来就把 wo 拉到很大,觉得"观测器越快越好",结果观测器把噪声全接进来了。

解决:先把 wo 压到 wc 的3~4倍,看抖动是否收敛;再把 delta 提到测量噪声幅度的2~3倍,常见取0.01~0.05。还不行就在反馈路径上给 y 加一阶低通,截止频率放到5倍 wc 以上,别吃掉太多相位。这三步按顺序试,大多数毛刺问题都能压住。

5.2 现象:b0估不准,系统要么发散要么迟钝

现象:同样的 wc、wo,换一台设备就不稳定,或者扰动来了半天补不回去,阶跃响应慢得离谱。

原因:b0 直接参与除法补偿。b0 偏大,补偿量偏小,系统对扰动反应迟钝;b0 偏小,补偿过量,闭环等效增益被放大,轻则振荡重则发散。b0 的误差不会被ESO完全吸收,因为ESO估的只是对象里的 f,b0 不准等于把一部分模型误差也塞进了"总扰动",它补不干净。

解决:先做开环标定。把扰动补偿禁用,u 直接给阶跃,记录输出的加速度变化,b0 ≈ Δy''/Δu。实机标完别用理论值,留20%左右裕度,现场通常取偏大一点更安全,偏大只是迟钝,偏小会振荡。换设备、换负载工况后 b0 要重新确认,这是ADRC现场必做的一步。

5.3 现象:fal的delta太大,抗扰能力明显退化

现象:整定正常,但外部扰动一加入,输出偏差比预期大很多,z3 明显跟不上扰动。

原因:fal 的 delta 设得太大,运行范围内 |e| 始终落在线性段,fal(e,0.5,delta) 变成固定线性增益,非线性ESO退化成线性观测器,误差大时收敛速度变慢。反过来 delta 太小,零点附近增益过高又容易抖。delta 这个参数卡在非线性作用的有效范围上。

解决:先记录 e_obs(z1-y)在正常工况下的历史幅度,delta 取这个幅度的5%~10%。调试顺序上,先把 delta 设得偏小确认非线性起作用(z3 对扰动响应明显变快),再往上加直到不抖为止。这个参数值得单独花半小时试,它决定了ESO"大误差快追"的能力边界。

5.4 现象:仿真稳定、实机振荡,怎么调都没用

现象:仿真里阶跃响应很漂亮,搬到实机上同一个参数直接振荡,或者在高频处来回甩。

原因:最常见的是离散步长不匹配。ESO 的连续设计假设步长足够小,实机中断周期如果比仿真步长大一个量级,wo·h 就逼近稳定边界。经验上 wo·h 要小于0.3~0.5,超过这个范围,欧拉法的相位损失足以让观测器本身失稳。

解决:先确认实机中断周期,反推 wo 上限:wo < 0.3/h。想要更高带宽,优先提高采样率,而不是硬拉 wo。如果采样率动不了,把 beta2、beta3 按0.8~0.9系数往下压一点,这是一个很实用的"降增益"技巧,能救回不少边缘稳定的系统。这条是最没有后悔药可吃的坑——上实机前先算一下 wo·h。

5.5 现象:TD的r越调越大,跟踪快了,噪声也大了

现象:为了加快响应把 r 往上提,结果 v2 明显变噪,控制量里出现高频分量,执行机构发热。

原因:r 决定跟踪加速度上限,r 越大 v1 逼近 ref 越快,但 v2 的峰值随之增大。参考信号里的量化噪声和微小的给定抖动全被 v2 带进控制律的 e2 项。r 太大时,TD 几乎等于直接把 ref 交给控制律,"安排过渡过程"的平滑作用就消失了。

解决:r 按执行机构能力定,不按"想多快"定。期望上升时间先算出来,用过渡时间约 4·sqrt(ref/r) 反推 r。要更快的闭环响应,提 wc 比提 r 更直接,因为 wc 决定的是闭环带宽,不牺牲参考侧的平滑性。v2 还抖的话,在 TD 输出后加一阶滤波,或直接换LADRC的线性形式。

6. 进阶:LADRC线性化、三参数整定顺序与z3的额外价值

如果现场噪声底噪高、调试时间紧,我通常建议直接把非线性ESO退化掉,用线性自抗扰。具体做法是把两个 fal 全部换成 e 本身,控制律和TD结构一字不动。好处是参数只剩 wc、wo、b0 三个,整定顺序非常固定:第一步开环标定 b0,这是地基,b0 错了一切白调;第二步按期望响应速度定 wc,闭环带宽大约就是 wc;第三步 wo 从3倍 wc 起步往上调,以控制量不抖为上限。整个过程每次只动一个变量,记录一次阶跃响应,避免几个参数一起调然后互相甩锅。

z3 是总扰动估计,别只当它是个补偿量。现场调试时把 z3 接到趋势记录里,负载突变、机构卡涩、摩擦增大都会在 z3 上体现为突变或慢变分量。有一回某设备出现周期性顿挫,位置闭环看不出问题,z3 曲线上却清晰出现同频率的台阶,顺着找下去发现是导轨润滑不均——这个免费的传感器值得拉一条曲线长期看着。

我自己的习惯是:新对象先花半小时把 b0 标定准,然后把 r、wc、wo、delta 全部写成配置表,现场只改表不动代码。每动一个参数,先在仿真测试台上重放一遍历史工况,确认不翻车再上实机。ADRC不是万能药,但对"模型大概知道、扰动说不清"的对象,它省掉的是反复调PID的那几个通宵。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表