工业现场里最让人头疼的问题之一,就是机器人一碰到力就"僵住"。不管是装配插孔、打磨去毛刺、还是做FnC检测,一旦零件公差稍紧或安装位置有偏差,刚性状态下机器人就会硬碰硬,轻则报警停机,重则撞坏工件甚至伤到人。我最早接触柔顺控制就是为了解决这类现场问题,说实话,这套东西的原理并不玄,真正难的是理解它到底在解决什么问题,以及怎么把参数调到能用。这篇文章就围绕"机器人柔顺控制原理"这个主题,聊聊我从被动柔顺到主动柔顺、从阻抗到导纳再到力位混合控制的完整理解,也把我调参踩坑的经验一并整理出来,给做机器人应用和开发的同行做个参考。
1. 为什么机器人一定要讲柔顺
1.1 刚性控制的尴尬场景
大部分工业机器人在出厂时默认跑的是位置控制,也就是每个关节都按指令角度走,走不到就加大力矩,直到到达目标位置。这种控制策略的优点是重复定位精度高,能达到正负0.02毫米甚至更高,特别适合焊接、搬运、涂胶这类不需要和周围环境产生力的任务。
但遇到接触类任务就完全不同了。拿最常见的轴孔装配来说,如果你的机器人要把一根直径20毫米的销子插进直径20.05毫米的孔里,理论上位置精度够就能插进去。可实际上,零件在料盘里的位置是有误差的,视觉定位再有零点几毫米的偏差,销子和孔口就会产生接触。这时候位置控制的本能反应是"继续往前走,直到走到目标点",结果就是销子被大力压在孔口边缘,姿态稍微偏一点就卡死,继续顶就产生几百牛的力,最终触发碰撞报警。
打磨抛光也是同样的道理。工件表面并不是绝对平整的,焊点高度、毛刺大小都不可控,如果机器人严格按预设路径走,遇到高点会过切,遇到低点会漏磨,刀具与工件之间的接触力忽大忽小,质量完全没法保证。
所以我一直觉得,柔顺控制的本质不是让机器人变弱,而是让它在保持运动能力的同时,对环境力"有感知、会屈服"。换句话说,机器人在某些方向上不再死盯位置,而是按照力的大小来动态调整自己的运动,这就是柔顺控制的核心逻辑。
1.2 柔顺的两种实现路线
柔顺控制从实现方式上分成两大类:被动柔顺和主动柔顺。
被动柔顺的意思是,靠机械结构本身的柔性去吸收力和位置偏差。常见的手段有弹簧、阻尼器、柔性手腕(比如RCC远中心柔顺装置),这些东西不需要传感器,也不需要算法,天然就能在受力时发生形变,从而降低接触力。
主动柔顺的意思是,通过力传感器检测接触力,再由控制算法实时调整机器人的目标位置或目标力矩,达到柔顺效果。它不依赖物理变形,而是靠"软件层面的让位"来解决问题。
这两种路线各有利弊,不能简单说谁更先进。被动柔顺响应快、成本低、没有延迟,适合大批量、变化少的场景,但它的柔性参数固定死了,换一种工件就很难适配;主动柔顺灵活可调,能适应复杂工况,但它依赖传感器精度和控制频率,而且调参不好会引发振荡甚至失稳。
现代工业里真正被广泛采用的,几乎都是主动柔顺。从协作机器人的拖动示教,到精密装配的恒力控制,再到医疗机器人的力反馈操作,底层核心都是主动柔顺那套理论。接下来我重点拆解这部分原理。
2. 被动柔顺:机械结构的"容忍度"
2.1 柔性手腕与弹簧阻尼器的思路
被动柔顺的代表是RCC装置,这个在汽车、电子行业的装配线上很常见。它的核心思想很巧妙:在机器人的法兰和夹爪之间加一组弹簧片和弹性体,让末端在受力时能绕某个特定中心点产生微小转动和位移。以前用的腕部结构和平面副组合,可以让零件在插入过程中"找正"自己,顺着孔口倒角滑进去。
这就像你用手去插电源插头,如果孔位稍微偏一点,你不会硬怼,手腕会自然地顺势微调,让它滑入。RCC就是把这个"手腕的自然顺应"做成机械结构。它的优势是纯物理响应,没有采样周期、没有算法延迟,插入速度可以极快,可靠性很高。
RCC的关键参数是柔顺中心的位置,也就是末端在受力时绕哪个点产生转动变形。这个中心位置选得好,轴插入时就不会在孔内别住;选得不好,反而会导致零件倾斜卡死。设计时一般要把柔顺中心和轴孔接触区域的重合度做进去,这是一个机械加工精度层面的工程问题。
弹簧阻尼器组合也是被动柔顺的常见形式,比如某些打磨主轴会串联弹性浮动的浮动打磨头,让砂轮在接触面上有一个微小的浮动空间。工件表面有凸起时,刀头被推回去而不是硬切,能明显减少磨穿和刀具崩刃的风险。这类方案在需要快速响应的场合仍然在被广泛使用。
2.2 被动柔顺的局限在哪里
被动柔顺最大的问题是"不可调节性"。弹簧常数和阻尼系数出厂后就固定了,你没法根据不同的工件硬度、接触速度、精度要求临时改变柔顺特性。换一款产品就要重新设计或者更换机械部件,维护成本高。
第二个问题是精度损失。被动柔顺引入了机械间隙和弹性形变,机器人的绝对定位精度下降,理论上能做到的"准"被牺牲掉了。在一些既要接触力可控、又要求定位精度高的场合,纯机械方案就力不从心了。
第三个问题是它不具备感知能力。被动柔顺只知道"受力就变形",但它不知道力是哪个方向、不知道大小是多少、更无法判断这个力是正常的接触力还是异常碰撞。很多齿轮、阀门装配场景中,卡死和正常插入的受力特征差异很小,被动结构没法做出区分,所以只能靠外部限位机构辅助,灵活性大打折扣。
所以被动柔顺作为一类廉价、可靠、快速的手段,在批量生产的重复作业中依然有位置。但一旦需要机器人适应多种工件、多方向接触力、复杂轨迹,主动柔顺才是治本方案。这也是为什么我想深入讲主动柔顺,尤其是阻抗和导纳这两种控制策略。
3. 主动柔顺的核心:阻抗控制
3.1 把机器人想象成弹簧-质量-阻尼系统
主动柔顺的实现方式有很多,但最主流、最通用的是阻抗控制。它的核心思想是:不再直接控制接触力的大小,而是控制机器人末端"位置偏差"和"接触力"之间的动态关系。
为了说清楚这个关系,我习惯用一个类比:想象你站在一个弹簧门面前,用手去推门。
- 如果门很硬(刚度K很大),你推它几乎不动,力全吃在你手上,感觉非常硬。
- 如果门很软(刚度K很小),你轻轻一推它就开,力基本没怎么上传到手臂。
- 如果门带阻尼器(阻尼B很大),你推门时会明显感觉有"阻力感",速度越快阻力越大,但门不会被弹回来。
- 如果门很重(惯量M很大),想让它动起来就很难,但一旦动起来想停也难。
阻抗控制就是在机器人控制软件里"虚拟"出这扇门。机器人末端的位置x和目标位置x_d之间如果有偏差Δx,系统就会产生一个对应的接触力F;反过来,当实际存在外力和位置偏差时,机器人不会一直往目标位置硬顶,而是表现出类似弹簧-质量-阻尼的动态响应。
用公式表达就是:
F_ext = M_d * (ẍ - ẍ_d) + B_d * (ẋ - ẋ_d) + K_d * (x - x_d)这里的M_d、B_d、K_d是目标惯量、目标阻尼和目标刚度,它们不是机器人本身的物理参数,而是你在算法里设置的人为参数。你可以把机器人末端"做成"一个惯性很大、阻尼适中、刚度很低的虚拟弹簧系统,也可以反过来让它像一个刚性冲击器。关键就是这几个参数的取值。
3.2 阻抗参数怎么定:刚度、阻尼与惯量
参数设计是整个阻抗控制的灵魂。我先说最基础的三参数作用:
- 刚度K_d:决定稳态时的力-位置关系。K_d越大,同样的位置偏差对应越大的接触力;K_d越小,机器人越"软"。在自由空间跟踪轨迹时,K_d要取大,保证位置精度;在接触空间进行柔顺作业时,K_d要取小,让末端能顺应环境。
- 阻尼B_d:决定运动的能量耗散速度。阻尼不足,机器人接触到硬表面时会产生振荡,在孔内反复怼;阻尼太大,响应变慢,跟不上运动指令。
- 惯量M_d:决定系统对加速度的敏感度。一般保持和机器人实际末端惯量同数量级,差距过大会导致控制不稳定。
调参时有个非常实用的指标叫阻尼比ζ:
ζ = B_d / (2 * √(M_d * K_d))当ζ接近1时是临界阻尼状态,系统既不振荡又不迟钝,这是很多场合的默认目标。我实际调参时,一般先把K_d按需求定下来——需要多大力、允许多大偏差,两者相除就行——然后根据阻尼比公式反推B_d,再在实机上微调。
举个例子:假设某装配场景要求最大接触力不超过20牛,允许的位置偏差是2毫米,那K_d就是20 / 0.002 = 10000 N/m。如果目标惯量M_d取5千克,要达到临界阻尼,B_d = 2 * √(5 * 10000) ≈ 447 N·s/m。这只是一个起点值,实际系统有延迟,B_d通常还得再加大一点才能压住振荡。
3.3 阻抗控制落地的两条技术路线
阻抗控制在实现上有两种常见架构,区别在于控制内环是什么。
第一种是基于力矩控制的阻抗。机器人关节采用力矩控制内环,关节驱动器可以直接输出期望力矩。阻抗外环根据末端位置偏差计算需要的虚拟力,再通过雅可比矩阵转换到关节力矩指令。这种方案响应快、柔顺性能好,但对硬件要求极高,需要驱动器具备高带宽的电流环和准确的动力学模型,一般出现在高端协作机器人和力控工业机器人上。
第二种是基于位置控制的阻抗。机器人底层还是位置环在工作,阻抗外环计算出的虚拟力被转换成"位置修正量",叠加到目标位置上,再由位置内环去跟踪。这种方法不改变机器人的底层控制结构,只要有外部力传感器和上位机接口就能实现,工程上最常被使用。
我在做现场应用时,大部分是第二种架构。方法是在每个控制周期采样六维力传感器的数据,通过阻抗公式算出一个位置偏移,把这个偏移加到规划轨迹上。力大就往受力方向让位,力小就恢复原轨迹,这样机器人既保持运动趋势,又不会硬顶。
有一点必须提醒:基于位置的阻抗,本质上依赖位置环的跟踪速度。如果机器人控制器位置环刷新率不够高,或者通信周期太长,柔顺效果会很生硬,甚至出现"让位跟不上"的问题。我实测过一个老款控制器,刷新率只有125Hz,做阻抗柔顺时末端明显滞后,后来换上了实时通信模式才好转。所以做这个方案前,先确认控制器的周期能不能做到至少500Hz以上,否则后面调参你会很痛苦。
4. 导纳控制与阻抗控制:一对容易搞混的兄弟
4.1 信息流方向完全不同
很多初学者会把阻抗控制和导纳控制当成同一个东西,其实它们的区别在于信息流方向和控制目标的选择。
阻抗控制的核心是:输入位置偏差,输出力。机器人被"调教"成一个阻抗模型,你给它一个位置扰动,它产生一个力响应。它适合当作力的发生器,比如让机器人主动压在工件表面上施加指定压力。
导纳控制的核心刚好反过来:输入外力,输出位置修正量。机器人被"调教"成一个导纳模型,你施加一个外力,它产生一个位移响应。它适合当作力传感器驱动的运动发生器,比如你拖动机器人手臂做示教,手一拉它就跟着走。
从传输函数的角度看,阻抗和导纳互为倒数关系。但在实际工程里,这样区分更有意义:内环是位置控制的系统,通常配合导纳控制使用;内环是力矩控制的系统,通常配合阻抗控制使用。
我遇到过一个很形象的场景:用协作机器人做拖动示教。手臂末端装了六维力传感器,人手握住末端施加力,系统通过导纳模型把这个力换算成位置偏移,位置内环高速跟踪,表现出来就是机器人"很听话"地跟着手走。这里如果用阻抗控制就会很别扭,因为人并不想感受到一个阻力,而是希望机器人能按自己的意图移动。
4.2 实际选型:看硬件决定方案
做柔顺控制的选型时,不需要纠结哪个更高级,只需要看你的硬件条件。
- 如果你的机器人支持关节力矩控制模式(能直接输出力矩指令),优先做阻抗控制,柔顺性能最自然,碰撞响应也快。
- 如果你的机器人只有底层位置控制模式,那就走导纳控制路线,用外部位姿补偿实现柔顺功能。
- 如果你使用的是普通工业机器人加外部力传感器,通过EtherCAT或Profinet等实时总线通着上位机,最稳妥的方案就是上位机做导纳计算,把修正后的位置下发给机器人,机器人负责高速跟踪。
- 如果你是做六轴力控末端执行器,比如力控打磨头,那它一般内置了阻抗控制器,你不用改机器人本体,只需给末端设定期望接触力和柔顺方向就行。
这其中的核心原则是:不要试图在位置控制型机器人上强行实现"位置误差-力矩输出"的阻抗功能,因为底层无法快速响应力矩指令,你会得到一个振荡不止的废系统。反过来,也不要在力矩型机器人上做导纳,绕一圈又回到位置控制,白白浪费了力矩控制的优势。
另外,无论选哪种,传感器质量和滤波都绕不过去。六维力传感器的零点漂移、温度漂移会让柔顺效果大打折扣。我建议在使用前做一次零点校准,并在软件里加一个截止频率20到50Hz的低通滤波器。滤波太狠会让手感变得黏滞,太轻又会有噪声振荡,这个要按实际工况反复试。
5. 力位混合控制:另一个维度的尝试
5.1 把空间拆开分别控制
除了阻抗/导纳这类基于动态关系的柔顺控制,还有一种思路叫力位混合控制。它和阻抗的本质区别在于:阻抗控制同时控制力与位置的关系,不区分"哪个方向做力控";力位混合控制则是把任务空间明确分解成两个独立的子空间,在某一方向上要么做位置控制,要么做力控制,两者不能同时生效。
举例来说,机器人用砂纸打磨一个平面时,垂直于平面的方向需要控制接触力,让砂纸既不能压太狠磨穿,也不能离开表面;平行于平面的方向需要控制位置,保证打磨轨迹和速度。力位混合控制的做法就是用选择矩阵把任务空间分成两个正交的子空间:法向用力控制,切向用位置控制。
选择矩阵通常是一个对角阵,对角线元素为1表示做力控,为0表示做位置控。控制器在每个控制周期内分别计算法向的力控制指令和切向的位置控制指令,再合成到关节力矩上。
5.2 为什么力位混合用起来很难
理论上,力位混合控制很优雅,把"同时控力和控位"的问题转换成了"分工"的问题。但实际工程中,使用它的团队远少于使用阻抗/导纳的团队,我分析原因有以下几点。
第一,它对模型的依赖太强。力位混合控制需要精确知道任务空间的方向、约束的方向以及环境的位置。如果一个平面稍微有点倾斜,或者工件的形状复杂,选择矩阵的构建就会出错,导致该控力的方向被当成位置控,机器人和环境硬碰。
第二,切换点的过渡不容易处理。机器人从自由空间运动进入接触空间时,控制模式瞬间从"全位置控"切换到"某方向力控",如果切换逻辑处理不好,会出现力冲击,也就是接触瞬间的力的尖峰。这个尖峰会触发安全保护,甚至破坏工件。
第三,在非理想环境下,力控方向可能会受到位置控制方向耦合力的干扰,导致力和位置都控不好。相比之下,阻抗控制没有"开/关"切换,始终处于同一套动态关系中,模式过渡天然平滑,对复杂接触的适应性更强。
所以我的观点是,力位混合控制更适合结构高度固定的场合,比如机床加工、定位良好的装配线。对于面向多变工况的通用机器人柔顺应用,优先还是考虑阻抗/导纳控制,工程上的容错率高很多。但理解力位混合的思想仍然有价值,因为它帮助你建立"任务空间分解"的视角,这在设计复杂的力控策略时很有用。
6. 调参实操与问题排查
6.1 一套靠谱的调参顺序
柔顺控制的调参是最考验经验的部分。我在现场摸索出一套相对稳定的步骤,分享出来供参考。
第一步,先确定作业方向上的期望最大接触力和允许的位置偏差,算出参考刚度K_d。这一步需要你和工艺工程师确认,比如打磨铝合金件期望接触力5牛,允许变形1毫米,那K_d就是5000 N/m。如果工艺没有明确,先从较小刚度开始,比如1000 N/m,再根据效果往上加。
第二步,设置目标惯量M_d,一般取机器人末端实际负载总质量的0.5到2倍之间。负载很重时,M_d设太大容易导致响应迟钝;设太小会导致加速度需求过高,控制不稳。
第三步,按临界阻尼公式初算B_d,然后在实机上测试。如果出现接触振荡,就逐步增大B_d直到振荡消失;如果响应太慢,就逐步减小B_d,直到动作能跟上。每次调整幅度建议在10%到20%,避免一次改动太大掩盖了趋势。
第四步,加上接触力的软限位保护。设定一个安全力阈值,超过就立即停止或回退,防止调参过程中意外损坏工件和机器人。这步一定要在开始调参前做好,不是调完之后才补。
第五步,针对具体任务做方向性调整。比如装配插轴时,轴向方向要软,径向方向要稍硬,这样既能让轴顺着孔口滑入,又不至于左右飘。阻抗/导纳参数可以按轴坐标系分解设置成对角矩阵,不同方向用不同参数。
6.2 常见问题速查
我把实际调参过程中常遇到的问题整理成了一张速查表,方便现场快速定位。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 接触后反复振荡 | 阻尼B_d过小,或控制周期过长 | 增大B_d,或提高控制器刷新率 |
| 接触力超调,瞬间撞飞工件 | 刚度K_d过大,或目标位置突变 | 减小K_d,在规划端限制位置变化率 |
| 机器人离工件越来越远 | 力传感器漂移或力值未归零 | 重新校准力传感器零点,检查信号偏移 |
| 柔顺方向错误 | 力传感器与工具坐标系未标定 | 重新建立工具坐标系和传感器安装矩阵 |
| 运动时手感发黏 | 低通滤波器截止频率太低 | 适当提高滤波频率,或换用更高采样率的传感器 |
| 接触力和位置都跟踪不准 | 阻抗参数与系统惯量不匹配 | 检查M_d取值,避免和实际负载差太大 |
| 装配时轴卡在孔口 | 径向刚度太大,柔顺中心位置不当 | 降低径向K_d,或改用RCC机械柔顺辅助 |
| 打磨表面出现波浪纹 | 切向位置跟踪与法向力控耦合 | 提高切向位置刚度,降低法向力控目标值 |
6.3 我踩过的几个坑
最后说几个我实际踩过且印象深刻的坑,这些细节在教科书里通常不会写,但真的很致命。
第一个坑是力传感器坐标系没对齐。我做一次轴孔插入实验,传感器读数一直不对,柔顺方向反着走,轴被怼得更紧了,查了很久才发现是传感器安装旋转了90度,标定矩阵没更新。后来我每次安装工具后,都会固定做一次六维力方向的验证动作,用已知方向的推拉力确认传感器坐标与机器人坐标一致,这步能省掉很多排查时间。
第二个坑是滤波过度。为了把力信号弄得特别干净,我把低通滤波器截止频率设得很低,结果机器人整个变得像在糖浆里运动,动作滞后明显,接触时根本来不及让位。后来我学会用两个滤波思路:一个快滤波用于安全保护判断,另一个慢滤波用于稳定控制,这样既安全又不牺牲响应。
第三个坑是目标位置突变。在装配接近阶段,如果目标位置一步跨到接触深度,即使在柔顺模式下也会产生巨大的瞬时接触力。解决办法是在轨迹规划端给目标位置加上斜坡或S型滤波,让位置变化率受到限制。这是我调参进入瓶颈期时最容易忽视的地方,很多"参数怎么调都没用"的问题,最后都出在输入信号上。
整个柔顺控制的核心,就是理解"机器人和环境之间的力与位置关系",再用合适的控制器把这种关系塑造出来。不管是做被动柔顺的机械设计,还是做主动柔顺的算法调参,最终目标都是让机器人在复杂接触环境中既能干活、又不破坏自身和工件。我在实际项目里最深的体会是:不要一上来就调参数,先想清楚你要让机器人"软"在哪个方向、"硬"在哪个方向,再动手。方向想清楚了,参数只是水到渠成的事。希望这篇关于柔顺控制原理的梳理,能帮你在调试台上少走一些弯路。