1. 为什么机器人需要"柔"一下:刚性位置控制在高精度接触任务中的无力
先说一个我印象很深的场景。之前调一台六轴机器人做金属表面打磨,用的是传统的刚性位置控制。程序写得很"完美":轨迹走一圈,点位误差控制在0.1mm以内。结果真正开机一磨,砂轮刚碰到工件表面,接触力瞬间飙升到正常值的五倍,工件直接崩了个口子,机器人还傻乎乎地继续往下压。
问题出在哪?位置控制只认"位置误差",你的目标是"走到这里",但工件表面是有公差的,实际接触面比理论面高出来那么几十丝,位置控制器为了消除位置误差,就会拼命往下压。它不知道力已经把工件压坏了。这就是刚性位置控制在接触类任务里的先天不足:它不懂"适可而止"。
而工业里大量任务恰恰是需要"柔"的:
- 打磨抛光,需要恒力贴合曲面,力大了伤工件,力小了打不到;
- 装配插孔,需要在接触时顺着力自然修正位置,硬顶会卡死或损伤零件;
- 拖动示教,操作者握住末端往前拉,机器人要感觉到外力并顺着走,而不是跟人较劲;
- 人机协作碰撞检测,碰到人体时要让对方感受到的是"软接触",而不是一堵墙。
在这些场景里,我们需要的不是精确的位置,而是合理的接触力。但也不能完全放开位置控制去做纯力控制——纯力控制在非接触状态会飞车(没有约束时力为零,控制器会拼命加速去"找"力)。于是就有了阻抗控制:它不直接控制力,也不直接控制位置,而是控制"力和位置之间的动态关系"。
阻抗控制这个名字有点唬人,但它的物理内核其实就是一个大家在物理课上都见过的东西:阻尼-弹簧-质量系统。把机器人末端的行为"伪装"成一个弹簧连着阻尼器连着质量块的力学系统,力作用在这个系统上会产生相应的位移响应,位移变化又会反过来产生抵抗的力。理解了这个模型,阻抗控制的底层逻辑你就拿下了大半。这篇文章我来完整梳理这套模型,从物理直觉到数学推到,再到参数整定和落地过程中的各种坑,尽量讲透。
2. 阻尼-弹簧-质量模型:阻抗控制的力学直觉与数学骨架
2.1 先找找感觉:一块海绵、一扇阻尼门和一个举铁哑铃
讲公式之前,先用三个日常物品建立物理直觉。
第一个是弹簧。压一块弹簧,你压多少,它顶回来多少,力跟位移成正比例。弹簧决定了系统的"刚度",也就是静态时对外力有多"硬"。第二个是阻尼器,想象推开一扇装了液压闭门器的门,你推得越快,它给你的阻力越大,但你慢慢推,就很轻松。阻尼器消耗能量,它决定动态过程的"粘滞感"。第三个是质量块,推一个大哑铃,力大了它才有明显加速,而且一旦动起来你又要花力气让它停下来。质量决定了系统对力的"惯性响应"。
把这三个东西串在一起,就是机器人阻抗控制的参考模型。我们希望机器人在外力作用下,表现得像这样一个"弹簧-阻尼-质量"组合体。这个组合体的行为,可以用一条很干净的方程描述:
$$M\ddot{e} + B\dot{e} + Ke = F_{ext}$$
其中 $e = x_d - x$ 是期望位置与实际位置的偏差,$M$、$B$、$K$ 分别是目标惯量、目标阻尼、目标刚度,$F_{ext}$ 是外界施加在末端的外力。
这条方程的物理含义很直白:外力作用在系统上,一部分被惯性吃掉($M\ddot{e}$),一部分被阻尼耗散掉($B\dot{e}$),一部分被弹簧"顶起来"($Ke$)。机器人控制器的任务,就是让实际末端的运动满足这条方程,从而实现我们想要的柔顺特性。
2.2 把"手感"翻译成数学:为什么是这条二阶方程
为什么偏偏是二阶方程,而不是一阶、三阶?原因有几个,而且都很实在。
第一,机器人末端在外力下的运动本质上确实可以建模成二阶系统。刚体动力学里,力的作用效果通过加速度体现,加速度又积分出速度和位置,这天然就是二阶结构。欠驱动、带柔性的机器人高阶部分当然有,但那是扰动,不是主导行为。
第二,二阶系统覆盖了我们需要的全部"手感"范围。弹簧项 $K$ 决定静态刚度,阻尼项 $B$ 决定动态衰减,惯性项 $M$ 决定响应快慢。这三个参数独立可调,分别对应机器人对外力的静态响应、瞬态响应和动态响应。你想要的"柔中有刚"、"硬中有缓",通过调这三个系数全能实现。
第三,计算上可解。把这条方程结合机器人动力学模型,可以解出控制律。我们不用真的在物理上给机器人装弹簧和阻尼器,而是通过控制算法"虚拟地"复现这套行为。算法层面只需要三个系数和一个稳定条件,工程落地成本可控。
2.3 映射到机器人身上:笛卡尔空间与关节空间的转换
我前面写的方程是在笛卡尔空间(操作空间)里的表达式,描述的是机器人末端工具点在外力作用下的期望响应。这一点很关键,因为机器人的控制本质上是在关节空间做的——电机输出的是关节力矩,编码器反馈的是关节角度。
要让末端的运动满足阻抗方程,需要把笛卡尔空间的力-位移关系转换到关节空间。这里用到的就是雅可比矩阵。大致流程分三步:
- 读取末端实际位姿 $x$,计算位置偏差 $e = x_d - x$;
- 把阻抗方程算出的"目标末端加速度" $\ddot{e}$ 再做一次逆运动学转换,得到关节空间的期望加速度;
- 结合机器人的惯性矩阵,算出关节力矩指令,由底层伺服执行。
用公式表达就是:
$$\tau = J^T \left( K e + B \dot{e} \right) + M_{model}(\theta)\ddot{\theta} + C(\theta,\dot{\theta}) + g(\theta) + \tau_{f}$$
后半部分是机器人自身的动力学补偿项。物理意义很清楚:先补偿掉机器人自重、科氏力、摩擦这些"内部因素",再叠加阻抗项,让末端对外只表现出我们设置的那一套"弹簧-阻尼-质量"特性。
2.4 阻抗控制不是"力控"也不是"位控",而是两者之间的桥
这里我多强调一句,因为很多人对"阻抗控制"的理解是从这个概念的名字里猜出来的,猜完后基本都偏了。
阻抗控制不是直接控制力。它对内其实是位置控制——跟踪的还是期望位置轨迹,只不过这个期望位置不是固定的,而是被外力"推"偏的。力在这里是输入,不是被控量。正因为如此,阻抗控制天生没有纯力控那种"非接触时飞车"的问题。
阻抗控制也不是单纯的柔顺位置控制。因为它的被控对象不只是位置,而是"力与位置的映射关系"。同样是位置偏差0.1mm,刚度设置的机器人顶回去的力很大,刚度低则无所谓。通过调 $K$,你控制的是"对方推动你时需要使出多大劲",这已经是力层面的行为。
所以我把阻抗控制理解成一座桥:一端连着位置控制的稳定性和实用性,另一端连着力控的顺应性和交互能力。调试得当,它可以在接触任务中做到"既能干活,又不伤人和物"——这就是它在柔顺控制领域被视为主流的根本原因。
2.5 一个很容易被忽略的前提:底层位置环带宽要够
说句题外话,也是实操中经常踩的暗坑。阻抗控制是建立在位置控制之上的,如果底层位置控制器的带宽不足、响应太慢,你设置再好的 $K$、$B$、$M$ 都没用,因为末端的期望位置变化时,关节根本追不上。
我遇到过一台老型号机器人,底层伺服周期是4ms,位置环整定得又保守,阻抗控制的增益稍微提高一点就开始抖。后来只好把目标刚度往低调,牺牲静态特性换稳定。这个经验在后面调参部分还会展开,这里先提个醒:阻抗控制的效果上限,由底层伺服性能决定。
3. 三种"阻抗性格":刚度、阻尼、惯量各自在指挥什么
3.1 刚度 $K$:决定"被推开的幅度",也决定"顶回去的力量"
刚度 $K$ 是阻抗控制里最直观、也最容易理解的一个参数。它的物理定义是"单位位移产生的阻力",单位牛顿/米(N/m)。刚度 $K$ 越大,外力作用下位置偏差越小,但接触力越大;刚度 $K$ 越小,位置偏差越大,但接触力越温和。
实际场景怎么选?看任务的核心矛盾:
- 打磨、去毛刺:希望砂轮贴着工件表面走,工件表面高低起伏时接触力不能突变,刚度要低一点。我一般设在100~500 N/m,具体看工件材质和余量。
- 插孔、装配:轴向要"顺着来",刚度中等,让零件能自己找位置;但径向要保持一定刚度,防止零件偏向另一侧。这种场景我会把笛卡尔空间不同轴设不同刚度——轴向3000 N/m,径向10000 N/m,这叫"各向异性阻抗",后文会细说。
- 零件检测、压装:需要精确控制接触力,刚度高一点,比如2000~5000 N/m,配合阻尼做稳定,确保力的可控性。
需要记住的是:$K$ 不是越大越好。刚度太高,机器人就退化成位置控制,前面的问题全回来了;刚度太低,末端"软趴趴",轨迹跟踪精度急剧下降,稍微有点外力就跑偏。这个平衡点是调出来的,不是算出来的。
3.2 阻尼 $B$:决定"动起来的阻力",也决定"停下来之后还抖不抖"
阻尼 $B$ 的单位是牛·秒/米(N·s/m),它的大小决定速度变化时受到的抵抗。可以类比成推门时液压杆的强度:你快速推,它给你的反力大;你慢慢推,它几乎不拦你。
阻尼是动态稳定性的关键因素。具体来说,它有两个作用:
作用一:消耗接触冲击能量。机器人末端碰到硬物时,如果只有弹簧没有阻尼,系统会来回振荡,像一根压下去就弹起来的水管。加上阻尼,振荡被逐渐耗散,末端快速趋于稳定。
作用二:平滑速度突变。比如拖动示教时,操作者猛地一拉,高阻尼能把冲击吸收,让机器人慢悠悠地跟过去,而不是被拖得甩起来。
那么 $B$ 取多大合适?工程上最常用的是临界阻尼参考:
$$B_{critical} = 2\sqrt{MK}$$
阻尼比 $\zeta = \frac{B}{2\sqrt{MK}}$。当 $\zeta = 1$ 时是临界阻尼,系统既不振荡又不迟钝;$\zeta < 1$ 欠阻尼,会有回弹振荡;$\zeta > 1$ 过阻尼,响应变慢但绝对稳定。
实际调参时,我很少追求精确的临界阻尼,因为机器人动力学里有摩擦、延迟这些非线性因素。一般给到临界阻尼的70%~100%,就既能压住振荡,又不会让人觉得机器人"反应迟钝"。如果还要更快,就把 $B$ 再调低,配合少量振荡去换取响应速度。
3.3 惯量 $M$:决定"启动的费力程度",是阻抗控制的隐藏性格
惯量 $M$ 是被很多人忽略的参数,但它实际上决定了系统的带宽和抗冲击能力。它的单位是千克(kg),代表系统对加速度的"抵抗"。
想理解惯量项的作用,可以想象两个场景的对比:一个是推一辆超市手推车(轻惯量),一个是推一辆装满砖头的独轮车(重惯量)。同样一个力,手推车"嗖"一下走了,独轮车则慢慢悠悠地启动。但如果有一堵墙挡着,手推车撞上去会碎,独轮车则慢慢推也推不动。
在阻抗控制里:
- 惯量 $M$ 大:对外力的响应慢,低频特性好,低频冲击被吸收——适合大负载、重工具的场合,也能在高频接触时避免激发共振。
- 惯量 $M$ 小:响应快,跟随性好,末端"轻巧灵活"——适合精细装配、拖动示教等需要敏锐响应的场景。
另外注意一个连带关系:带宽 $\omega_n = \sqrt{K/M}$。在刚度 $K$ 固定的情况下,惯量 $M$ 越小,系统带宽越高,动态响应越快。这又是一个权衡。我建议 $M$ 初始设为机器人末端在该方向上的实际等效惯量,再根据响应速度微调5%~20%。
3.4 三个参数的关系:一张表说清"参数调大后系统会怎样"
| 参数 | 调大后的效果 | 适用范围 | 过大的风险 |
|---|---|---|---|
| 刚度 $K$ | 接触力大、位置偏差小、静态"硬" | 高精度装配、力控精度要求高的场景 | 退化为位置控制,接触冲击大,易伤工件 |
| 阻尼 $B$ | 振荡衰减快、速度响应变慢、抗冲击强 | 接触瞬间容易冲撞、需要稳定的场景 | 末端"僵滞",拖动费劲,响应迟钝 |
| 惯量 $M$ | 低频响应慢、高频带宽降低、抗高频扰动强 | 重负载、工具惯量大、需要抑制振动的场景 | 响应迟钝,力-位移关系变得"虚",难控制 |
这三个参数不是独立存在的,它们共同决定了一个关键指标:系统是否稳定。判别方法就是算阻尼比 $\zeta$。如果 $\zeta < 0.5$,系统肯定振荡;$\zeta > 2$,系统稳定的同时又"僵"。我一般把目标定在0.7~1.2之间。
4. 参数整定:从一张白纸到行为可控的调参路线
4.1 第一步:明确任务类型,反推目标刚度范围
调参不能拍脑袋,得先在任务层面定方向。我用一个简单的判断框架:
- 任务里允许末端偏离多少?偏离量就等于外力除以刚度。打磨时接触力20N,想让末端有0.1m的"让刀量",$K$ 就约等于200N/m。反过来,如果想让变形只有0.01m,$K$ 就得2000N/m。
- 任务里允许的接触力上限是多少?$F_{max} = K \cdot e_{max}$。如果接触力不能超过50N,而最大位置偏差可能有0.1m,那 $K$ 不能超过500N/m。
这两个约束交叉,基本能把 $K$ 的范围圈定。我通常先取中间值,比如500~1000 N/m,然后在实际接触测试里微调。
4.2 第二步:选 $M$ 和 $B$,用临界阻尼公式做初值
$M$ 的初值我一般取机器人末端在该方向上的实际等效质量,也就是惯量矩阵的对应元素。这个可以从机器人自带的动力学参数里读出来,或者用辨识工具求。如果不知道怎么查,就先把 $M$ 固定在1~5kg之间的一个值,后面再调。
$B$ 的初值直接用临界阻尼公式:
$$B = 2\sqrt{MK}$$
拿打磨场景举例:$M=2$kg,$K=300$N/m,则 $B = 2\sqrt{2 \times 300} \approx 49$ N·s/m。先把这个值作为初值,上线看实际动作,再按前面说的70%~100%折中原则调整。
4.3 第三步:用"推压测试"验证行为,看三个现象
调参不能光在仿真里看曲线,要直接上手做"推压测试"。我每次都会在机器人末端装一个力传感器或者固定的推杆,让机器人以一个固定轨迹缓慢推进,直到碰到一个刚性障碍物(桌面或专用挡块),然后观察力和位置的数据曲线。
重点看三个现象:
- 接触瞬间力有没有尖峰。有尖峰说明阻尼不够或刚度太高,接触冲击能量没被耗散掉,末端"硬撞"上去了。对策:先加大 $B$,如果还不行就降低 $K$。
- 稳定后有没有持续振荡。有振荡说明阻尼比太低,系统在临界点附近。对策:逐步加大 $B$,每加10%再跑一次,直到振荡消失。
- 外力消失后,回到期望位置的快慢。回得太慢说明过阻尼太"粘",操作者会觉得机器人拖泥带水。对策:减小 $B$,让回程更利落。
这个过程听起来简单,但非常有效。我调试时一般不盯着代码改参数,而是反复做这个推压测试,通过手感判断"这机器人够不够柔"。
4.4 第四步:按任务场景做专项优化
推压测试合格后,再针对具体任务做专项调整:
- 打磨/抛光场景:关注接触力的稳态误差。如果打磨力偏差超过要求,优先调高 $K$;如果工件转角处力波动大,优先调高 $B$。另外打磨时末端高速运动,还要注意阻抗参数与进给速度的耦合,速度越高,等效阻尼需求越大。
- 装配/插孔场景:需要各向异性阻抗。轴向(插孔方向)刚度低、阻尼适中,让零件能顺着导向自然滑入;径向刚度高、阻尼高,防止摆动。这种配置不是靠一个 $K$ 解决的,要用完整的三维阻抗矩阵。
- 拖动示教场景:把 $K$ 设为0(或者极小),让末端跟随外力自由运动;$B$ 的值决定"手感"顺滑程度。一般300~800 N·s/m,具体看操作人员习惯——有人喜欢轻快,有人喜欢沉稳。
- 人机协作/碰撞检测:安全第一。$K$ 要设得很低,$B$ 要足够大,确保碰撞力峰值在人体耐受范围内。同时可以叠加一个"碰撞检测器":一旦检测到力超过阈值,立即切换成纯位置保持或停止。
4.5 一张参考参数表(基于我自己的使用经验)
| 任务类型 | 方向 | 刚度 $K$ (N/m) | 阻尼 $B$ (N·s/m) | 惯量 $M$ (kg) |
|---|---|---|---|---|
| 表面打磨 | 法向 | 100~500 | 60~100 | 1~5 |
| 精密装配 | 轴向 | 500~2000 | 50~120 | 1~3 |
| 精密装配 | 径向 | 5000~20000 | 100~300 | 1~3 |
| 拖动示教 | 全向 | 0~50 | 300~800 | 2~10 |
| 人机协作 | 全向 | 50~300 | 100~500 | 2~8 |
注意这些只是初值参考,我第一次调参也踩过参数量级差导致机器人抖成筛子的坑。建议每台机器人、每种工具都重新标定,不要照搬。
5. 从仿真到实机:阻抗控制落地时的工程细节
5.1 力反馈从哪来:传感器选型与信号处理
阻抗控制有三种常见的力反馈获取方式,各自的坑我挨个说:
方式一:末端六维力/力矩传感器。这是最直接、最可靠的方式。装在法兰盘上,测的就是真实接触六维力和力矩。但它有两个问题:一是贵,好一点的几万起步;二是传感器自带的零点漂移和温漂需要定期标定,不然长期运行后接触力越来越不准。我在生产线上遇到过一台机器人打磨了三个月后力偏差越拉越大,排查半天发现是力传感器温漂造成的。
方式二:关节力矩传感器。很多协作机器人本身就带关节力矩反馈,可以直接用。它的优势是不用额外加硬件,但精度受关节摩擦、减速器效率影响较大,尤其在低速运动时摩擦补偿不干净,测得的外力会有几牛到几十牛的误差。对精密任务来说,这个误差很致命。
方式三:电机电流估算。最经济的方式,只适合大力、低精度的应用。电流估算力的精度受温度、磁场、减速器磨损等因素影响,误差通常在10%以上,一般不建议用于精密阻抗控制。
信号处理上,力传感器数据必须经过滤波。我的经验是使用截止频率20~50Hz的二阶低通滤波,不能过高也不能过低。过高滤不掉机械振动噪声,过低则力信号延迟太大,阻抗控制容易振荡。滤波引入了相位延迟,这会直接降低系统稳定裕度。
5.2 重力补偿是阻抗控制的"地基"
阻抗控制方程里的动力学补偿项包括重力补偿。如果重力补偿不准,最典型的症状是:机器人静止在那里,你松手,它不会停在原处,而是朝重力方向缓慢漂移,或者反向反向顶住。
重力补偿不准的来源一般是两个:一是工具质量、重心标定不准确;二是机器人构型变化时,重力矩估计随关节角非线性变化,而补偿模型没有更新好。
解决手段分两步。第一步,用机器人自带的工具重心标定功能,准确测出工具的重量和重心位置。第二步,在代码里验证重力补偿效果:让机器人运动到几个极端姿态,记录关节力矩期望值,观察位置误差是否为零、是否有漂移。有漂移就是补偿不对,先调这个再做阻抗控制,否则后续调参读出来的力数据全是假的。
5.3 接触瞬间的冲击:阻尼是防波堤,但也别指望它独扛
机器人和环境接触的那一瞬间,是阻抗控制最脆弱的时刻。因为接触前末端速度不为零,撞上刚性表面时,动能要在极短时间内被弹簧和阻尼吸收。如果动能太大,就算有 $B$ 撑着,接触力峰值也会高得吓人。
我的做法是三管齐下:
- 在轨迹规划层面控制接触速度。接近工件时的进给速度不要超过50mm/s,打磨、装配这类任务更是建议10~30mm/s。
- 在阻抗参数层面加大接触方向的阻尼。可以在检测到接触的前200ms内,临时把阻尼 $B$ 调高到1.5倍,等稳定后再恢复到额定值。这叫"变阻尼"策略,控制简单、效果立竿见影。
- 在安全策略层面设一个力上限。超过阈值就立即切换模式或者停机,防止意外过程损坏工件和设备。
5.4 底层伺服周期和通信延迟对阻抗控制的影响
阻抗控制的效果上限很大程度上受底层通信延迟的限制。我实际调过几种系统,列一个经验对比:
| 控制架构 | 典型控制周期 | 阻抗控制最大可调刚度 | 备注 |
|---|---|---|---|
| 示教器+总线(工业机器人) | 8~16ms | 500~1000 N/m | 受厂商二次开发接口限制,参数可调范围小 |
| 控制器内部集成(协作机器人) | 1~4ms | 2000~5000 N/m | 厂商开放了阻抗接口,性能较好 |
| 外部实时控制器(EtherCAT等) | 0.5~1ms | 5000~20000 N/m | 可做高刚度、高带宽阻抗控制 |
如果发现刚度稍微调高一点就开始抖或者啸叫,先别急着怀疑参数,先看控制周期和通信延迟。同一套参数,在1ms周期下能稳住的系统放到8ms周期下,大概率振荡。
6. 常见问题集中排查:为什么你的阻抗控制不听话
6.1 症状一:末端接触后持续振荡,像"果冻"一样晃
这是最常见也最让人头疼的问题。原因通常是阻尼不足,系统欠阻尼振荡。排查思路按顺序来:
- 算一下当前阻尼比 $\zeta$ 是多少,如果在0.5以下,直接增大 $B$;
- 如果 $B$ 已经很大还是振荡,检查力传感器信号滤波是否过度,滤波延迟会让系统"跟不上",等效于降低了阻尼;
- 如果还不稳定,检查底层位置控制器带宽是否够,带宽不足时阻抗控制就像在棉花上练拳,怎么调都使不上劲;
- 最后检查控制周期——工业机器人二开8ms以上的周期,高刚度阻抗控制基本不可能稳定。
6.2 症状二:接触力一直高于期望值,压着工件不放
打磨时砂轮压在工件上,力显示一直偏大。这个问题的典型原因是刚度 $K$ 设置过高,位置偏差被放大成了过大接触力。同时也要检查重力补偿有没有问题,工具重量标定不准直接导致恒定的力偏差。
另一个容易被忽略的原因是:位置期望 $x_d$ 没有正确设置。如果 $x_d$ 和目标表面还差着一段距离,那么即便接触已经发生,控制器认为"还没到目标位置",会继续加力下压。这个场景在调试打磨时经常碰到——你望的位置是理想表面,但实际的接触面高了一点,机器人自然会一直"往下找"。
对策是:在接触后重新定义 $x_d$ 为"当前接触位置",让阻抗控制只在接触点附近做小范围调节,而不是向着虚拟的远目标前进。这个操作叫"接触点更新"或"基准位置重置",是实现恒力打磨的必备技巧。
6.3 症状三:拖动示教时,手一松机器人往回弹
拖动示教场景里,$K$ 如果设置的不是零而是某个值,手一松机器人会回到它认为的"期望位置",看起来就像"弹回去了"。解决方法是把 $K$ 设成0,同时补偿重力,让末端在无外力时随手停在任意位置。
也有的机器人拖动示教"僵硬",推起来阻力很大,那通常是 $B$ 过大。拖动示教的实际手感与 $B$ 成反比,$B$ 越小越省力,但太小会晃。我的经验是在300 N·s/m附近先试,然后让不同体力的操作者分别试手感,取一个大家都舒服的值。
6.4 症状四:切换任务后参数“失灵”
我遇到过不少人把阻抗参数存在控制器里,换了个工具头就不行了。原因很简单:$M$、$B$、$K$ 的参数都是针对特定末端惯量的。换一个更重的工具,等效惯量变大,原来的 $M$ 和 $B$ 就都显得"太小"了,系统自然容易失稳。
每次更换工具头或者改变工件重量,都要重新确认三个参数的量级。我建议在代码里把阻抗参数做成工具相关的外参配置,跟随工具切换自动加载,而不是写死在程序里。
7. 写在最后:我的几条实操体会
阻抗控制这套阻尼-弹簧-质量模型,讲原理很快,真正玩明白靠的是大量接触测试。我把自己这几年调过的项目经验浓缩成几条体会,希望能让后来的朋友少走几步弯路:
第一,先保证稳定,再追求柔顺。很多新手一上手就想把机器人调得"特别柔",把 $K$ 拉低、$M$ 拉小,结果系统直接振荡,不得不匆忙把参数改回去。正确路线是:先用高阻尼、中等刚度把系统稳定住,确认各种姿态下都不抖,再逐步向目标手感逼近。
第二,力传感器是刚需,电流估算只适合"大概齐"的场合。如果项目对接触力的控制精度有要求,别省这钱。省下来的成本,后面全是调试和返工的代价。
第三,阻抗参数不是一次调完就一劳永逸。机器人从冷机到热机,关节摩擦变了;工件批次不同,表面余量变了;工具磨损了,重心也变了。这些都会影响实际接触效果。我在产线上设置的是每班开机后的自动校验流程,跑一组标准的推压测试,如果偏差超过阈值就自动调整参数或报警提醒。
第四,调参时要多用手去"感受",不要只盯着曲线。曲线告诉你数据,但不告诉你"手感"。打磨工跟我说"太硬了",和曲线显示的力超差10%,说的是两回事。多跟现场操作的人聊,他们对手感的描述往往比理论计算更能帮你定位问题。
第五,阻抗控制从来不是万能的。遇到接触力要求极高、动态响应要求极快的场合,阻抗控制会力不从心。这时候要想想:是不是该用直接的力控制?是不是该在机械结构上做柔顺?是不是该换个思路做力/位混合切换?技术选型从来不是单选题,阻抗控制只是工具箱里的一把好用的扳手,它不是整个工具箱。
最后分享一个小细节:我每次调阻抗参数都会把机器人的速度降到正常工作的30%,然后拿着一支笔在末端点上做标记,手动推着末端画圈。通过观察笔尖轨迹的圆不圆、稳不稳,能快速判断这个方向的阻抗参数合不合理——这比看数据快得多,而且不费任何传感器。这个土办法我用了很多年,建议你也试试。