ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SEA驱动机械臂的自适应动态面变阻抗控制设计

SEA驱动机械臂的自适应动态面变阻抗控制设计 简介机器人控制中柔顺性是保证机械臂安全交互的关键。串联弹性执行器SEA通过引入弹簧柔性能有效提升力矩控制精度与碰撞安全性但低频谐振限制了系统带宽。阻抗控制将机械臂末端建模为质量-阻尼-弹簧系统通过调节期望刚度与阻尼可兼顾轨迹跟踪与接触柔顺。针对SEA驱动的两连杆机械臂强非线性与参数不确定性使得传统控制方法难以平衡性能与稳定性。自适应控制可在线估计负载变化动态面控制则避免反步法的微分爆炸问题一阶变阻抗平滑切换刚柔状态。本文基于这些技术设计了一套动态面自适应阻抗控制方案并通过仿真验证了其在接触力抑制和跟踪精度上的有效性可为机器人柔顺控制工程实践提供参考。 做机器人控制这些年SEASeries Elastic Actuator串联弹性执行器一直是我偏爱的驱动方案。它在电机和负载之间加了一个弹簧天生自带柔性力矩控制精度高碰撞时还能缓冲但代价也很明显——弹簧会引入低频谐振模态把系统带宽拉低控制器稍微给大增益就容易抖起来。再加上两连杆机械臂本身强非线性、参数不确定传统PID根本兼顾不了“轨迹跟踪”和“接触柔顺”这两个目标。所以我最近把动态面控制、自适应控制、一阶变阻抗控制组合到了一起在SEA驱动的两连杆机械臂上做了一套完整的阻抗控制方案效果比我预想中更稳。这套方案解决的核心问题不复杂让机械臂在高速跟踪轨迹的同时碰到环境时能主动“软下来”并且不依赖精确的负载和摩擦参数。整套设计从建模、控制器推导到仿真调参我踩了不少坑今天把这些过程、公式和调试经验一并记下来供做机器人控制的朋友参考。1. 系统建模两连杆SEA机械臂的动力学到底怎么列1.1 两连杆机械臂本体模型平面两连杆机械臂是机器人控制研究里的经典对象。它自由度少但非线性一点不少惯性矩阵随位形变化科氏力和离心力耦合明显重力项也得老老实实写。动力学方程一般写成M(q)q̈ C(q,q̇)q̇ G(q) τ其中 q[q1, q2] 是两关节角M(q) 是 2×2 惯性矩阵C(q,q̇) 是科氏力和离心力矩阵G(q) 是重力项τ 是关节驱动力矩。这里我按平面臂处理重力项不算太复杂如果做空间机械臂还要再叠加更多项但两连杆的核心难点不在重力而在于 M(q) 随位形变化并且 C 矩阵的选取不能随便来必须满足 Ṁ - 2C 的反对称性质。这个性质是后面用 Lyapunov 方法设计控制器的基础建模时如果 C 矩阵选得不对后面所有稳定性证明和自适应律设计都会出问题。实际建模时我并不会把质量参数当成“精确已知”。我给臂的标称参数是 L10.45 mL20.35 mm12.0 kgm21.2 kg重心设在连杆中点转动惯量按均质杆近似计算。但一旦末端夹持不同工具m2 和整体转动惯量就会明显变化这也是自适应控制真正要应对的场景——在线估计这些参数而不是依赖离线标定结果。一个实用的建模建议把所有参数先集中到一个参数向量 p 里然后把动力学改写成“回归矩阵乘以参数向量”的形式即 Y(q,q̇,q̈)·p τ。这样后面做自适应控制时只需要在线更新 p 的估计值 p̂控制律结构完全不用变。建模的时候多花十分钟做参数线性化后面改负载、加摩擦补偿都会省很多事。1.2 SEA执行器建模把电机侧和负载侧分开看SEA 的结构是“电机-减速器-弹簧-负载”。负载侧角度记为 q电机输出轴角度记为 θ弹簧产生的弹性力矩可以写成τ_s K_s(θ - q)其中 K_s 是弹簧刚度。对电机侧动力学可以写成J_m θ̈ τ_m - τ_s对负载侧机械臂动力学右端除了弹性力矩还要把环境接触力矩 F_ext 也算进去。也就是说SEA 的弹性力矩 τ_s 实际上是机械臂的“直接驱动力”而电机力矩 τ_m 是通过控制器间接实现的。这里有一个建模时的关键认知如果直接把 τ_s 当作状态而不是控制输入控制器设计会复杂很多因为 τ_s 有自己的动态。我的做法是给 SEA 加一个内环力矩控制——先给定一个期望弹性力矩 τ_d通过电机力矩控制让 τ_s 快速跟踪 τ_d。内环带宽做到 10 Hz 以上后外环就可以把“SEA机械臂”整体看成一个力矩可控的刚性驱动系统阻抗控制器的设计难度会显著下降。SEA 参数我取弹簧刚度 K_s300 Nm/rad电机转动惯量 J_m0.02 kg·m²。这个刚度比刚性关节低不少好处是接触时末端等效刚度下降冲击能量能被弹簧吸收坏处是系统会出现一个低频的弹簧-负载谐振峰。调试时如果内环控制器增益太高很容易把这个谐振峰激励起来整个臂会高频抖动。所以 SEA 建模建模时别只看动力学方程还要留意开环频率响应里的谐振峰位置。驱动方案力矩控制精度碰撞安全性控制带宽建模复杂度刚性驱动低受减速器摩擦影响大低硬碰硬高低SEA驱动高弹簧直接测力高弹簧缓冲低受谐振限制中高2. 控制架构动态面、自适应和变阻抗三块怎么分工2.1 为什么选动态面控制而不是反步法反步法Backstepping是经典的非线性控制设计方法但它在高阶系统里有个很难受的问题每一步都要对虚拟控制律反复求导系统每增加一阶表达式就膨胀一次这就是业内常说的“微分爆炸”。在 SEA 加两连杆机械臂这种四阶以上的系统里解析导数会膨胀到完全不可用看着那一堆公式连参数都不想改了。动态面控制的思路是让虚拟控制律先通过一个一阶低通滤波器再把滤波后的信号传给下一步设计。这样控制器里的每一项只需要对原信号求值不需要求它的解析导数。虽然滤波器会带来一点相位滞后但只要时间常数选得合适一般 0.005~0.02 s对性能的影响很小换来的实现便利性是决定性的。从我实际体验来说用动态面控制之后控制器代码量大概只有传统反步法的三分之一而且改一个增益不用重新推导一整套导数。特别是在做自适应控制时回归矩阵 Y 里本来就带有一堆信号如果虚拟控制律的导数也要解析展开那代码基本没法维护。2.2 一阶变阻抗设计既要刚又要柔还不能突变阻抗控制是一种让人与机械臂接触更安全、同时又保留位置控制精度的方案。它让机械臂末端对外表现出类似“质量-阻尼-弹簧”的动态关系最常用的模型是M_d ë B_d ė K_d e F_ext其中 e q - q_dM_d、B_d、K_d 分别是期望惯性、阻尼和刚度F_ext 是环境接触力。如果这三个参数是常数系统设计起来简单但问题也很明显刚度和阻尼调大了跟踪精度高、接触力也大调小了接触安全、但跟踪误差明显。做人机交互或者精密装配时这两种状态其实都是需要的于是就有了变阻抗的方向。我这里的“一阶变阻抗”不是直接去改控制目标中的刚度/阻尼值而是让期望刚度或阻尼参数自己按一阶动态平滑调整。例如期望刚度从 K0 向目标刚度 K_target 调整时用这个方式过渡T_k · dK_d/dt K_d K_target(e, t)T_k 是一阶动态的时间常数。这么做最直接的好处是控制量不会因为阻抗参数突变而产生尖峰机械臂在进入接触后又能快速调整柔顺程度。在我这套系统里的具体策略是自由空间跟踪时用高刚度K_d300 Nm/rad保证轨迹精度一旦检测到接触力矩超过阈值就把目标刚度降到 80 Nm/rad同时阻尼从 8 Nm·s/rad 升到 18 Nm·s/rad整个过渡过程用 T0.3~0.5 s 的一阶动态完成。从操作端的感受来说机械臂碰到障碍物后会轻轻“让一下”而不是硬碰硬地顶住。2.3 自适应控制处理哪些不确定参数SEA 机械臂的不确定性主要来自三个方面负载质量和重心位置变化、关节摩擦库仑加黏性、SEA 弹簧刚度随温度和时间的缓慢漂移。如果把所有这些参数都当常数机械臂换装不同工具后控制器性能会肉眼可见地下降。自适应控制的任务就是把这些不确定量放进参数向量 p 里用动力学方程中的回归矩阵 Y 在线更新估计值 p̂。我采用的是带 σ-修正的梯度自适应律p̂̇ -Γ · Yᵀ · η其中 Γ 是自适应增益矩阵η 是误差变量σ-修正项用于防止参数漂移。测试下来单靠自适应并不能把所有跟踪误差都消除但稳态误差大约降低了 60%而且当末端负载突变时系统响应会明显更快不会再像固定参数控制器那样出现一两个周期的“愣神”。有些人会把自适应控制和鲁棒控制放到一起比较。我的理解是如果干扰是慢变的、不确定参数是常值的自适应更合适它能主动把参数“学”出来如果干扰是高频突变的自适应来不及响应这时需要加鲁棒项补充。所以在我的控制律里除了自适应项还保留了一个高增益误差反馈项作为兜底两者配合起来效果更稳。3. 从公式到代码控制器推导与离散化实现3.1 外层控制律结构整套控制器是分层结构外层是“动态面自适应阻抗控制”生成期望弹性力矩 τ_d内层是 SEA 电机力矩环让实际弹性力矩 τ_s 跟踪 τ_d。外层控制律的关键变量定义如下跟踪误差 e q - q_d误差速度定义的参考速度 q̇_r q̇_d - Λ·eΛ 为正定增益矩阵误差变量 η q̇ - q̇_r具体控制律可以写成τ_d Y(q, q̇, α_f, α̇_f)·p̂ M(q)·(α̇_f - Λ·η) C(q,q̇)·(α_f - Λ·e) G(q) K_p·η其中 α_f 是虚拟控制 α 经过一阶滤波器之后的输出K_p 是误差反馈增益。虚拟控制 α 的设计要结合阻抗目标我的实现方式是基于系统标称参数计算“保证跟踪加柔顺”的参考加速度项再经过低通滤波器平滑。自适应律采用前面说的 σ-修正梯度形式离散化实现时注意σ 的取值不宜过大否则参数估计会被“压得过扁”自适应能力变差也不宜过小否则容易出现参数漂移。我一般在仿真里取 σ0.01实际实现时再微调。3.2 关键增益与时间常数怎么定参数整定顺序特别重要。我建议这样走先整定 SEA 内环力矩环。用 PI 控制器加前馈补偿把弹性力矩闭环带宽做到 10 Hz 以上。实际调试时我给 P0.8I5.0前馈系数按 J_m 的估计值来。再整定外层动态面控制器的 Λ 和 K_p。这两个参数决定跟踪误差收敛速度K_p 通常取 5~20Λ 取 2~10从低到高慢慢加。最后再加自适应增益 Γ。Γ 从较小的对角阵开始比如 diag(0.1, 0.1, 0.1)观察参数估计是否稳定再逐步加大。参数初始推荐值作用调高影响调低影响内环 P0.8力矩环比例增益响应快但容易激励谐振响应慢力矩跟踪滞后内环 I5.0消除稳态力矩误差积分过强超调稳态误差增大滤波时间常数 τ_f0.01 s平滑虚拟控制律相位滞后明显高频噪声直接进入控制自适应增益 Γ0.1~1.0参数更新速率参数抖动、漂移参数学习速度慢σ修正0.01防止参数漂移自适应能力弱漂移风险高3.3 离散化实现与代码结构这里给一个简化的 Python 示例演示控制主循环的框架。实际硬件上我会用 C 写但逻辑完全等价# 控制主循环简化示例 while control_running: # 读取负载侧关节角度与角速度 q, q_dot get_joint_state() # 读取SEA弹性力矩 tau_s get_spring_torque() # 估计接触力矩 F_ext estimate_contact(q, tau_s) # 更新期望阻抗参数一阶动态平滑 if contact_detected: K_target 80.0 B_target 18.0 else: K_target 300.0 B_target 8.0 K_d dt / T_k * (K_target - K_d) B_d dt / T_b * (B_target - B_d) # 动态面误差变量 e q - q_d q_r_dot q_d_dot - Lambda e eta q_dot - q_r_dot # 虚拟控制与一阶滤波器 alpha q_r_dot - K_z eta - M_d_inv (B_d e F_ext) alpha_f dt / tau_f * (alpha - alpha_f) # 回归矩阵与自适应更新 Y compute_regressor(q, q_dot, alpha_f) p_hat - dt * Gamma * Y.T eta p_hat sigma_modify(p_hat) # 外层控制力矩 tau_d feedforward(q, q_dot, alpha_f, p_hat) Kp eta # SEA内环力矩控制 set_motor_torque(inner_loop_torque(tau_d, tau_s))实现时要注意一阶滤波器的时间常数 τ_f 必须比外环控制周期大一个数量级以上。比如控制周期是 1 msτ_f 至少取 5~10 ms否则滤波器在离散域中根本“拉不平”信号会导致虚拟控制量出现阶梯式跳变。另外自适应参数的离散化用后向欧拉更新率不要超过控制频率的一半避免数值不稳定。提示如果你在仿真里发现自适应参数发散先不要急着降 Γ。检查一下回归矩阵 Y 的各列量纲差异是不是太大必要时对参数做归一化处理。量纲差异高的场景下自适应增益矩阵最好用对角阵每一项单独缩放。4. 仿真与实验对比参数表、曲线结果和我踩过的谐振坑4.1 仿真参数设置我在 Python 里搭了一套完整的仿真环境用四阶 Runge-Kutta 做动力学积分控制频率 1 kHz。机械臂参数和控制器参数如下参数数值L1 / L20.45 m / 0.35 mm1 / m22.0 kg / 1.2 kgK_sSEA刚度300 Nm/radJ_m电机惯量0.02 kg·m²M_d期望惯量1.0 kg·m²B_d自由空间阻尼8 Nm·s/radK_d自由空间刚度300 Nm/rad接触后目标阻尼18 Nm·s/rad接触后目标刚度80 Nm/rad一阶变阻抗时间常数0.4 s动态面滤波时间常数 τ_f0.01 s自适应增益 Γdiag(0.5, 0.5, 0.5)σ修正系数0.01仿真中给的轨迹是两个关节都做正弦运动幅值 0.3 rad频率 0.5 Hz。在第 4 秒左右让末端碰到一个刚度较高的环境表面持续接触 2 秒再离开。4.2 结果分析刚性接触与柔顺接触两套表现先把变阻抗功能关掉用固定阻抗参数跑一遍接触力峰值达到 47 N而且接触瞬间力矩信号有明显的振荡。这里有个重要观察固定高刚度参数下机械臂为了保持轨迹精度会把接触力“硬扛”下来这在我们做装配、打磨类任务时非常不利。打开一阶变阻抗后同样的接触场景接触力峰值降到 19 N下降约 60%。更重要的是接触力曲线没有出现尖刺而是平滑上升后稳定在一个较低水平。这是因为接触检测触发后K_d 和 B_d 沿一阶动态过渡控制力矩没有突变SEA 弹簧吸收了大部分冲击。跟踪误差方面自由空间段的最大跟踪误差从固定高刚度时的 0.006 rad 变大到了 0.009 rad这可以接受毕竟系统在接触前后发生了阻抗切换。接触稳定后由于刚度降低跟踪误差会适当增大但接触力更平缓对硬件也更友好。整体来看这套方案在“跟踪精度”和“接触柔顺”之间做到了比较理想的折中。4.3 实测中SEA柔性模态带来的振荡问题仿真跑通后我一度以为很简单但一上实际平台就碰到问题SEA 内环力矩环我按照仿真参数调结果 2 kHz 下电机开始啸叫机械臂高频抖动。后来用示波器看力矩环误差发现是内环 P 增益太高把弹簧-负载的谐振模态大约 11 Hz 附近激励出来了。解决办法是给力矩环反馈信号加一个带阻滤波器中心频率放在谐振峰附近同时把内环 P 从 0.8 降到 0.5I 从 5.0 降到 3.0。带阻滤波器的 Q 值不能太大否则会在谐振频率附近引入相位滞后反而降低带宽。实测 Q1.2 时内环相位裕度保留得比较好振荡问题也基本消失。这里分享一个经验SEA 系统的谐振峰位置可以粗略估算为 f_res sqrt(K_s / (J_m J_load)) / (2π)在我这个配置下大约就是 10 Hz 量级。所以设计内环带宽时上限建议控制在 12~15 Hz别贪高。超过这个值你会在调试中花大量时间对付谐振得不偿失。5. 常见问题排查与调参经验5.1 一阶变阻抗时间常数选多大选小了会怎样T_k 太小比如 0.05 s阻抗参数几乎瞬间切换控制力矩会发生明显跳变虽然比直接切换好一点但在高增益环境下仍可能激发机械臂抖动。T_k 太大比如 2 s接触后刚度下降太慢机械臂已经和环境“硬碰”了柔顺性大打折扣。我常用的策略是 T_k 取 0.3~0.5 s相当于在 300~500 ms 内完成阻抗切换。这个时间尺度比人手的自然反应稍快一点但对机器人控制系统来说足够平滑。如果你的任务需要更快的接触响应可以考虑把 T_k 缩短到 0.15~0.2 s前提是控制周期足够短至少 1 kHz并且内环力矩环足够稳。注意T_b阻尼切换时间常数最好和 T_k 分开调不要共用同一个值。常见的做法是 T_b 比 T_k 略大 0.1 s这样刚度先下降、阻尼后增大接触力过渡更自然。5.2 自适应增益和动态面滤波器时间常数的“三角关系”动态面滤波时间常数 τ_f 和自适应增益 Γ 之间存在耦合关系τ_f 越小进入自适应回归矩阵的高频信号越多参数估计越容易抖动τ_f 越大信号越平滑但自适应对真实参数变化的响应也越慢。所以调节时不能单独死磕一个参数。我的调试顺序是先把 Γ 设到很小的值0.1调 τ_f 到跟踪误差不再有明显高频抖动大概 0.01~0.02 s然后把 Γ 慢慢加大每加一次观察参数估计曲线是否平滑如果出现高频振荡把 Γ 回调 30%。最后再做一次微调让稳态误差和参数收敛速度平衡。还有一个容易忽略的点自适应律中的回归矩阵 Y 如果包含了加速度 q̈而 q̈ 是从角度差分得到的噪声会非常大。实际实现时我建议用滤波后的参考速度去构造 Y或者对 q̈ 做低通滤波。否则自适应增益稍大参数估计就会“抽风”。5.3 参数突然跳变导致的控制信号跳变怎么解决变阻抗本身用一阶动态平滑后控制信号跳变已经缓解很多。但如果你在自由空间和接触状态之间频繁切换切换逻辑本身就可能造成目标参数突变。我在仿真中发现接触状态检测阈值设得太低时机械臂会因为微小力波动在“接触/非接触”之间来回切换阻抗参数震荡控制力矩也跟着抖。解决办法是给接触检测加一个滞回区间比如接触力超过 5 N 判定进入接触低于 2 N 才判定离开。这 3 N 的滞回区间能有效避免频繁切换。同时把目标 K_d 和 B_d 的切换也做成带状态记忆的逻辑避免重复计算一阶动态初始值。5.4 我的调参顺序和一点体会整套系统调试下来我最想强调的就是顺序问题。先固定变阻抗参数设成常数把底层 SEA 内环调稳再把动态面控制器调到跟踪误差可接受最后才打开自适应和变阻抗。如果一上来就全开出了问题根本分不清是哪个模块引起的。一个实用的技巧把自适应估计出的参数记录下来。如果参数收敛后和真实值偏差很大别急着怀疑自适应算法先检查回归矩阵的秩和激励条件。轨迹激励不足时参数是不可辨识的再高级的自适应控制也没办法。这时候需要给参考轨迹加一点幅值更丰富的成分或者手动给机械臂一个扰动让参数“学”出来。根据我个人经验这套“动态面SEA两连杆自适应一阶变阻抗”的组合最大的优势不是某一个模块本身多厉害而是它把各模块的互补性吃得很透SEA 提供硬件层面的安全缓冲一阶变阻抗提供任务层面的柔顺切换自适应消掉参数不确定性动态面控制让整个非线性控制器变得可工程实现。四者组合在一起机械臂在面对接触任务时的表现比任何单一控制方案都要从容。最后分享一个小技巧如果你在做 SEA 机械臂的阻抗控制请一定在仿真里加上力矩环的饱和限制和弹簧形变量限制。我实际测试时发现很多“控制器发散”其实只是弹簧形变量超过安全限位导致系统进入非线性区域。加一个限幅逻辑稳定性会好很多。这套方案后续可以继续扩展的方向包括把一阶变阻抗扩展到环境刚度估计、加入迭代学习前馈、或者把动态面控制扩展到冗余自由度机械臂上。但无论怎么扩展底层这些原理和调试顺序都是通用的。本文还有配套的精品资源点击获取
返回列表