ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

两连杆SEA机械臂的自适应动态面控制与一阶变阻抗柔顺控制设计

两连杆SEA机械臂的自适应动态面控制与一阶变阻抗柔顺控制设计 简介串联弹性执行器SEA通过在电机与负载间引入弹簧元件为机器人关节带来天然的柔顺性与冲击吸收能力但同时也使系统从二阶升至四阶传统PID加前馈控制难以兼顾轨迹跟踪与接触力调节。动态面控制DSC通过一阶低通滤波器避免了反步法中的微分爆炸问题结合自适应参数在线估计可有效应对负载变化与摩擦漂移等不确定性。在此基础上引入一阶变阻抗策略使刚度与阻尼在自由运动和接触阶段平滑过渡避免接触力尖峰冲击。这类柔顺控制技术广泛应用于力控机械臂、装配打磨与人机协作场景。本文围绕两连杆SEA机械臂的完整建模、控制器设计、Simulink仿真与参数整定过程重点剖析从稳定性推导中提取关键参数的方法以及多环节耦合时的工程调试经验为从事柔顺控制与阻抗控制的工程师提供一套可复用的实践框架。 做这个项目之前我其实已经在刚性关节机械臂上折腾了大半年感觉自适应、反步法这类东西也就那样。直到有一天我把一台老实验台上的谐波减速器换成串联弹性执行器SEA整个控制架构彻底乱套了原来PID加前馈就能跑得好好的轨迹跟踪加了弹簧之后直接开始抖末端接触硬物时冲击大得吓人。后来我把动态面控制DSC、自适应参数估计和一阶变阻抗揉到一起才算真正把这套两连杆SEA机械臂驯服。如果你也在做SEA关节、柔顺控制或者阻抗控制相关的内容这篇就是把我的真实调试过程完整摊开来讲哪些参数是拍脑袋定的、哪些必须从稳定性推导里抠出来全都说清楚。1. 项目背景与控制方案选型1.1 为什么非要选择SEA作为执行方案串联弹性执行器的核心就是在电机输出轴和负载之间串联一个弹簧元件。好处听着很美好力可以通过弹簧变形量间接测得、关节具备天然的冲击吸收能力、力控制的带宽比刚性关节高。但代价同样明显系统阶数变高原来的二阶机械系统直接变成四阶系统控制器的设计和参数整定难度不是一个量级的。我手头的两连杆SEA机械臂第一关节和第二关节都装有一套SEA弹簧刚度分别是500 N·m/rad和380 N·m/rad。刚开始我天真地想把SEA当成一个刚性关节加上力传感器来用反正内部有电流环做一个扭矩PI就行。结果实测下来做轨迹跟踪的时候末端稳态误差能到3厘米以上做恒力跟踪时力波动超过了20%。后来我才彻底明白SEA的弹簧刚度相对较低时负载端和外环之间本身就是带柔性的耦合系统控制律必须把弹簧的弹性力当作一个独立状态来对待不能简单忽略。这就是整个设计从零开始重构的根本原因。1.2 动态面控制与传统反步法的对比两连杆机械臂的动力学是一个标准的二阶非线性系统传统反步法的思路很直接定义跟踪误差、设计虚拟控制律、逐步回推最后得到实际控制律。但有一个让人很崩溃的麻烦——“微分爆炸”。具体来说反步法第三步要用到虚拟控制律的二阶甚至三阶导数原本一个简单的参考轨迹经过两三次求导之后表达式变成一长串符号杂乱的项在Simulink里实现的时候又慢又容易出错而且对噪声极其敏感。动态面控制Dynamic Surface Control, DSC就是专门来解决这个问题的。它的做法是在每一步虚拟控制律输出之后插进一个一阶低通滤波器[ \tau_f \dot{v}_i v_i \alpha_i ]其中 (\alpha_i) 是原始的虚拟控制量(v_i) 是滤波后的输出(\tau_f) 是滤波器时间常数。这样一来后面步骤只需要对滤波后的信号 (v_i) 求导而 (v_i) 的导数在滤波器方程里直接就是 ((\alpha_i - v_i)/\tau_f)完全避开了解析求导。我用一个很直观的类比来理解这件事反步法像是要求你百米冲刺的时候每一步都算清楚脚踝的角度、速度和力矩的导数而动态面控制是给每一步加了一个缓冲垫你只需要知道上一个缓冲垫的目标值剩下的交给垫子的动力学去平滑。代价就是跟踪精度会损失一点点但这和微分爆炸导致的实现复杂度相比完全不值一提。1.3 引入自适应控制和一阶变阻抗的考量点两连杆SEA系统里不确定性来源太多了。连杆质量和质心位置在不同负载条件下会变化关节摩擦力矩的老化和温漂更是让人抓狂。如果用固定参数控制器要么在标称工况下性能爆炸要么只能把控制器参数调得非常保守。自适应控制的好处是它利用系统的线性参数化特性在线更新参数估计让控制器跟着实际负载走。变阻抗为什么也要加因为单纯的自适应动态面控制只能保证轨迹跟踪但我们的目标是柔顺接触任务机械臂从自由空间运动到接触面这个过程中阻抗参数必须变化。自由运动时希望刚度大一点跟踪性能好接触时希望刚度降低、阻尼增大避免接触力过大。如果直接在某个时刻把目标刚度从大跳变小力信号会出现明显的尖峰冲击。所以我选择给阻抗参数本身也加一阶动态让刚度和阻尼按指数平滑过渡到新目标值这个“一阶变阻抗”就变成了整套系统的外环。2. 两连杆SEA系统建模与参数化2.1 负载端两连杆动力学方程推导建模是整个工作的地基模型错了后面控制器的稳定性结论全是自欺欺人。我这里采用拉格朗日方法推导负载端的两连杆动力学标准形式如下[ M(q)\ddot{q} C(q,\dot{q})\dot{q} G(q) \tau_s \tau_{ext} ]其中 (q \in \mathbb{R}^2) 是负载端关节角度向量也就是连杆端的角度不是电机侧角度(M(q)) 是2x2惯性矩阵(C(q,\dot{q})) 是科氏力和离心力矩阵(G(q)) 是重力项(\tau_s) 是弹簧传递给负载端的力矩(\tau_{ext}) 是环境接触外力矩。具体展开惯性矩阵以第一关节和第二关节质量 (m_13.5,\text{kg})、(m_22.2,\text{kg})连杆长度 (l_10.4,\text{m})、(l_20.35,\text{m}) 为例[ M_{11} m_1 l_{c1}^2 m_2 (l_1^2 l_{c2}^2 2 l_1 l_{c2}\cos q_2) I_1 I_2 ][ M_{12} M_{21} m_2 (l_{c2}^2 l_1 l_{c2}\cos q_2) I_2 ][ M_{22} m_2 l_{c2}^2 I_2 ]其中 (l_{c1}, l_{c2}) 分别是连杆质心到关节轴的距离(I_1, I_2) 是连杆绕质心的转动惯量。看到科氏矩阵里的余弦项了吗这就是非线性耦合的真正来源。建模时有个非常实用的经验先用Matlab的符号工具箱把整个拉格朗日推导自动化得到 (M) 和 (C) 的封闭表达式再手写进控制代码。千万不要手动展开符号错一个余弦项后面仿真结果会烂到完全看不出方向。2.2 电机侧与SEA弹簧的建模SEA的电机侧动力学比普通电机模型多了一项弹簧反力矩[ J_m \ddot{\theta}_m b_m \dot{\theta}_m \tau_s \tau_m ]其中 (\theta_m) 是电机轴角度(J_m) 是电机转子惯量(b_m) 是电机侧黏性摩擦系数(\tau_m) 是电机输出力矩(\tau_s) 是弹簧力矩。弹簧力矩由电机轴和负载轴的转角差决定[ \tau_s k_s (\theta_m - q) ]这里 (k_s) 就是弹簧刚度。请注意因为弹簧是线性元件整个系统实际上包含两个耦合的二阶子系统电机侧和负载侧。负载侧的状态受到 (\tau_s) 的影响而 (\tau_s) 又由两侧角度的差决定所以系统是标准的四阶动力学系统。在仿真实现时我用一个状态向量包含四个变量(q_1, q_2, \dot{q}1, \dot{q}2, \theta{m1}, \theta{m2}, \dot{\theta}{m1}, \dot{\theta}{m2})共8个状态。写动力学函数时注意负载侧用 (M(q)) 的逆矩阵求 (\ddot{q})电机侧直接用 (J_m) 求 (\ddot{\theta}_m)这是最朴素也最不容易出错的方式。2.3 线性参数化形式与回归矩阵自适应控制要求系统能写成“已知量矩阵 × 未知参数向量”的形式。也就是把所有含有未知参数的项从方程中剥离[ Y(q, \dot{q}, v, \dot{v}) \Theta M(q)\dot{v} C(q,\dot{q})v G(q) ]其中 (\Theta) 是未知参数向量在我的模型里包括 (m_1, m_2, I_1, I_2, m_1 l_{c1}, m_2 l_{c2}) 等(v) 是给定的参考速度信号。这里的核心操作就是把式子里所有与参数相乘的量单独拆出来。比如 (M(q)\dot{v}) 展开后会得到 (\dot{v}1 M{11} \dot{v}2 M{12}) 这样的项每一项目里 (m_1)、(m_2) 等参数前面的系数就是回归矩阵的对应元素。我用符号工具箱配合一个简单函数完成了这个分解把符号表达式丢进去自动提取参数向量和回归矩阵。这样做的最大好处是后续控制器代码里只需要用现成的 (Y) 矩阵乘上估计参数 (\hat{\Theta})不用每次改动模型都重写一大坨。3. 自适应一阶变阻抗动态面控制器设计3.1 外环阻抗目标与一阶变阻抗参数更新控制架构分两层外层是阻抗环内层是动态面自适应环。外环的任务是生成参考加速度和期望弹簧力矩它的核心是一组期望阻抗方程[ M_d \ddot{e} B_d \dot{e} K_d e \tau_{ext} ]其中 (e q - q_d) 是关节位置误差(M_d) 是期望惯量矩阵通常取常数对角阵(B_d) 是期望阻尼矩阵(K_d) 是期望刚度矩阵(\tau_{ext}) 是环境外力矩。传统固定阻抗控制的问题在接触前后不好权衡。我的做法是让 (K_d) 和 (B_d) 本身也随时间动态变化而且变化过程用一阶动力学来平滑[ \dot{K}d -\lambda_K (K_d - K{ref}) ][ \dot{B}d -\lambda_B (B_d - B{ref}) ](K_{ref}) 和 (B_{ref}) 是当前任务阶段对应的目标阻抗参数。比如接触检测前 (K_{ref}800)接触发生后切换为 (K_{ref}200)(B_{ref}) 从10提升到60。(\lambda_K, \lambda_B) 控制过渡速度。为什么要这一层平滑我踩过的坑是直接把刚度从800跳变到200接触力波形会出现一个尖锐的脉冲幅度甚至能达到期望力的50%以上这在打磨、装配类任务里完全不可接受。3.2 内环动态面控制的设计步骤外环阻抗方程求解得到的是参考加速度 (\ddot{q}_{des})再加上期望阻抗中的阻尼和刚度项我定义了一个修正后的期望速度 (v_f) 作为动态面控制的目标。整个内环设计分三步走第一步定义位置跟踪误差 (z_1 q - q_d)设计虚拟控制律[ \alpha_1 \dot{q}_d - c_1 z_1 ]按DSC的套路(\alpha_1) 不直接进入下一步而是先过一个一阶滤波器[ \tau_f \dot{v}_f v_f \alpha_1 ]第二步定义速度误差 (z_2 \dot{q} - v_f)。这里利用外环阻抗给出的目标加速度和动力学模型设计期望的弹簧力矩 (\tau_d)[ \tau_d Y(q, \dot{q}, v_f, \dot{v}_f)\hat{\Theta} - K_2 z_2 ]注意这里为了保证系统稳定还需要在 (\tau_d) 中加入前馈补偿。阻抗目标里的 (K_d e B_d e) 自然包含在 (z_2) 的定义和虚拟控制 (\alpha_1) 中所以不需要额外处理。第三步定义弹簧力矩误差 (z_3 \tau_d - \tau_s)。利用SEA模型电机端控制律是[ \tau_{m} J_m \dot{v}_m b_m \dot{\theta}_m \tau_s K_3 z_3 ]其中 (\dot{v}_m) 包含对 (\tau_d) 的滤波处理。这里的动态面滤波同样应用在 (\tau_d) 的导数上避免对 (\tau_d) 直接求导产生的高阶导项。3.3 自适应律设计与稳定性分析框架自适应律选取标准的形式[ \dot{\hat{\Theta}} -\Gamma Y^T z_2 - \sigma \hat{\Theta} ](\Gamma) 是自适应增益矩阵(\sigma) 项是σ修正防止参数漂移。我在实验中刚开始不加σ修正自适应参数在没有持续激励的情况下会慢慢漂到不合理区间甚至出现负质量参数这种荒唐值仿真曲线看过去系统还稳定实际机器人一旦遇到扰动就刹不住。加上σ修正后参数被拉向一个界内区域鲁棒性提高一个档次。稳定性分析用的是经典Lyapunov方法。构造候选函数[ V \frac{1}{2} z_1^T z_1 \frac{1}{2} z_2^T M z_2 \frac{1}{2} z_3^T J_m z_3 \frac{1}{2} \tilde{\Theta}^T \Gamma^{-1} \tilde{\Theta} ]其中 (\tilde{\Theta} \Theta - \hat{\Theta}) 是参数估计误差。对V求导代入控制器和自适应律利用科氏矩阵的反对称性质 ( \dot{M} - 2C ) 是反对称矩阵以及滤波误差项小于一个与(\tau_f)相关的界可以得到闭环系统半全局一致最终有界SGUUB的结论。这个结论的实际含义是只要滤波器时间常数选得足够小、控制增益足够大系统的跟踪误差和参数估计误差会收敛到一个可以调节的小界内。3.4 内环外环耦合的一个易错点很多人在设计这种两层结构时容易忽略内外环的耦合问题。外环输出的是期望加速度内环控制的是弹簧力矩二者通过期望弹簧力矩 (\tau_d) 连接起来。如果内环偏差 (z_3) 很大外环的阻抗目标没有实际驱动力支撑整个系统就会出现“外环算得美滋滋、内环追不上”的脱节现象。所以我在设计时特意在 (\tau_d) 里保留了速度误差反馈项 (K_2 z_2)保证当内环还没跟上时外环也有一个阻尼性恢复力不至于发散。4. Simulink仿真实现与参数配置4.1 仿真工程结构与模块化拆解整个仿真工程我命名为fullyfma.slx这个名字其实就是“全状态反馈 自适应 力/位置调节”的缩写没什么特殊含义纯粹是我习惯性的文件命名风格。工程结构上我分了四个彼此独立的子系统模块方便单独调试。第一是参考信号生成模块。内部实现是先规划好两连杆的关节角轨迹比如让第二连杆执行一个正弦摆动第一关节保持一个设定角度同时切换接触任务信号。轨迹都用五次多项式平滑过渡初始速度和加速度为0。第二是控制器模块。内部拆成三个子模块变阻抗参数生成器、动态面外环、自适应内环。变阻抗模块用两个积分器加一个比例环节实现一阶动态更新动态面外环包含两个一阶低通滤波器自适应内环负责实时计算回归矩阵 (Y) 和参数更新律。第三是SEA两连杆动力学模块。我用一个Level-2 MATLAB S-function实现因为涉及矩阵求逆和状态解耦用内置Simulink模块搭反而容易搞错。第四是环境接触模块。用简化的弹簧阻尼接触模型检测末端位置触及表面后施加接触力 (F k_{env} x_{pen} b_{env} \dot{x}{pen})其中 (x{pen}) 是穿透深度。4.2 关键参数设置与整定思路我把完整参数列个表方便参考参数符号数值说明连杆1质量(m_1)3.5 kg实际系统含减速器等连杆2质量(m_2)2.2 kg实际末端负载连杆1长度(l_1)0.4 m关节1到关节2连杆2长度(l_2)0.35 m关节2到末端SEA弹簧刚度(k_s)500 / 380 N·m/rad关节1/2不同刚度电机转子惯量(J_m)0.01 kg·m²含减速器折算值电机黏性摩擦(b_m)0.1 N·m·s/rad实测拟合DSC位置增益(c_1)20越大跟踪越紧速度误差增益(K_2)15阻尼调节作用弹簧力矩误差增益(K_3)300内环快速收敛滤波器时间常数(\tau_f)0.005 s需要权衡见第5章自适应增益(\Gamma)30对角矩阵σ修正系数(\sigma)0.001默认很小阻抗目标刚度(自由)(K_{ref})800 N·m/rad跟踪优先阻抗目标刚度(接触)(K_{ref})200 N·m/rad柔顺优先阻抗目标阻尼(接触)(B_{ref})60 N·m·s/rad限冲击变阻抗平滑系数(\lambda_K, \lambda_B)4~0.25s过渡时间期望惯量(M_d)0.5 单位阵可调初版参数怎么定我的习惯是先把自适应增益设成0也就是说先让控制器退化为固定参数DSC调通基础跟踪性能再逐步打开自适应和变阻抗。这是分阶段调试的核心策略避免一堆参数交叠在一起出了问题根本分不清是哪一环引起的。4.3 仿真结果的核心观察点三组对比实验值得重点看。第一组是固定阻抗与一阶变阻抗的接触力对比。末端接近一个刚性平面接触后目标接触力设为30 N固定阻抗模式下接触力峰值冲到47 N而一阶变阻抗模式下峰值只有34 N而且收敛到30 N的时间更短大概0.6秒。这就是平滑过渡的价值体现。第二组是自适应参数估计的效果。设置负载端在3秒时增加一块0.5 kg的配重固定参数控制器在配重加入瞬间跟踪误差从0.01 rad飙到0.08 rad自适应控制器在经历0.4秒左右的重新收敛后误差回到0.015 rad附近。这里能直观看到自适应环节的意义。第三组是滤波器时间常数的影响。(\tau_f) 从0.5秒调到0.005秒跟踪误差明显减小但控制力矩信号的高频抖动加剧。这个权衡只有通过多次仿真才能真正感受到也是后面调试过程中最花时间的参数之一。5. 调试过程中的常见问题与实战心得5.1 动态面滤波器时间常数的选择依据滤波器时间常数 (\tau_f) 是整个DSC算法里最敏感的参数没有之一。太大虚拟控制量被过度平滑跟踪误差变大阻抗特性失真太小DSC就失去了“避免微分爆炸”的意义控制律接近原始反步法高频噪声会直接串进力矩信号。我的经验公式是设定目标闭环带宽 (f_{BW})比如10 Hz那么 (\tau_f) 取 (1/(2\pi f_{BW})) 的1/5到1/10比较稳妥。实测下来我这里的系统目标带宽约10-15 Hz(\tau_f) 取0.005秒效果最好。如果控制通道存在明显的执行器延迟(\tau_f) 还要适当调小一点因为滤波器延迟会叠加在执行器延迟上整体相位裕度会下降。另外两个关节如果物理参数差异大可以分别设置不同的 (\tau_f)不要盲目统一。我第二关节弹簧刚度比第一关节小动态响应慢所以它的滤波器时间常数取了0.008秒整体效果比统一0.005更好。5.2 自适应增益与参数漂移的对抗自适应增益 (\Gamma) 是一个典型的双刃剑。 (\Gamma) 大参数收敛速度快但噪声敏感度和参数漂移风险也暴涨。我在调试时遇到过非常有代表性的现象(\Gamma100) 时参数估计从初值迅速逼近真实值接触力跟踪也表现良好但仿真进行到40秒以后估计出的质量参数开始缓慢单调上升明显偏离真实物理范围。这是典型的不满足持续激励条件的参数漂移。解决办法有两层。第一层是加σ修正让参数估计项在目标函数里带一个小的阻尼惩罚这基本是标配。第二层是手动限制参数搜索范围在自适应律更新代码里加饱和逻辑比如 (m_1) 的估计值限制在2-5 kg范围内。两层同时用上长期仿真稳定性才算真正解决。实操提示如果你发现自适应参数在刚启动时有明显突变检查初始估计值。设置初始估计为标称值的60-80%通常比设置为0更平滑因为自适应律刚开始会先追逐一个离谱的大误差项导致控制力矩初段有尖峰。5.3 一阶变阻抗切换频率与冲击的关系变阻抗的平滑系数 (\lambda) 直接决定系统在任务切换时的瞬态行为。我一开始把 (\lambda) 设成20想着反正是一阶平滑快一点也无所谓结果接触力峰值依然超过目标力40%。后来分析发现虽然阻抗参数本身被平滑了但阻抗参数变化引起的期望力矩变化率依然很大还来不及被 (\tau_d) 里的反馈项抑制。把 (\lambda_K, \lambda_B) 降到4之后过渡时间大约0.25秒在这个时间段里阻尼也在同步增大从10到60有效吸收了接触冲击。这给我的经验是变阻抗平滑系数的量级要跟任务切换持续时间和期望阻尼的增速匹配而不是单纯追求越平滑越好。如果任务要求更快的响应可以把过渡时间压缩到0.1秒但前提是增大接触阻尼的增长速度否则必然会重新出现力尖峰。5.4 数值求解器与仿真步长的选择技巧带SEA的机械臂模型存在明显的柔性模态尤其是弹簧刚度较大时系统呈刚性特征。仿真时如果无脑用默认的ode45可能出现两类问题一是仿真步长自动缩减导致卡顿二是结果异常发散看起来像是控制器不稳定实际是数值积分精度不足。我的经验是分场景选择。参数调试阶段用ode15s它适合刚性系统仿真速度快但精度略差。最终验收阶段换用固定步长ode4步长设1e-4秒这样能保证高频状态弹簧力和电机速度的解析精度。实测下来de45在柔性模态频率超过100 Hz后结果可信度确实不够高后处理曲线会出现毛刺容易误导参数判断。5.5 常见问题速查表故障现象可能原因解决手段仿真发散误差快速增大控制增益过大或滤波器时间常数过小先减小 (K_3)再加大 (\tau_f) 重调接触力超调严重阻抗过渡太快或阻尼不足降低 (\lambda_K)同步提高 (B_{ref})自适应参数持续漂移无持续激励或σ过小加大σ添加参数饱和限幅轨迹跟踪稳态误差大虚拟控制增益 (c_1) 不足或滤波器过平滑增大 (c_1)减小 (\tau_f)电机力矩高频抖动自适应增益过大或微分噪声减小 (\Gamma)检查信号滤波弹簧实测力与控制目标偏差大SEA参数标定不准做离线静态标定校准 (k_s)内环能跟上但整体响应慢外环阻抗 (M_d) 过大减小 (M_d)加快外环动态5.6 一个容易被忽略的实践细节状态初始化最后分享一个我多次踩过的坑仿真初始化时如果SEA电机端角度和负载端角度初始值设置不一致弹簧在控制启动瞬间就会有一个巨大的预紧力导致初始力矩饱和控制器还没开始工作就已经触发饱和。解决办法是在初始化阶段把电机角度设置为使弹簧力矩为0的值也就是 (\theta_m(0) q(0))。如果是通过期望力启动让 (\theta_m(0) q(0) \tau_{des}/k_s)。这个细节在大多数论文里不会写但实际工程中不处理的话前0.1秒的控制输出就是乱飞的。另外再提一点做自适应控制时如果把初始参数估计值恰好设置为标称值仿真结果往往好得没有说服力。务必在验证阶段把初始参数故意调偏20%-30%看看自适应律能否在线把参数拉到正确区间这才是检验鲁棒性的正确姿势。这套方案跑通之后我又试着把同样的控制架构移植到一个六维力控平台上外环从关节空间换到笛卡尔空间整体的方法学基本可以直接复用。动态面控制加自适应处理SEA柔性和参数不确定性一阶变阻抗提供任务级的柔顺过渡这套组合对大部分力控机器人项目都是值得尝试的框架。本文还有配套的精品资源点击获取
返回列表