资讯动态

人机协作机械臂碰撞安全:被动扭矩控制与生存性设计

发布时间:2026/10/19 6:18:05 来源:尧图企业网站定制
1. 人机协作安全的本末倒置为什么碰撞后的行为比碰撞前更值得关注做机器人安全的人最常见的思路是“别让它撞上”。于是围栏、安全光幕、激光扫描、视觉减速、路径规划里的避障所有的铺垫都在围绕“避免接触”这个前提。我在协作机械臂安全控制上折腾了几年之后越是往后越发现问题真正的难点其实不在“撞不上”而在“一旦真的撞上了下一步系统会怎么样”。人机协作之所以叫协作是因为人和机器要共享同一片操作空间接触几乎不可避免。哪怕你把安全距离算得再细、末端速度压得再低总会出现误入轨迹、空间重叠、工件意外脱落这些情况。这个项目里我们把注意力从“如何不撞”转到了“撞上之后的生存能力”。这个概念借用了系统生存性理论里的核心思想一个系统能在异常扰动、局部失效、外部冲击叠加的情况下仍然维持基本服务能力并且在威胁解除后主动恢复到正常状态。把它放到机械臂控制上就变成了三件事承受扰动时不要失控威胁过后能够恢复最坏情况下能优雅降级而不是直接出事故。这三件事落在传感和控制层面可以说没有一件是传统位置控制天然具备的。位置控制的目标是“跟轨迹”它在碰到障碍物时会形成越来越大的跟踪误差和接触力本质上就是把碰撞能量往机械臂内部堆积。而这里要做的是把机械臂在接触过程中的表现从“硬顶”改成“卸力”通过被动扭矩控制让整个系统在物理层面具备能量耗散能力。项目使用的本体是 FrankaResearch3一台七关节轻量协作机械臂。选择它的原因很直接关节带高精度扭矩传感器底层控制接口开放能够以 1kHz 周期直接下发关节力矩指令。这意味着我们可以绕开内部默认的刚性位置伺服在更低层面重写机器人对外力的响应方式。简单说我们控制的不是“这个点必须到”而是“这个系统的能量该往哪儿走”。在这个项目里生存性不是一句理念口号而是一套可量化的行为准则。机械臂遇到外力推动应该是顺着力走一段、把能量耗散掉然后试探性地试图回到目标位置遇到持续挤压应该先退让到安全状态而不是拼命顶回去外力消失后应该平稳恢复而不是带病追轨迹。这套准则看起来容易实际落地时每一个点都有坑。2. 生存性理论的工程化落地被动扭矩控制要解决哪三类核心问题2.1 第一类问题碰撞能量到底去哪儿了机械臂与人发生碰撞时系统和环境之间会发生能量交换。机械臂本身是一个由电机、减速器、连杆构成的机电系统如果控制律是典型的高增益位置伺服那么碰撞瞬间电机会努力维持位置结果就是碰撞动能和电机储能全部转化为接触力。整条传递路径大致是这样末端撞到障碍物运动被瞬间阻止位置误差立刻增大位置环把它当作跟踪误差去消除于是电机输出更大的力矩去“纠正”偏差接触力在几十毫秒内猛增。在这个过程里机械臂相当于一台主动蓄能的机器。它越是想保持位置人和设备受到的冲击就越剧烈。被动扭矩控制要做的第一件事是改变这条路径的能量方向。控制策略不再以“位置误差最小”为目标而是以“接触力可控且系统能量有界”为目标。关口在于引入柔顺性和阻尼让机械臂在接触瞬间发生位移用形变空间吸收一部分冲击动能再通过关节阻尼和摩擦把另一部分耗散掉。只有外部冲击能量有了去处碰撞力峰值才有降下来的可能。2.2 第二类问题接触力的传递路径怎么设计机械臂的安全性归根结底取决于末端对环境的力传递方式而这个传递方式由机械臂的等效质量和等效刚度决定。碰撞瞬间表现出的“硬”或“软”主要是这两个量在起作用。这就引出了被动扭矩控制的物理基础用控制律把机械臂整机的对外动态行为塑造成一个具有可设计质量、阻尼、刚度的二阶机械系统。用公式写就是[ M_d \ddot{e} D_d \dot{e} K_d e F_{ext} ]其中 (e) 是末端位姿误差(M_d)、(D_d)、(K_d) 分别是我们希望机械臂对外呈现的惯性矩阵、阻尼矩阵和刚度矩阵(F_{ext}) 是环境施加到末端的外力。这个式子描述了一个标准的弹簧-阻尼-质量系统。当外部推力作用时它不会硬顶而是按照设定的刚度和阻尼被推开外力消失后它又会在阻尼作用下平稳回到平衡位置。这样的整机行为可以推导出严格的无源性。所谓无源性通俗讲就是系统对外输出的能量永远不会超过外部给它的能量。数学上可以写成[ \int_{0}^{T} \tau_{ext}^\top \dot{q} dt \geq -V(0) ]其中 (\tau_{ext}) 是外部关节力矩(\dot{q}) 是关节速度(V(0)) 是系统初始储能。这个不等式的意思是机械臂在任何时间段内都不会向环境净吐出超过自身初始储存的能量也就是说它在物理上不可能形成那种越撞越猛的正反馈发散。2.3 第三类问题碰撞后的瞬态稳定性从哪来很多团队做过柔顺控制但一遇到真实碰撞就出问题问题不在于接触那一瞬间的力而在于接触离开之后的瞬态。碰撞发生后机械臂往往处于一个偏离正常姿态的位形此时如果控制律只是简单地把目标位置设回原处机械臂会像弹簧一样把储存的形变能量释放出去结果就是来回震荡甚至甩动。被动扭矩控制的第三个关键点就是保证瞬态稳定。采用阻抗控制时只要 (M_d) 对称正定、(D_d) 半正定、(K_d) 正定且参数匹配得当系统在自由空间和接触空间都保持无源稳定。这也是为什么我们把阻抗参数当作安全策略的一部分来标定而不是随便给一组数。阻尼不够时机械臂碰撞后会像音叉一样震荡阻尼过大机械臂又会在外力消失后恢复得太慢影响工作效率。参数标定的过程本质上是找安全性和可用性之间的平衡。3. 在真实机械臂上把生存性约束写进控制律接口、场景与标定参数3.1 从位置伺服到扭矩闭环控制架构改造FrankaResearch3 出厂默认的运动接口是位置模式上层下发路径点内部伺服完成运动。要执行被动扭矩控制必须绕过默认路径规划器直接使用底层的力矩接口。这套接口在实时操作系统上运行开发机通过千兆网和机器人控制器通信控制周期为 1kHz。我建议团队在动手前先解决两个环境基础。一是控制机必须安装实时内核普通 Linux 内核线程调度抖动会达到毫秒级对 1kHz 控制环来说是致命的。二是要熟悉机械臂的动力学辨识接口末端负载的质量、重心位置必须先估计准确后续所有重力补偿和力矩观测都依赖这一组参数。控制架构上我们分了三个层面。最底层是关节阻抗控制它把每个关节从刚性位置伺服改成质量-阻尼-弹簧模型。中间层是笛卡尔阻抗把末端的六维力-位姿关系整理成 (F_d K_d (p_d - p) D_d (\dot{p}_d - \dot{p})) 的形式。最上层是生存性状态机它根据外部力矩和接触能量的大小切换机器人的行为状态正常跟踪、柔性退避、能量耗散、试探恢复。3.2 接触能量监测与生存性模式切换单纯靠阻抗参数并不能解决所有问题。当机械臂以较高速度撞向障碍物时即使刚度设得低初始动能依然很大末端仍然可能给人造成明显冲击。所以我们引入了一个基于能量监测的生存性判定层。实时控制循环里持续计算外部关节力矩 (\tau_{ext})方法是关节总力矩减去动力学模型力矩减去重力项减去摩擦力项[ \tau_{ext} \tau_{meas} - \tau_{model} - \tau_{gravity} - \tau_{friction} ]然后计算一个滑窗内的接触能量[ E \int_{t-T}^{t} \tau_{ext}^\top \dot{q} , dt ]当某个关节的外力矩超过阈值或者接触能量超过预定安全包线时控制状态机从正常跟踪切换到生存性退避模式。退避策略不是简简单单地把目标位置挪走而是沿接触反方向把参考点回退一定距离同时把刚度降到更软、阻尼提到更大。回退距离由接触能量积分决定能量越大回退越多。这一步很关键。它保证机械臂遭遇高强度冲击时的行为不是被弹飞而是有控制地让位让撞击过程变成一种受约束的能量耗散过程。退避到安全位形后系统不会自动回到原目标而是等待外部力矩消失且末端速度衰减到阈值以下才以较低速度试探性恢复。这种“碰一下就退退完试着重来”的行为就是生存性里要求的恢复能力。3.3 参数标定中容易忽视的细节阻抗参数的标定看起来简单实际操作中有几个细节直接决定系统能不能稳定工作。第一末端等效惯量不是固定的。机器人构型不同末端在笛卡尔空间的表现惯量差别很大。我建议把工作空间划成若干区域在每个区域中心采样惯量矩阵然后按区域切换 (M_d) 参数。第二摩擦力模型不准确会直接影响外力观测。摩擦力项里有库仑摩擦和粘性摩擦它们会跟随温度、磨损程度变化。我们做了一组离线辨识让每个关节以不同速度匀速运动记录力矩曲线拟合出一个基础摩擦表。即便如此运行半小时后关节温度升高摩擦力开始漂移这时候外力观测就容易出现虚假值。项目里给状态机的触发阈值留了一定的死区算是对摩擦漂移的保守处理。第三刚度越低不一定越安全。刚度很低时机械臂受一点外力就会出现很大偏移在狭窄空间里反而容易造成二次碰撞。实际标定时我们按方向分情况末端平移方向刚度设在 300N/m 左右旋转方向设在 30Nm/rad 左右阻尼比取 0.7 到 0.9。这样既有柔顺性又不会让机械臂在自由空间里显得飘忽不定。4. 实测对比带来的数据结论被动方案把碰撞风险降低了多少4.1 测试场景与测量方法实验室里搭建了三类典型测试场景分别对应人机协作中最常见的意外情况。第一类是静止侵入场景机械臂以 0.3m/s 的末端速度接近某个目标点途中插入一个刚性障碍物模拟操作者误把手伸进轨迹。第二类是运动碰触场景机械臂本身在运动障碍物以相对速度横向切入模拟双方都在动的情况。第三类是持续挤压场景障碍物保持在位机械臂需要在接触状态下维持一段时间考察它会不会越顶越紧。测量设备使用的是校准过的接触力测量板放在机械臂末端可能撞击的位置数据通过独立采集系统记录不经过机器人控制器避免控制环数据自我粉饰。每个场景跑十次取峰值接触力和接触全过程的力冲量作为对比指标。我们对比了三种控制方式默认位置控制、常规笛卡尔阻抗控制和加入生存性状态机的被动扭矩控制。4.2 数据结果与解读第三类持续挤压场景下的数据最能说明问题。默认位置控制工况下机械臂碰到障碍物后位置环持续累积误差接触力最终升到 300 多牛顿测量板报警。常规笛卡尔阻抗控制下由于刚度设置得比默认软峰值力下降到 90 牛左右但因为缺少能量监测持续挤压下系统会一直以一个较大稳态力顶住障碍物而且碰撞后的恢复阶段出现了一次明显的末端抖动。加装了生存性状态机的被动扭矩控制把峰值接触力进一步压到了 50 牛上下比默认位置控制下降了超过 80%。更关键的是行为模式的区别碰撞发生后大约 0.2 秒内机械臂开始主动回退稳态接触力降到接近零等到外力消失后以 0.05m/s 的缓慢速度重新靠近目标点。整个过程里没有出现关节震荡没有触发机械臂的碰撞停机实验后机器人各关节状态完全正常。静止侵入场景下数据差异没有持续挤压场景那么悬殊因为低速度碰撞本身动能就小但生存性方案在恢复速度上明显占优。普通阻抗控制碰到障碍物后会停下来等待人挪开后还需要手动清除错误或重新规划路径。生存性方案则是在外力消失后自动试探恢复整体流程减少了人为介入的次数。4.3 一次差点翻车的实验带来的教训实验过程里最难忘的一次是把阻尼参数调得太小。当时想着碰撞力越低越安全干脆把笛卡尔刚度调到 150N/m阻尼比只留下 0.3。第一次碰撞测试看起来很棒峰值力只有 40 牛但碰撞结束后机械臂居然在障碍物附近来回弹了两三下末端速度反而比碰撞前更大了。如果旁边站着一个操作者这种弹抖比一次干净利落的碰撞更危险。那次之后我们加了一条硬性规则任何参数改完先跑自由空间阶跃响应看末端到达目标后是否有超调和振荡再跑低速碰撞测试。参数验证不通过连进入工作时间区的机会都没有。这也让我意识到被动扭矩控制的安全边界不是一个点而是一条包线。刚度、阻尼、回退距离、恢复速度这些参数是互相耦合的单独调某一个指标好看没有意义要保证整条包线内的行为都可预测。5. 回到生产环境本事再好边界条件要拎清5.1 被动控制不能替代任务级安全这套生存性被动扭矩控制方案有效但我不主张把它当成万能安全方案。它本质上管的是一段很短的时间窗口也就是从接触到能量释放完的状态。它可以大幅度降低碰撞力峰值却不会告诉你碰撞发生之后任务该怎么调整更不会判断操作者是不是故意要把机械臂推到某个位置。生产环境里更稳妥的做法是分层。最外层仍然保留安全激光和区域监控判定人员是否进入禁区中间层由任务规划器决定减速还是停机最内层才由这套被动扭矩控制来兜底。生存性状态机的“恢复”也不应该完全自动执行特别是装配场景里一个自动恢复的机械臂可能在人还在附近时再次启动。我建议保留一个人工确认机制外力消失后机械臂可以回到待命位形但重新进入工作轨迹前需要操作者按下确认按钮或者给出明确的使能信号。5.2 动力学模型不准时生存性控制会大打折扣被动扭矩控制的效果建立在较为准确的动力学模型之上。重力补偿不准机械臂会自己往下沉摩擦模型漂移外力观测里会出现虚假接触力状态机可能误触发退避或者漏判真实碰撞。实验阶段可以用离线辨识加固定负载来保证模型精度但生产线上末端工具和工件经常换来换去。针对这个问题我建议在切换末端负载后执行一次快速惯量辨识把新的质量和重心写进去。如果工况实在繁杂就引入一个位置环做外层校正在线估计模型误差。要注意的是外层校正的增益不能太高否则又会破坏被动性边界等于绕了一圈又回到刚性控制。5.3 适用范围与人数场景的取舍依我的经验这套方案最适合的是中低速、低负载、任务精度要求中等的人机协作场景比如焊接工位辅助、装配引导、医疗康复训练这些主业是“人和机器一起操作”的场景。它不适合高节拍生产的机器人因为高节拍意味着高速碰撞动能按速度平方增长被动扭矩控制能耗散的能量是有限的速度太高了再柔顺的阻抗也避免不了冲击伤害。还有一个经常被忽视的问题当多个人同时进入工作空间时机械臂面对的不再是一个接触点而是多个方向的复杂外力。某个传感器和状态机基于单点接触假设遇到双侧挤压这类情况判断并不准确。应对办法是增大安全冗余降低转为退避模式的触发阈值宁可误退避也不硬撑。毕竟安全方案的失败模式也分等级误停造成的损失远小于误撞造成的人身风险。关于这套方案后续还能怎么用我在实际验证中发现它可以当做一个底层的“安全力觉层”在这个基础上再挂视觉引导、任务重规划甚至人机协同搬运策略。生存性理念给控制层带来的真正改变是机器人不再把意外接触当成一个追踪误差去硬消除而是把每一次意外接触当成一次需要管理的能量扰动。这个思路的适用范围远比一台 FrankaResearch3 要广未来如果把它迁移到其他具备力矩传感的轻量协作机械臂上核心的状态机和能量监测逻辑基本可以复用。只不过换平台时别忘了机械臂自身的动力学参数、摩擦特性和默认控制频率都会变需要在新的平台上重新把整条参数包线验证一遍。

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

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

免费获取报价 →
↑