机器人阻抗控制从原理到调参:阻尼-弹簧-质量模型与工程实践
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}$$拿打磨场景举例$M2$kg$K300$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~50060~1001~5精密装配轴向500~200050~1201~3精密装配径向5000~20000100~3001~3拖动示教全向0~50300~8002~10人机协作全向50~300100~5002~8注意这些只是初值参考我第一次调参也踩过参数量级差导致机器人抖成筛子的坑。建议每台机器人、每种工具都重新标定不要照搬。5. 从仿真到实机阻抗控制落地时的工程细节5.1 力反馈从哪来传感器选型与信号处理阻抗控制有三种常见的力反馈获取方式各自的坑我挨个说方式一末端六维力/力矩传感器。这是最直接、最可靠的方式。装在法兰盘上测的就是真实接触六维力和力矩。但它有两个问题一是贵好一点的几万起步二是传感器自带的零点漂移和温漂需要定期标定不然长期运行后接触力越来越不准。我在生产线上遇到过一台机器人打磨了三个月后力偏差越拉越大排查半天发现是力传感器温漂造成的。方式二关节力矩传感器。很多协作机器人本身就带关节力矩反馈可以直接用。它的优势是不用额外加硬件但精度受关节摩擦、减速器效率影响较大尤其在低速运动时摩擦补偿不干净测得的外力会有几牛到几十牛的误差。对精密任务来说这个误差很致命。方式三电机电流估算。最经济的方式只适合大力、低精度的应用。电流估算力的精度受温度、磁场、减速器磨损等因素影响误差通常在10%以上一般不建议用于精密阻抗控制。信号处理上力传感器数据必须经过滤波。我的经验是使用截止频率20~50Hz的二阶低通滤波不能过高也不能过低。过高滤不掉机械振动噪声过低则力信号延迟太大阻抗控制容易振荡。滤波引入了相位延迟这会直接降低系统稳定裕度。5.2 重力补偿是阻抗控制的地基阻抗控制方程里的动力学补偿项包括重力补偿。如果重力补偿不准最典型的症状是机器人静止在那里你松手它不会停在原处而是朝重力方向缓慢漂移或者反向反向顶住。重力补偿不准的来源一般是两个一是工具质量、重心标定不准确二是机器人构型变化时重力矩估计随关节角非线性变化而补偿模型没有更新好。解决手段分两步。第一步用机器人自带的工具重心标定功能准确测出工具的重量和重心位置。第二步在代码里验证重力补偿效果让机器人运动到几个极端姿态记录关节力矩期望值观察位置误差是否为零、是否有漂移。有漂移就是补偿不对先调这个再做阻抗控制否则后续调参读出来的力数据全是假的。5.3 接触瞬间的冲击阻尼是防波堤但也别指望它独扛机器人和环境接触的那一瞬间是阻抗控制最脆弱的时刻。因为接触前末端速度不为零撞上刚性表面时动能要在极短时间内被弹簧和阻尼吸收。如果动能太大就算有 $B$ 撑着接触力峰值也会高得吓人。我的做法是三管齐下在轨迹规划层面控制接触速度。接近工件时的进给速度不要超过50mm/s打磨、装配这类任务更是建议10~30mm/s。在阻抗参数层面加大接触方向的阻尼。可以在检测到接触的前200ms内临时把阻尼 $B$ 调高到1.5倍等稳定后再恢复到额定值。这叫变阻尼策略控制简单、效果立竿见影。在安全策略层面设一个力上限。超过阈值就立即切换模式或者停机防止意外过程损坏工件和设备。5.4 底层伺服周期和通信延迟对阻抗控制的影响阻抗控制的效果上限很大程度上受底层通信延迟的限制。我实际调过几种系统列一个经验对比控制架构典型控制周期阻抗控制最大可调刚度备注示教器总线工业机器人8~16ms500~1000 N/m受厂商二次开发接口限制参数可调范围小控制器内部集成协作机器人1~4ms2000~5000 N/m厂商开放了阻抗接口性能较好外部实时控制器EtherCAT等0.5~1ms5000~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%然后拿着一支笔在末端点上做标记手动推着末端画圈。通过观察笔尖轨迹的圆不圆、稳不稳能快速判断这个方向的阻抗参数合不合理——这比看数据快得多而且不费任何传感器。这个土办法我用了很多年建议你也试试。