4、笛卡尔空间力矩控制:阻抗控制、导纳控制、力位混合控制

聊到笛卡尔空间的力矩控制,我得先说说自己的一个体会。刚入行那会儿,我总觉得让机器人走个轨迹、定个位就完事了。直到有一次做精密装配,零件公差只有0.02毫米,位置控制死活怼不进去,还把工件给压坏了。那时候我才真正意识到——光有位置控制,机器人就是个瞎子。

笛卡尔空间力矩控制,说白了就是让机器人不光知道“我在哪”,还得知道“我用了多大力”。这在实际工程里太重要了。你想想看,擦玻璃、拧螺丝、甚至给人按摩,哪样不得控制力?

今天咱们就掰开揉碎,聊聊三种最主流的笛卡尔空间力矩控制方法:阻抗控制、导纳控制、力位混合控制。

4.1 阻抗控制:让机器人学会“柔顺”

阻抗控制这个名字,其实挺容易让人误解的。它不是去控制阻抗本身,而是让机器人表现出一个虚拟的弹簧-阻尼系统的行为。

什么意思呢?我举个例子。你用手去推一面墙,墙不会躲,但你的手会感觉到反作用力。如果你推的是一个海绵,海绵会变形,你的手感觉到的力就小很多。阻抗控制就是让机器人像海绵一样——你推它,它就让;你推多狠,它让多少。

核心思想: 建立外力与位置偏差之间的动态关系。
M * (ẍ_d - ẍ) + B * (ẋ_d - ẋ) + K * (x_d - x) = F_ext

这个公式看着唬人,其实道理很简单:
M 是惯性(质量),B 是阻尼,K 是刚度。
你施加的外力 F_ext 越大,位置偏差 (x_d - x) 就越大。反过来,你把 K 设得很大,机器人就变得很“硬”,推不动。

我在项目中遇到过这样一个场景:用机器人给手机屏幕涂胶。胶枪需要贴着屏幕表面走,但屏幕本身有微小的起伏。如果用纯位置控制,胶枪要么压太紧把屏幕压碎,要么压太轻胶水涂不匀。后来我用了阻抗控制,把 Z 方向的刚度 K 设得很小,机器人就能顺着屏幕的起伏自动调整高度——既贴得住,又压不坏。

我的经验: 调阻抗参数时,先调刚度 K,再调阻尼 B。K 决定了“多大力能推多远”,B 决定了“推过去之后会不会来回晃”。惯性 M 一般保持默认,除非你遇到高频抖动。

4.2 导纳控制:反过来想

导纳控制和阻抗控制,其实是一对“孪生兄弟”。
阻抗控制:你给我位置偏差,我给你力。
导纳控制:你给我力,我给你位置偏差。

说白了,导纳控制就是用力的信号去修正位置指令。这在工业机器人上特别常见,因为大多数工业机器人的底层还是位置环,你没法直接给力矩指令。那怎么办?你测到外力,然后算出一个位置修正量,加到原来的轨迹上就行了。

我记得有一次做力控打磨,机器人末端装了一个六维力传感器。工件表面有毛刺,机器人走过去一碰,力突然变大。如果用阻抗控制,我得直接控制关节力矩,但当时的控制器不支持。后来我改用导纳控制——力传感器读到力大了,我就让机器人往后退一点点。效果一样好,而且实现起来简单得多。

// 导纳控制伪代码
while (running) {
    F_ext = readForceSensor();          // 读取外力
    dx = F_ext / K;                     // 计算位置修正量
    x_desired = x_trajectory + dx;      // 修正目标位置
    moveTo(x_desired);                  // 发送位置指令
}
注意: 导纳控制对力传感器的噪声很敏感。我曾经因为传感器滤波没做好,机器人一直在那里“哆嗦”。后来加了低通滤波,把截止频率设在 5-10 Hz,问题就解决了。

4.3 力位混合控制:各管各的

前面两种方法,都是在同一个方向上同时控制力和位置。但有些场景下,你希望在某些方向控力,在另一些方向控位。这就是力位混合控制。

举个例子:用机器人擦桌子。
- 在桌面的法线方向(Z 方向),你需要控制压力,不能太大把桌子压坏,也不能太小擦不干净。
- 在桌面的切线方向(X、Y 方向),你需要控制位置,沿着规划好的路径走。

力位混合控制的核心就是选择矩阵 S。S 是一个对角矩阵,对角线上的元素是 0 或 1:
- S = 1 表示这个方向用位置控制
- S = 0 表示这个方向用力控制

方向 S 值 控制模式 说明
X 1 位置控制 沿桌面水平移动
Y 1 位置控制 沿桌面水平移动
Z 0 力控制 保持恒定压力
Rx 0 力控制 保持力矩为零
Ry 0 力控制 保持力矩为零
Rz 1 位置控制 保持朝向不变

这样做的好处是解耦。你不用担心位置控制会干扰力控制,因为它们在正交的方向上各干各的。我当年做曲面抛光时,就是靠这个思路搞定的——沿着曲面法线控力,沿着切线控位,效果出奇地好。

避坑指南: 力位混合控制最怕的是“模式切换时的冲击”。我曾经在从位置模式切到力模式时,因为没做平滑过渡,机器人猛地抖了一下,把工件给磕了。后来我加了一个过渡时间,在 0.1 秒内把 S 矩阵从 1 渐变到 0,问题就解决了。

4.4 三种方法的对比与选择

说了这么多,到底该用哪一种?我个人的习惯是这样的:

  • 阻抗控制:适合需要连续接触的场景,比如打磨、抛光、擦玻璃。优点是响应快,缺点是需要力矩控制接口。
  • 导纳控制:适合底层只有位置环的工业机器人。实现简单,但力传感器噪声会影响精度。
  • 力位混合控制:适合任务方向明确的场景,比如装配、写字、曲面跟踪。解耦性好,但需要仔细设计选择矩阵。

你可能会问:能不能混着用?当然可以。我见过不少项目,在同一个任务的不同阶段切换控制模式。比如装配开始时用力位混合控制找正,插入过程中用阻抗控制柔顺,最后用导纳控制保压。灵活搭配才是王道。

笛卡尔空间力矩控制知识体系 笛卡尔空间力矩控制 阻抗控制 导纳控制 力位混合控制 核心:力-位置关系 M·ẍ + B·ẋ + K·x = F 适合:连续接触任务 需力矩控制接口 核心:力→位置修正 dx = F_ext / K 适合:工业机器人 需力传感器 核心:选择矩阵 S S=1 控位,S=0 控力 适合:方向明确任务 需设计过渡策略

嗯,关于笛卡尔空间力矩控制的三种方法,今天就聊到这儿。这三种方法没有的好坏,关键看你的机器人硬件、控制器能力、以及任务需求。我个人建议,先从导纳控制入手,因为它最容易在现有平台上实现。等你对力控有了感觉,再尝试阻抗控制和力位混合控制。

记住一句话:力控不是让机器人变“软”,而是让机器人变“聪明”。它知道什么时候该用力,什么时候该收力。这才是真正的智能。

可可精品资料库