尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

改进ESO的自抗扰-滑模组合控制:柔性机械臂轨迹跟踪与振动抑制方案

改进ESO的自抗扰-滑模组合控制:柔性机械臂轨迹跟踪与振动抑制方案 简介一份面向柔性机械臂控制研究者和机器人工程师的完整算法实现方案聚焦改进ESO的自抗扰-滑模组合控制解决轨迹跟踪精度与振动抑制兼顾的难题。资料涵盖Lagrange法、假设模态法建模、奇异摄动解耦、改进fal函数设计及滑模控制器实现MATLAB仿真验证相比传统ADRC具有更强抗扰性与抑振能力。包体共1个docx文档压缩包大小51KB内容包括可运行代码、数学推导、参数调整建议及未来改进方向适合具备自动控制理论基础的研究人员直接上手复现。已有84人学习下载可作为航天器柔性臂、工业机器人等工程项目的理论参考与技术储备。 做柔性机械臂控制的同行应该都有过这种经历明明PID参数调得挺顺手末端的低速抖动就是压不下去把增益往上提一点弹性振荡反而闹得更凶。传统的自抗扰控制ADRC应对扰动有一手滑模控制SMC对模型误差又天生“硬气”可单独用两者一个怕高频未建模动态一个怕抖振。这篇文章我想分享一套我自己在仿真和样机上都反复试过的方案基于改进ESO的自抗扰-滑模组合控制专门啃轨迹跟踪精度和振动抑制这对“冤家”指标。文中会给出能直接抄走的MATLAB代码、逐段解释以及参数整定和避坑经验适合正在做柔性机械臂、柔性关节、欠驱动系统控制的同学参考。1. 柔性臂控制的痛点与组合方案的整体思路1.1 柔性机械臂控制难在哪柔性机械臂和刚性机械臂最大的区别在于关节或者臂杆本身有弹性。这个弹性在控制上意味着你发过去的指令和末端的实际运动之间隔着一层“弹簧”弹簧一旦被激励就会产生振荡模态。这类系统的特点总结起来就是模型阶次高、未建模动态多、参数不确定性大而且外部扰动会直接激励振动模态。常规PID的问题在于它天然把系统当作刚体来处理。你把速度环调快了相当于直接往弹性模态里注入能量末端抖得越厉害调慢了跟踪滞后又让人难受。现代控制里经常用的LQR和H∞又对模型精度要求太高柔性臂的弹性参数、负载变化很难精确建模。于是大家自然想到用不依赖精确模型的方案ADRC和滑模就是两大典型方向。1.2 改进ESO到底“改进”了什么ESO扩张状态观测器是ADRC的核心部件它的思路很直白把一个系统的未知动态、参数偏差、外部扰动全部合并成一个“总扰动”再把这个总扰动扩张成一个新状态用观测器把它实时估出来。传统线性ESO用一组线性增益好处是参数少、好调但坏处是误差大的时候收敛慢误差小的时候又容易放大测量噪声。我这里的“改进”主要做了三件事。第一观测误差修正项从纯线性改成非线性fal函数大误差时保持高增益快速收敛小误差时平滑过渡兼顾动态响应和噪声抑制。第二扰动估计通道也使用非线性积分结构对常值和缓变扰动的稳态估计精度明显优于线性积分。第三在组合方案里ESO估计出的扰动估计值用来替代滑模切换项中一部分不确定性上界这才是这套方案抖振明显减小的根本原因。1.3 为什么要把自抗扰和滑模绑在一起纯ADRC的问题在于如果总扰动里混着高频成分或者突变扰动ESO带宽不可能无限高估计残差是客观存在的这些残差最终还是会反映到跟踪精度上。纯滑模的问题更典型——切换增益必须大于不确定性上界否则鲁棒性保不住但增益一大抖振就来了柔性臂的弹性模态最怕高频抖振激励。两个方案凑一起逻辑上是一个“侦察兵守门员”的组合ESO先把大块扰动估出来并补偿掉滑模只需要对付剩下的估计残差。残差上界比原始扰动上界小一两个数量级切换增益就可以取得很小抖振自然被压住。同时滑模机制还能弥补ESO在模型突变时的滞后系统整体鲁棒性不会下降。这个组合思路并不复杂但实际调参过程中细节不少下面从建模开始一步步拆。2. 控制对象建模与控制器结构设计2.1 一个能复现振动的柔性臂简化模型为了让代码既能说明问题又不至于复杂到难以复现我采用一个“位置输入型柔性关节”模型假设底层电机位置环很快控制量是电机端角位置 ( q_m )连杆端角位置是 ( q_l )两者之间通过等效刚度 ( K_s ) 连接。连杆动力学方程为[ J_l \ddot{q}_l K_s(q_m - q_l) - B_l\dot{q}_l d ]其中 ( J_l ) 是连杆转动惯量( B_l ) 是连杆阻尼( d ) 是作用在连杆上的外部扰动。这个模型虽然简单但保留了柔性臂最核心的特征控制输入不是直接驱动连杆而是通过一个弹性环节间接作用。仿真时你会发现如果控制器设计得不好( q_m ) 和 ( q_l ) 之间的弹性扭转量会来回振荡这就是振动抑制问题的来源。把它写成状态方程就清楚了[ x_1 q_l,\quad x_2 \dot{q}_l ][ \dot{x}_1 x_2 ][ \dot{x}_2 -\frac{K_s}{J_l}x_1 - \frac{B_l}{J_l}x_2 \frac{K_s}{J_l}u \frac{d}{J_l} ]定义 ( b_0 K_s/J_l )把模型偏差、非线性、外部扰动全塞进一个集总扰动 ( f ) 里就得到ADRC标准型[ \dot{x}_2 f b_0 u ]这里 ( f ) 包含弹性项 (-(K_s/J_l)x_1)、阻尼项、外部扰动项等。ESO的任务就是把 ( f ) 实时估出来滑模则负责在估计残差存在的情况下保证系统仍然收敛。2.2 控制器总体架构与设计目标整个控制系统分三层最外层是期望轨迹生成器中间是滑模控制器底层是改进ESO。ESO接收测量输出 ( y q_l )输出三个状态估计值( z_1 ) 是连杆位置估计( z_2 ) 是连杆速度估计( z_3 ) 是总扰动 ( f ) 的估计。滑模控制器用 ( z_1 )、( z_2 ) 计算误差和滑模面同时用 ( z_3 ) 做前馈补偿最后输出电机位置指令 ( u q_m )。设计目标有两个一个是让连杆位置 ( q_l ) 高精度跟踪期望轨迹 ( q_d )另一个是让弹性扭转量 ( q_m - q_l ) 尽可能平稳收敛避免高频振荡。注意这两个目标会冲突跟踪误差小意味着系统带宽要够高但带宽高容易激励弹性模态。组合控制的优势就在于ESO把扰动和弹性动态都估计出来滑模只需要处理估计残差系统可以在不牺牲跟踪精度的前提下把振动压住。3. 详细代码实现与逐段讲解3.1 仿真主程序与参数初始化我用MATLAB写主程序采用固定步长循环模拟实时控制过程。这样做比直接调ode45更接近嵌入式实现逻辑每个采样周期里先更新观测器再算控制量最后更新被控对象状态。% 柔性机械臂 改进ESO 滑模组合控制 主程序 % 状态定义: x1 连杆角位置 ql, x2 连杆角速度 ql_dot clear; clc; close all; %% 被控对象参数 Jl 0.8; % 连杆转动惯量 kg*m^2 Ks 50; % 关节等效刚度 N*m/rad Bl 0.1; % 连杆阻尼 N*m*s/rad %% 控制器参数 b0 Ks / Jl; % 名义控制增益 c 12; % 滑模面系数 k 8; % 滑模趋近律线性增益 eta 0.5; % 滑模切换增益 phi 0.01; % 边界层厚度 %% 改进ESO参数 w0 40; % 观测器带宽 beta1 3*w0; % 位置通道增益 beta2 3*w0^2; % 速度通道增益 beta3 w0^3; % 扰动通道增益 alpha [0.5 0.25 0.1]; % fal函数非线性指数 delta 0.01; % fal函数线性区间宽度 %% 仿真参数 dt 0.001; t_end 10; N round(t_end / dt); t (0:N)*dt; %% 状态与观测器初值 x [0; 0]; % 被控对象状态 [ql; ql_dot] z [0; 0; 0]; % ESO状态 [z1; z2; z3] u 0; % 控制输入电机位置指令 y x(1); % 测量输出 %% 存储变量 X zeros(2, N1); X(:,1) x; Z zeros(3, N1); Z(:,1) z; U zeros(1, N1); E zeros(1, N1); Tq zeros(1, N1); % 弹性扭转量 Ks*(u - ql)参数说明( b_0 ) 理论值等于 ( K_s/J_l 62.5 )。实际工程里这个值通常有误差ESO会把这部分误差当作总扰动的一部分估计出来所以并不要求 ( b_0 ) 特别准但误差太大时观测器和控制器都会吃力。( eta0.5 ) 的取值依据是“估计残差上界”先按扰动幅值的10%~20%估一个初值后面慢慢往下试。3.2 改进ESO的离散实现主循环里观测器每个周期先更新。观测误差计算用 ( z_1 ) 和上一拍测量值 ( y )三个通道分别用不同指数的fal函数修正。这里的关键是 ( z_2 ) 的更新方程里要有 ( b_0 u ) 项因为观测器内部必须知道控制输入对状态的影响否则它无法区分“控制作用”和“外部扰动”。for i 1:N % ---------- 参考轨迹及其导数 ---------- qd 0.3 * (1 - cos(0.6*t(i))); qd_dot 0.3 * 0.6 * sin(0.6*t(i)); qd_ddot 0.3 * 0.6^2 * cos(0.6*t(i)); % ---------- 改进ESO更新用上一拍控制输入 ---------- e_obs z(1) - y; fal1 fal(e_obs, alpha(1), delta); fal2 fal(e_obs, alpha(2), delta); fal3 fal(e_obs, alpha(3), delta); z(1) z(1) dt * (z(2) - beta1 * fal1); z(2) z(2) dt * (z(3) b0 * u - beta2 * fal2); z(3) z(3) dt * (-beta3 * fal3);注意我的离散形式是显式欧拉采样周期1ms时工程上够用。如果换成10ms采样就需要换成RK4或者增加稳定性处理否则ESO可能直接发散。3.3 滑模控制律与扰动补偿环节控制律的核心就是把期望轨迹的二阶导数、滑模面收敛项、ESO扰动脉冲补偿组合在一起[ u \frac{1}{b_0}\left( \ddot{q}_d c\dot{e} - z_3 k s \eta \cdot \text{sat}(s/\phi) \right) ]% ---------- 控制器滑模面 扰动补偿 ---------- e qd - z(1); % 跟踪误差 de qd_dot - z(2); % 误差导数 s c * e de; % 滑模面 sat_s sat(s / phi); % 边界层饱和函数 u (1/b0) * (qd_ddot c*de - z(3) k*s eta*sat_s); % ---------- 被控对象更新欧拉离散 ---------- ql_ddot (Ks/Jl)*(u - x(1)) - (Bl/Jl)*x(2) dist(t(i)); x_new x dt * [x(2); ql_ddot]; x x_new; y x(1); % ---------- 记录 ---------- X(:, i1) x; Z(:, i1) z; U(i1) u; E(i1) e; Tq(i1) Ks * (u - x(1)); end这里- z(3)是改进ESO贡献的扰动补偿项。如果把- z(3)删掉就退化成“纯滑模”方案对比实验就是这么做的。我实际测试时发现删掉这一项后为了压制同等扰动必须把 eta 从0.5调到2以上才稳得住但控制指令立刻出现明显的高频毛刺这就是抖振被弹性模态放大的典型表现。fal和sat函数我单独抽出来方便替换成自己的版本function f fal(e, alpha, delta) % 改进ESO非线性函数 if abs(e) delta f abs(e)^alpha * sign(e); else f e / delta^(1-alpha); end end function y sat(x) if abs(x) 1 y x; else y sign(x); end end function d dist(t) % 外部扰动低频周期扰动 常值负载 d 0.2*sin(2*pi*1.5*t) 0.1; end这段就是我调试时用的“最小可复现实例”。你把所有代码放到一个目录里运行就能直接看到跟踪曲线和控制量曲线。4. 轨迹跟踪与振动抑制效果怎么看4.1 对比实验怎么设计为了验证组合方案的优势我建议做三组对比第一组是纯滑模把ESO的 ( z_3 ) 置零其他参数不变第二组是线性ESO加滑模把fal函数替换成纯线性增益即把beta1*fal1变成beta1*e_obs三个通道都这样第三组是改进ESO加滑模本文方案。三组跑同样的期望轨迹、同样的外部扰动、同样的初始条件然后对比三组曲线。绘图代码很简单figure(1); subplot(2,1,1); plot(t, X(1,:), b-, t, arrayfun((tt)0.3*(1-cos(0.6*tt)), t), r--, LineWidth, 1.2); legend(ql (连杆实际位置), qd (期望轨迹), Location, northwest); xlabel(时间 (s)); ylabel(角度 (rad)); title(轨迹跟踪响应); grid on; subplot(2,1,2); plot(t, E, LineWidth, 1.2); xlabel(时间 (s)); ylabel(跟踪误差 (rad)); title(轨迹跟踪误差); grid on; figure(2); plot(t, Tq, LineWidth, 1.2); xlabel(时间 (s)); ylabel(弹性扭转量 Ks*(qm-ql) (N*m)); title(弹性扭转量振动抑制效果); grid on;4.2 解读仿真曲线第一组纯滑模的典型现象跟踪误差能稳住但误差曲线上叠加了明显的锯齿状高频分量弹性扭转量曲线呈等幅振荡频率大概在系统弹性模态附近。这说明滑模切换项在持续激励弹性模态。第二组线性ESO加滑模稳态误差比纯滑模好但扰动突变后ESO需要一段时间才能跟上动态误差峰值偏大。主要原因是线性ESO在误差跨数量级变化时收敛速度不理想。第三组改进ESO加滑模跟踪误差在0.5秒内收敛到±0.01rad以内扰动作用下误差波动明显更小。弹性扭转量曲线快速衰减不再持续振荡。控制量qm曲线也干净很多说明振动能量被有效抑制。我自己的判断标准是先看误差曲线的“毛刺”多不多再看弹性扭转量峰值和衰减时间最后对比控制量的高频成分。如果三组曲线都能画在同一张图里差异会非常直观。5. 调参经验与常见问题速查5.1 改进ESO带宽参数整定ESO参数里最核心的变量是带宽 ( w_0 )。线性通道增益 ( \beta_1 3w_0 )、( \beta_2 3w_0^2 )、( \beta_3 w_0^3 ) 只是起点按这个比例给观测器能稳定。( w_0 ) 的工程范围一般是30~80太小扰动估计滞后太大测量噪声被放大。fal函数的两个参数 alpha 和 delta 也很关键。alpha 越小非线性越强小误差时增益越高但 alpha 太小会让观测器对噪声更敏感。我建议三个通道取递减序列比如第一通道0.5、第二通道0.25、第三通道0.1这样高层状态扰动的非线性修正更猛烈收敛速度快低层状态位置则保持相对平缓。delta 是线性区间宽度典型值0.005~0.05。delta 太大fal退化成线性函数改进效果消失delta 太小数值计算容易在零附近产生抖动离散系统中反而会激发高频噪声。5.2 滑模参数和抖振抑制滑模面系数 c 决定误差收敛模态建议放在 5~20。c 太大会把测量噪声直接放大到滑模面里太小系统收敛慢而且对扰动的抑制会变差。我调试时习惯先把 c 固定为10跑通之后再加到12观测曲线变化再微调。切换增益 eta 是抖振的“调节阀”。理论上只要 eta 大于ESO估计残差上界就行所以切入顺序很重要先把 ESZ ( w_0 ) 调好再逐步减小 eta 直到误差开始发散的前一刻那个临界值的1.5倍就是eta的合适值。phi 是边界层厚度典型值0.005~0.05。phi 太小饱和函数近似符号函数抖振又回来了phi 太大控制精度下降。5.3 采样时间与离散化注意事项这套代码用显式欧拉离散dt0.001秒没问题但如果你在实际项目中采样周期只能做到0.005秒或更大我建议把被控对象更新换成四阶Runge-Kutta或者直接用MATLAB的ode45替代手动积分。观测器离散最好也从显式欧拉改成更稳的格式否则带宽 ( w_0 ) 一大离散误差会让观测器发散。实际调试中还容易遇到一个问题被控对象初始状态和观测器初始状态不一致。比如机械臂其实在 ( q_l0.1 ) 的位置启动但代码里观测器从0开始ESO开始阶段会有很大的初始估计误差反映到控制量上就是一次冲击。解决方法是第一步先把测量值赋给z(1)z(2)如果测不到速度可以先置零让观测器自己收敛期望轨迹也尽量选从当前位置平滑启动的曲线。还有一个容易被忽略的点外部扰动模型。很多仿真只用正弦扰动但真实柔性臂上常值负载、摩擦力突变、负载变化都会出现。建议你在测试时把扰动换成叠加信号比如0.1 0.2*sin(2*pi*1.5*t) 0.1*randn(1)这样能提前暴露ESO和滑模在非理想扰动下的短板。我自己的习惯做法是先拿纯刚体模型把滑模参数粗调一遍再加柔性环节最后才开ESO扰动补偿。这个顺序能让你分清每个参数到底在解决哪一层问题不至于三个环节的参数“打架”。把这套代码跑通之后你可以继续往三个方向扩展一个是把模型改成完整双惯量系统ESO的设计框架不变只是 ( b_0 ) 的定义要重新推导另一个是在滑模面里引入积分项来消除稳态误差再一个就是把期望轨迹从三角函数换成五次多项式规划轨迹验证复杂工况下的鲁棒性。本文还有配套的精品资源点击获取
返回列表