2、阻抗与导纳对偶:从阻抗模型推导导纳模型,理解力与位置的动态关系

好,咱们接着聊。上一章我们把阻抗控制的基本框架搭起来了,你大概知道了「力跟位置偏差成正比」这个核心思想。但做机器人控制久了你会发现,光知道阻抗还不够——很多时候我们需要反过来思考。

说白了,阻抗和导纳就是一枚硬币的两面。一个描述「位置偏差产生力」,另一个描述「力产生位置偏差」。我当年刚接触这个概念时也绕了好一阵子,总觉得这不就是数学上取个倒数嘛,有啥好讲的?直到我在现场调试一台协作机器人时,才真正体会到这两者的区别有多重要。

2.1 从阻抗到导纳:一个简单的数学变换

先回顾一下阻抗模型的标准形式:

F = M * (ẍ_d - ẍ) + B * (ẋ_d - ẋ) + K * (x_d - x)

这个公式的意思是:你偏离目标位置多少,我就给你多大的力。M、B、K分别是惯性、阻尼、刚度系数。

那导纳模型呢?其实就是把等式两边调换一下角色:

ẍ_d - ẍ = M⁻¹ * (F - B * (ẋ_d - ẋ) - K * (x_d - x))

嗯,看着有点绕。我换个说法:你给我一个外力,我就计算出应该偏离目标位置多少

核心区别一句话总结:

  • 阻抗控制:输入是位置偏差,输出是力
  • 导纳控制:输入是外力,输出是位置修正量

你想想看,这两种模式在实际中对应什么场景?

阻抗控制适合机器人主动去推东西——比如装配时,机器人主动施加一个力,位置偏差越大,力越大。而导纳控制适合机器人被动地被人推——比如你用手去推一个协作机器人的末端,它应该顺着你的力方向移动,而不是跟你硬顶。

2.2 为什么需要这对「对偶」关系?

我个人习惯把阻抗和导纳看作「主动」和「被动」两种模式。在实际项目中,我遇到过这样一个场景:

一台机器人要完成两个连续动作——先是主动去抓取一个工件(需要阻抗模式,精确控制力),然后被人推着移动到另一个工位(需要导纳模式,柔顺跟随)。如果只懂其中一种,这个任务根本做不了。

所以,理解这对对偶关系,本质上是在理解:机器人与环境交互时,谁在主导?

特性 阻抗控制 导纳控制
输入 位置偏差 外力/力矩
输出 力/力矩 位置修正量
典型场景 主动施力(如打磨、装配) 被动跟随(如拖动示教、人机协作)
控制特点 需要精确的位置跟踪 需要灵敏的力感知
稳定性风险 与环境刚度有关 与传感器噪声有关

2.3 导纳模型的离散化实现

理论讲完了,咱们看看代码怎么写。导纳模型在离散时间下的实现,其实比阻抗模型更直观一些:

// 导纳控制离散化实现
// 输入:外力 F_ext,当前位姿 x_cur,目标位姿 x_des
// 输出:修正后的目标位姿 x_cmd

// 1. 计算外力引起的加速度修正
double acc_cmd = (F_ext - B * vel_err - K * pos_err) / M;

// 2. 积分得到速度修正
vel_cmd += acc_cmd * dt;

// 3. 积分得到位置修正
pos_cmd += vel_cmd * dt;

// 4. 叠加到目标位姿上
x_cmd = x_des + pos_cmd;

这段代码看着简单,但有几个坑我得提醒你:

我曾经踩过的坑:

  • 积分饱和:如果外力一直存在,位置修正量会不断累积。我遇到过机器人被推着推着就跑到极限位置去了。解决办法是加一个限幅,或者引入一个「虚拟弹簧」把机器人往回拉。
  • 数值震荡:dt(控制周期)太大时,积分会不稳定。我建议控制周期至少跑到1kHz以上,也就是1毫秒一次。
  • 传感器噪声:力传感器稍微有点噪声,积分后位置就会抖。我一般会在力信号上加一个低通滤波器,截止频率设在5-10Hz左右。

2.4 力与位置的动态关系:一张图看懂

说了这么多,咱们用一张图来总结阻抗与导纳的对偶关系:

阻抗与导纳对偶关系图 阻抗控制 输入:位置偏差 输出:力/力矩 F = M·Δẍ + B·Δẋ + K·Δx 主动施力场景 如:打磨、装配、抓取 对偶关系 数学上互为逆运算 导纳控制 输入:外力/力矩 输出:位置修正量 Δx = f(F, M, B, K) 被动跟随场景 如:拖动示教、人机协作 共同点:都描述机器人与环境的交互行为,参数M、B、K物理意义相同

2.5 实际项目中的选择策略

好了,理论、代码、图都有了,最后聊聊实际中怎么选。我个人的经验是:

  1. 看你的传感器:如果你有高精度的力传感器,导纳控制更容易实现。如果只有位置传感器(比如编码器),阻抗控制更直接。
  2. 看你的任务:需要精确控制力的大小?用阻抗。需要机器人顺从地跟随外力?用导纳。
  3. 看你的环境:环境刚度很大(比如接触金属表面),阻抗控制容易不稳定。环境刚度小(比如接触海绵),导纳控制容易飘。

一个小技巧:

如果你不确定该用哪种,可以先试试导纳控制。因为导纳控制天然带有「柔性」,不容易把机器人搞坏。我刚开始做力控时,就是用导纳控制做拖动示教,慢慢才过渡到阻抗控制做精密装配。

嗯,这一章的内容就到这儿。阻抗和导纳的对偶关系,说白了就是「主动」和「被动」的切换。理解了这个,你就能根据实际场景灵活选择控制策略了。