资讯动态

伸缩臂抖动抑制:微分平坦+ADRC与输入整形工程实践

发布时间:2026/9/17 7:10:41 来源:尧图企业网站定制
简介《基于微分平坦与自抗扰控制的伸缩臂抖动抑制研究》是一篇刊发于《农业机械学报》的学术论文PDF面向机器人、农业装备与工程机械领域的控制方向研究者及研究生。论文针对伸缩臂在变幅、伸缩过程中受冲击扰动产生的臂体抖动问题提出将伸缩臂等效为扭簧连接的双刚性杆模型以变幅力矩为输入、两杆仰角为输出建立拉格朗日动力学模型并构造微分平坦输出把系统简化为单输入单输出二阶模型在此基础上设计线性自抗扰控制器借助扩张状态观测器实时估计并补偿内外扰动且随臂长变化在线更新控制参数。仿真与实验表明不同臂长下均可在2秒内消除抖动并保持仰角设定值稳定。资源为单个PDF文件压缩包约2.46MB包含完整公式推导、仿真设置与实验曲线可作控制算法复现、参考文献引用和参数整定思路的专业指导。目前已有149人学习下载。1. 伸缩臂抖动抑制为什么值得用微分平坦叠加自抗扰控制泵车、高空作业车、折臂吊这类伸缩臂设备最难受的时刻往往不是定位精度不够而是动作收尾那两三秒臂架伸出到位、手柄回中末端还在二到五赫兹的频率上横向摆操作手只能靠慢放油门等它衰减。根源是结构柔性与液压驱动滞后的耦合——臂长一变一阶模态频率和模态参与因子跟着漂定参数 PID 要么压不住要么压出新的振荡。微分平坦与自抗扰控制的组合正好卡在这条链两端。前者解决前馈怎么算把关节角取作平坦输出用它的有限阶导数解析反解名义驱动力不必在线积分微分方程也不必数值迭代求逆动力学。后者解决算漏的部分谁兜把未建模的柔性模态、油液压缩、负载摆动打包成总扰动交给扩张状态观测器实时估计并从前向通道抵消。后面按建模、平坦映射验证、ADRC 整定、复合实现、现场排错的顺序往下走每一步都配上能跑的代码和能对照的参数表。2. 伸缩臂刚柔耦合建模与微分平坦映射推导2.1 假设模态法变长度伸缩臂的动力学方程建模方法的选型先定下来。伸缩臂在四到六节、长度从 8 m 伸到 28 m 的工况下真正影响抖动评估的是最低那一两阶整体弯曲模态局部板壳变形对末端横向位移的贡献不到 5%。所以保留一阶模态的假设模态法足够而且它把模态坐标写成一个显式标量状态 $\eta_1$后面塞进扩张状态观测器时不用额外做降阶。有限元法在高频段更准但阶数一上去ADRC 的带宽分配会变成一件很难讲清楚的事。关节自由度取变幅角或回转角 $q$一阶模态坐标取 $\eta_1$臂端横向位移为$$ w(L,t)\phi_1(L),\eta_1(t) $$其中 $\phi_1(L)$ 是一阶模态在臂端的振型值随臂长变化。把耦合项整理后系统方程写成$$ \begin{aligned} \left(I_b(L)m_tL^2\right)\ddot q c\dot q g(q) \Gamma_1\ddot\eta_1 \tau \ \ddot\eta_1 2\zeta_1\omega_1(L)\dot\eta_1 \omega_1^2(L)\eta_1 -\Gamma_1\ddot q \end{aligned} $$这里 $\tau$ 是关节等效力矩液压缸推力经几何关系折算得到。注意 $\omega_1$ 和 $\Gamma_1$ 都带 $(L)$ 标记臂长一变它们就漂这是后面必须做增益调度的原因。工程上通常按三到五个典型臂长分段线性化相邻工况之间用一阶插值误差比用一个平均值硬扛要小一个量级。几个关键参数的取值区间如下表数值量级供建模时先对表用具体机型要按实测频响修正。符号含义典型取值单位$L$臂端到回转中心的有效长度8 ~ 28m$m_t$臂端等效集中质量含吊具或负载300 ~ 1200kg$I_b(L)$臂架绕关节的转动惯量随 $L^2$ 增长的二次式kg·m²$c$关节等效粘性阻尼0.8e4 ~ 1.5e4N·m·s/rad$\zeta_1$一阶模态阻尼比0.02 ~ 0.05—$\omega_1$一阶模态固有频率2.0 ~ 6.0rad/s$\Gamma_1$一阶模态参与因子1e3 ~ 4e3kg·m提示$\zeta_1$ 一定要做一次现场辨识。钢结构加液压铰点的实际阻尼比经常落在 0.01 附近用经验值 0.05 去算输入整形器脉冲时滞会偏短整形后残余振动反而更大。这段模型的价值在于它把“抖动”从一个含糊的机械现象变成了方程里可以算量级的 $\Gamma_1\ddot\eta_1$ 项。后面要不要上 ADRC、需要多大的观测器带宽全部由这一项的量级决定。2.2 以关节角为平坦输出的逆动力学映射微分平坦在这里的用法要说清楚边界。严格意义上带无限维柔性模态的臂架不是有限维微分平坦系统工程上采取的是“名义刚体平坦 柔性项归入扰动”的折中把关节角 $q$ 取作平坦输出 $y$则名义模型的输入可以写成 $y$ 及其有限阶导数的代数函数$$ \tau_{ff} \left(I_b(L)m_tL^2\right)\ddot y c\dot y g(y) $$这个映射之所以好用不在于公式漂亮而在于它是闭式的。轨迹规划用五次或七次多项式写出 $y_d(t)$ 之后$\dot y_d$、$\ddot y_d$ 都是解析表达式前馈力矩可以逐控制周期直接代入计算。对比另一种做法——用数值积分求逆动力学再迭代修正——在 1 kHz 控制周期下前者省掉的运算量足够让控制器把余量留给 ESO。这就是伸缩臂控制里“能解析就不迭代”的实际理由。平坦输出还带来第二个好处振动抑制可以直接做在 $y$ 上。对一阶模态设计零振动ZV输入整形器$$ A_1\frac{1}{1K},\quad A_2\frac{K}{1K},\quad K\exp!\left(-\frac{\zeta_1\pi}{\sqrt{1-\zeta_1^2}}\right),\quad \Delta t\frac{\pi}{\omega_1\sqrt{1-\zeta_1^2}} $$整形后的平坦输出为$$ \hat y(t)A_1y_d(t)A_2y_d(t-\Delta t) $$关键在于$\hat y$ 的一阶、二阶导数同样是对应脉冲的线性组合平坦映射照样是闭式的。整形和微分平坦不是两件事拼起来而是在同一个映射里自然兼容。这一点在实现时非常省事不需要为整形单独设计一个前置滤波器再去做相位补偿。$\Delta t$ 取多少直接由当前臂长下的 $\omega_1(L)$ 算出。臂长从 8 m 伸到 28 m$\Delta t$ 大致在 0.35 s 到 0.9 s 之间变化所以整形器参数必须跟着臂长在线更新这一点后面第 4 章会给具体实现。2.3 平坦映射的数值验证与残差量级检查平坦映射推完之后要做两件事一是验证名义映射可逆二是量化柔性项被忽略掉之后到底剩多少。前者是解析判据$\left(I_b(L)m_tL^2\right)$ 对任何实际臂长都严格大于零输入到平坦输出的映射不会出现奇异点后者必须数值算用下面这段代码把整条轨迹跑一遍。import numpy as np # ---- 按 L 18 m 工况取的名义模型参数 ---- Ib0, mt, Lb 4.2e5, 650.0, 18.0 c_d, g0 1.1e4, 3.6e5 zeta1, w1, Gamma1 0.035, 3.1, 2.4e3 def J_eff(L: float) - float: 有效转动惯量是平坦映射里唯一需要在线随臂长更新的量 return Ib0 mt * L ** 2 def quintic(p0: float, p1: float, T: float): 五次多项式轨迹返回位置/速度/加速度的可调用对象 a0, a3 p0, 10.0 * (p1 - p0) / T ** 3 a4, a5 -15.0 * (p1 - p0) / T ** 4, 6.0 * (p1 - p0) / T ** 5 return lambda t: ( a0 a3 * t ** 3 a4 * t ** 4 a5 * t ** 5, 3 * a3 * t ** 2 4 * a4 * t ** 3 5 * a5 * t ** 4, 6 * a3 * t 12 * a4 * t ** 2 20 * a5 * t ** 3, ) def tau_ff(t: float, poly) - float: 平坦前馈力矩q_d 及其导数全部由多项式解析给出 q, qd, qdd poly(t) return J_eff(Lb) * qdd c_d * qd g0 * np.sin(q) # ---- 用完整刚柔耦合模型积分评估被忽略的柔性残差 ---- def residual(T2.5, dt1e-4): poly quintic(0.0, 0.6, T) # 关节角从 0 转到 0.6 rad ts np.arange(0.0, T dt, dt) eta etad 0.0 res, tau_nom [], [] for t in ts: _, qd, qdd poly(t) etadd -Gamma1 * qdd - 2 * zeta1 * w1 * etad - w1 ** 2 * eta etad etadd * dt eta etad * dt res.append(Gamma1 * etadd) tau_nom.append(tau_ff(t, poly)) res, tau_nom np.array(res), np.array(tau_nom) return np.sum(res ** 2) / np.sum(tau_nom ** 2) print(f柔性残差能量占比 {residual():.3%})代码逻辑分三段J_eff把臂长对惯量的影响单独抽出来保证后面做增益调度时只改这一个入口quintic生成平坦输出及其一、二阶导数起点和终点的速度和加速度都为零避免轨迹本身激起模态residual用同样的前馈力矩去驱动完整耦合模型把 $\Gamma_1\ddot\eta_1$ 当作残差统计它的能量占比。参数说明T是单次变幅动作时长工程上取 2 到 4 sdt是积分步长要比控制周期小一个量级$\Gamma_1$ 的符号会影响残差相位但不影响能量占比辨识时不必纠结。若算出来残差占比超过 15% 到 20%说明一阶模态已经进入主导动态这时靠调 ESO 带宽硬扛是无效的正确做法是先把动作时长拉长、或者把整形器的 $\Delta t$ 重新辨识一遍再回来做控制器。3. 自抗扰控制器的结构设计与伸缩臂参数整定3.1 从跟踪微分器到扩张状态观测器的三段式结构自抗扰控制在伸缩臂上的三段式分工要按场景重新分配不能照搬标准模板。跟踪微分器TD在手动操作模式下负责给手柄阶跃信号安排过渡过程并提取微分但在自动轨迹模式下平坦输出本身已经解析可微TD 可以退化成一个轻量的输出滤波加微分环节省下的计算量给 ESO 用。扩张状态观测器是主力。把二阶系统写成$$ \ddot q f(q,\dot q,\eta_1,\dot\eta_1,t) b_0\tau $$$f$ 里打包的是柔性模态耦合、油液压缩、负载摆动、库仑摩擦以及 $b_0$ 本身标不准带来的偏差。取状态 $z_1\to q$、$z_2\to\dot q$、$z_3\to f$线性 ESO 写成$$ \begin{aligned} e z_1 - q \ \dot z_1 z_2 - \beta_1 e \ \dot z_2 z_3 - \beta_2 e b_0\tau \ \dot z_3 -\beta_3 e \end{aligned} $$第三段是非线性状态误差反馈控制量由 $u_0$ 和观测到的扰动合成$$ \tau \frac{u_0 - z_3}{b_0},\qquad u_0 \beta_p,\mathrm{fal}(e_1,\alpha_1,\delta) \beta_d,\mathrm{fal}(e_2,\alpha_2,\delta) $$这里 $e_1 y_d - z_1$、$e_2 \dot y_d - z_2$用的都是平坦输出给出的解析导数不需要再额外微分反馈信号这一步省掉了很大的噪声代价。$b_0$ 的取值值得单独说。它是控制增益的估计值对伸缩臂来说 $b_0 1/J_{eff}(L)$随臂长变化接近一个数量级的范围。常见做法有两种一是在线按当前 $L$ 更新 $b_0$把惯量变化挡在 ESO 之外二是固定在中间臂长工况把全部偏差交给 $z_3$ 估。前者动态更好后者实现简单。臂长跨度超过三倍时建议用前者否则 $z_3$ 长期偏置抗扰能力会被吃掉一大截。3.2 用带宽法整定 ESO 增益并做增益调度带宽法把三个观测器增益绑到一个参数上。把 ESO 的特征多项式配置成 $(s\omega_o)^3$直接得到$$ \beta_1 3\omega_o,\qquad \beta_2 3\omega_o^2,\qquad \beta_3 \omega_o^3 $$控制器带宽 $\omega_c$ 和观测器带宽 $\omega_o$ 的经验关系是 $\omega_o (3\sim5)\omega_c$而 $\omega_c$ 取一阶模态频率 $\omega_1$ 的 1.5 到 2.5 倍。对 $\omega_1 \approx 3.1$ rad/s 的工况$\omega_c$ 落在 5 到 8 rad/s$\omega_o$ 落在 20 到 40 rad/s。$\omega_o$ (rad/s)$\beta_1$$\beta_2$$\beta_3$相位滞后 3 rad/s噪声放大倍数15456753375约 11°2.82575187515625约 7°5.135105367542875约 5°8.6501507500125000约 3.5°15.2这张表的读法是$\omega_o$ 每往上抬一档扰动估计的相位滞后确实在减但编码器和倾角传感器上的量化噪声也被同比例地放大到控制量里。伸缩臂常用的液压伺服阀带宽大致在 15 到 30 Hz$\omega_o$ 一旦接近这个量级阀芯就开始跟着噪声动表现出来是臂架发出高频啸叫。经验上把 $\omega_o$ 的上限压在阀带宽的 1/5 到 1/4。臂长带来的 $\omega_1$ 漂移必须做增益调度否则固定参数在短臂工况会偏保守、在长臂工况会偏激进。import numpy as np # ---- 按典型臂长标定的分段参数表 ---- GAIN_TABLE { # L(m): (omega1, Gamma1, zeta1) 8.0: (5.80, 1.10e3, 0.030), 14.0: (4.10, 1.75e3, 0.032), 20.0: (3.05, 2.55e3, 0.035), 28.0: (2.15, 3.80e3, 0.038), } def lookup(L: float): 按臂长做一阶插值返回当前工况的模态参数 ks sorted(GAIN_TABLE) L min(max(L, ks[0]), ks[-1]) hi next(k for k in ks if k L) if hi L: return GAIN_TABLE[L] lo max(k for k in ks if k L) w (L - lo) / (hi - lo) return tuple(a w * (b - a) for a, b in zip(GAIN_TABLE[lo], GAIN_TABLE[hi])) def adrc_gains(L: float, b0_scale: float 1.0): 由当前臂长直接算出 ESO 与反馈增益控制周期内调用一次即可 w1, _, _ lookup(L) wc 2.0 * w1 # 控制器带宽取模态频率的 2 倍 wo min(4.0 * wc, 35.0) # 观测器带宽上限 35 rad/s护住伺服阀 beta (3 * wo, 3 * wo ** 2, wo ** 3) bp, bd wc ** 2, 2.0 * wc return beta, bp, bd for L in (8.0, 14.0, 20.0, 28.0): beta, bp, bd adrc_gains(L) print(fL{L:5.1f}m beta{beta[0]:6.1f}/{beta[1]:10.1f}/{beta[2]:12.1f} fkp{bp:6.2f} kd{bd:5.2f})代码逻辑lookup在标定好的几个臂长之间做线性插值保证参数连续变化避免调度切换时力矩跳变adrc_gains把带宽法和增益调度串起来$\omega_o$ 处加了 35 rad/s 的硬上限。参数b0_scale是给 $b_0$ 单独留的整定旋钮——先在空载标一遍再按满载修正不需要重算带宽。注意增益调度的插值一定要做在参数上不要做在控制量上。先按当前 $L$ 算出 $\beta_1,\beta_2,\beta_3$ 再进 ESO而不是对两套 ESO 的输出做加权后者会破坏观测器自身的收敛性。3.3 非线性误差反馈的 fal 函数与抖振抑制非线性反馈里唯一需要小心的是fal函数在原点附近的处理$$ \mathrm{fal}(e,\alpha,\delta) \begin{cases} |e|^{\alpha}\mathrm{sgn}(e), |e|\delta \ e/\delta^{1-\alpha}, |e|\le\delta \end{cases} $$$\delta$ 是线性区宽度$|e|\le\delta$ 时改用线性增益这是为了消掉小误差时的极限环。伸缩臂的关节角传感器分辨率有限$\delta$ 取 0.01 到 0.05 rad 比较合适取太小等于没起作用取太大非线性段就成了摆设。def fal(e: float, alpha: float, delta: float) - float: 非线性原点附近切换为线性避免小误差时的极限环抖振 if abs(e) delta: return (abs(e) ** alpha) * (1.0 if e 0 else -1.0) return e / (delta ** (1.0 - alpha)) # 典型取值alpha10.75 给位置误差alpha21.25 给速度误差 def nlsef(e1: float, e2: float, kp: float, kd: float) - float: return kp * fal(e1, 0.75, 0.02) kd * fal(e2, 1.25, 0.05)逻辑说明$\alpha_1 1$ 时 fal 在大误差处增益偏低、小误差处增益偏高走的是“大误差不冲、小误差不软”的路子$\alpha_2 1$ 反过来对速度误差着重放大用于加阻尼。这一对取值不是随便挑的$\alpha_1$ 减小会让阶跃响应变缓$\alpha_2$ 增大会让高频噪声更容易进入控制量两个方向要配合着调。抖振还有第二个来源微分信号。伸缩臂的关节角反馈如果靠差分求速度量化噪声会被放大 $1/T_s$ 倍。实际工程里稳妥的做法是让 ESO 的 $z_2$ 直接充当速度反馈——它本身就是一个带低通特性的观测器输出不用再另做滤波代价只是引入一点相位滞后。这也是把 $e_2$ 取成 $\dot y_d - z_2$ 而不是 $\dot y_d - \dot q$ 的原因。4. 微分平坦前馈与自抗扰反馈的复合实现4.1 输入整形嵌进平坦轨迹的三种接法整形器和平坦映射的接法直接决定实现复杂度常见三种接法实现方式优点代价前端整形对 $y_d$ 做 ZV 再喂给平坦映射前馈链完全解析整形器参数需随 $L$ 在线更新后端整形对 $\tau_{ff}$ 做 ZV不用改轨迹接口忽略 $g(y)$ 非线性末端有偏差混合位置分量前端、重力分量后端精度与实现折中两条链相位要对齐前端整形是首选。原因很直接平坦映射需要 $y$ 的二阶导数如果整形放在前端$\hat y$ 的导数还是解析的放在后端整形后的力矩再进模型时重力项已经按未整形的角度算过了等于在整形器里混进了一个没被整形的分量末端定位偏差会明显变大。整形器本身要随臂长更新时滞import numpy as np def zv_shaper(L: float, GAIN_TABLE): 按当前臂长生成 ZV 整形器两个脉冲的幅值和时滞 ks sorted(GAIN_TABLE) L min(max(L, ks[0]), ks[-1]) hi next(k for k in ks if k L) lo max(k for k in ks if k L) w_ (L - lo) / (hi - lo) if hi ! lo else 0.0 w1 GAIN_TABLE[lo][0] w_ * (GAIN_TABLE[hi][0] - GAIN_TABLE[lo][0]) z1 GAIN_TABLE[lo][2] w_ * (GAIN_TABLE[hi][2] - GAIN_TABLE[lo][2]) wd w1 * np.sqrt(1.0 - z1 ** 2) K np.exp(-z1 * np.pi / np.sqrt(1.0 - z1 ** 2)) return 1.0 / (1.0 K), K / (1.0 K), np.pi / wdzv_shaper输出三个量$A_1$、$A_2$、$\Delta t$。参数插值逻辑和第 3 章的lookup保持一致避免两套表打架。$\Delta t$ 在臂长 8 m 时大约 0.55 s到 28 m 时约 1.45 s跨度很大所以绝不能用固定时滞。实现时通常用环形缓冲区存最近 2 s 的 $y_d$ 采样取 $t-\Delta t$ 处的值。整形后的轨迹代进平坦映射$$ \hat\tau_{ff}(t)A_1\tau_{ff}!\left(y_d(t)\right)A_2\tau_{ff}!\left(y_d(t-\Delta t)\right) $$由于 $\tau_{ff}$ 对 $y_d$ 不是线性的$\sin y$、$L^2$ 都在里面严格讲不能把脉冲直接搬到力矩上应当先整形轨迹再进映射。上面这个写法只在 $g(y)$ 近似线性的小角度区间成立这一点在实现里要按实际工作角度判断。4.2 复合控制器的 Python 仿真实现把前馈、整形、ADRC 三块拼起来被控对象用第 2 章的刚柔耦合模型。import numpy as np class BoomPlant: 状态 x [q, qd, eta, etad]输入为关节力矩 tau def __init__(self, L18.0): self.L, self.Ib0, self.mt L, 4.2e5, 650.0 self.c, self.g0 1.1e4, 3.6e5 self.zeta, self.w1, self.Gam 0.035, 3.1, 2.4e3 property def J(self): return self.Ib0 self.mt * self.L ** 2 def deriv(self, x, tau): q, qd, eta, etad x etadd -self.Gam * 0.0 - 2 * self.zeta * self.w1 * etad - self.w1 ** 2 * eta # 柔性模态被驱动力矩通过耦合项间接激起 qdd (tau - self.c * qd - self.g0 * np.sin(q) - self.Gam * etadd) / self.J return np.array([qd, qdd, etad, etadd]), etadd class ADRC: def __init__(self, b0, wc, wo): self.b0 b0 self.b1, self.b2, self.b3 3 * wo, 3 * wo ** 2, wo ** 3 self.kp, self.kd wc ** 2, 2 * wc self.z np.zeros(3) def update(self, y, yd, ydd, u_prev, dt): e self.z[0] - y self.z[0] (self.z[1] - self.b1 * e) * dt self.z[1] (self.z[2] - self.b2 * e self.b0 * u_prev) * dt self.z[2] (-self.b3 * e) * dt e1, e2 yd - self.z[0], ydd - self.z[1] u0 self.kp * e1 self.kd * e2 # 仿真里先用线性反馈 return (u0 - self.z[2]) / self.b0 def simulate(T2.5, dt1e-3, use_adrcTrue): plant, adrc BoomPlant(), ADRC(b01.0 / (4.2e5 650 * 18 ** 2), wc6.0, wo24.0) A1, A2, dtau zv_shaper(18.0, GAIN_TABLE) buf, x, trace [], np.zeros(4), [] n_delay int(round(dtau / dt)) for k in range(int(T / dt)): t k * dt q_d 0.6 * (10 * (t / T) ** 3 - 15 * (t / T) ** 4 6 * (t / T) ** 5) buf.append(q_d) q_sh A1 * q_d A2 * (buf[-n_delay - 1] if len(buf) n_delay else buf[0]) tau_ff plant.J * 0.0 plant.g0 * np.sin(q_sh) # 前馈重力 名义惯量项 tau tau_ff (adrc.update(x[0], q_sh, 0.0, tau_ff, dt) if use_adrc else 0.0) dx, _ plant.deriv(x, tau) x x dx * dt trace.append((t, x[0], x[2])) return np.array(trace) if __name__ __main__: tr simulate(use_adrcTrue) tip tr[:, 2] * 0.42 # 模态坐标换算到臂端位移, m print(f末端残余峰峰值 {np.ptp(tip[-500:]):.4f} m)代码逻辑分四段BoomPlant保留完整耦合方程作为验证前馈与反馈效果的基准ADRC里的update用前向欧拉推进三个观测器状态注意它用的是上一周期的控制量u_prev这个顺序不能颠倒否则观测器和被控对象之间会形成一个周期的代数环simulate主循环里先整形、再算前馈、最后叠加 ADRC 输出末尾把模态坐标按振型值换算成臂端位移用最后 0.5 s 的峰峰值衡量残余振动。参数说明dt仿真步长取 1 ms对应实际控制器 1 kHzn_delay是整形时滞对应的采样点数用环形缓冲实现避免每周期重新插值b0按当前臂长代入。前馈项里惯量项在代码注释里省掉了实际工程要保留 $J_{eff}\ddot y$这一项在变幅启动阶段占主导去掉之后加速度段会明显滞后。4.3 抖动抑制效果的量化评估与频谱对比光看时域波形容易被误导因为整形器的效果是把振动能量从高频挪到低频时域峰峰值不一定同步下降。评估至少要三个指标末端残余峰峰值、衰减到 5% 所需时间、一阶模态频点处的频谱幅值衰减。三者要一起看。控制方案末端峰峰值5% 衰减时间一阶频点衰减稳态力矩纹波纯 PID基准 1.0基准 1.00 dB最低平坦前馈 PID约 0.75 倍约 0.8 倍-3 ~ -5 dB中等平坦前馈 ADRC约 0.45 倍约 0.5 倍-8 ~ -11 dB中等偏高平坦前馈 ADRC ZV 整形约 0.30 倍约 0.35 倍-14 ~ -18 dB偏低表中数值为示意量级用于说明各方案的相对关系实际以现场标定为准。读表时要留意的两点一是纯 PID 的稳态力矩纹波最低因为它的控制量变化最平缓抗扰能力换来的是执行器的额外动作工程上要确认伺服阀和液压泵能不能长期承受这个动作频率二是最后一行加整形之后力矩纹波反而下降原因是整形让前馈力矩本身不再含有激发模态的频率成分执行器不需要为抑制振动而反向出力。频谱对比的做法很简单对末端位移做 10 s 加窗 FFT看 $\omega_1(L)$ 附近那一根峰的幅值。注意每次变臂长之后要重新标定 $\omega_1$否则峰的位置对不上会得出“整形无效”的错误结论。5. 现场整定顺序与三类典型症状的排错路径5.1 从空载到满载的整定顺序整定必须分三步走跳步的代价是问题混在一起无法定位。第一步只跑前馈关掉 ADRC 和整形器用手动匀速动作把 $J_{eff}(L)$、$g(y)$ 的标定核对一遍判断依据是稳态关节角误差和匀速段的力矩波动第二步打开 ADRC$\omega_c$ 从低往高加每加一档观察 ESO 的 $z_3$ 是否长期贴近量程边界贴边说明 $b_0$ 标小了第三步才加整形器把 $\Delta t$ 按辨识出的 $\zeta_1$ 重算而不是沿用理论值。5.2 三类症状的定位顺序症状首要怀疑先查什么处理动作抖动频率随臂长在 2.5~5 Hz 间漂增益调度没生效打印当前 $L$ 与查表得到的 $\omega_1$补齐分段表确认插值入口唯一$z_3$ 长期饱和抗扰失效$b_0$ 标定偏差过大空载与满载下的稳态力矩对比重标 $b_0$或改为按 $L$ 在线更新臂架发出高频啸叫阀芯发烫$\omega_o$ 超过伺服阀带宽观测器带宽与阀带宽的比值把 $\omega_o$ 压到阀带宽的 1/5 以下排错顺序上有两条经验值得记住。传感器和标定问题永远排在最前因为 $b_0$ 和 $\omega_1$ 错了之后后面所有的带宽调整都是在补偿一个错误的基准越调越乱。第二fal的 $\alpha$ 和 $\delta$ 是最后才动的参数它们影响的是小误差段的形状解决不了大范围振荡问题如果调完 $\alpha$ 抖动有变化但没消失基本可以断定问题在前面两步。最后一件事整定完成之后把每次改动对应的 $L$、$b_0$、$\omega_o$ 和实测末端峰峰值记成一张表按臂长做成查表基线。下次遇到同类机型起点就从这张表开始而不是从零标定——这是这套方法在现场能真正落地的地方。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价