前言:

  • 机械臂的阻抗控制、导纳控制是属于对机器人进行间接力控的范围

  • 既然你找到了阻抗控制,那你就是不满足于对机器人进行简单的位置控制了

  • 所以第一篇就是入门篇,只讲这个阻抗控制思路是怎么来的,希望看了之后就懂了内核

后面章节安排

  1. 补全机械臂力控的体系

    1. 阻抗控制是力控中的一种,接下来会把这个机械臂力控的体系补全,让你看到阻抗控制在其中的位置

  2. 将阻抗控制应用到6轴机器人

    1. 第一章讲清楚阻抗控制思想源泉,但毕竟不是直接应用在6轴机器人上

    2. 用在六轴机器人上会相对比较复杂一些,所以在simulink里面还需要一个仿真


会持续分享一些机器人相关的知识,欢迎关注知乎Winter


重点

  • 之前看别人的阻抗控制的文章,看得迷迷糊糊。最重要的一点就是他把阻抗控制和传统的控制观念混为一谈。也许你在了解阻抗控制的时候就会很奇怪,不论是经典控制还是现代控制,里面都没有这个概念。因为他本来就不是一个东西。

  • 阻抗控制是应用在机械臂上面。他给出的是一个目标,就是说你应该按照这个方法进行。如果你真的按照这个方法进行了,那么你就可以达到类似于一个阻尼弹簧系统的作用。而我们平常所说的控制的概念,是具体在驱动器上设计一个控制律,或者说PID等来实现这个方法。

  • 阻抗控制----->告诉你应该这样

  • 广义控制----->应该怎样设计控制律来达到上面所说的效果

正文

阻抗控制的抽象示意

这个控制是用在机器人执行某一个任务过程中。就是说他是在运动着的。在这个过程中,如果他不小心碰到了一个物体。比如说是你的手。如果你想让他表现的是一个软绵绵的弹簧的话。如果这个机械臂撞到了你的手臂。那么它就会像一个弹簧一样弹开。如果你想让他表现是一个很硬的弹簧。那么你的手臂对他来说就是个障碍,它就会像一个很硬的弹簧一样按照它的轨迹继续运行。

我们接下来拿一个物块,举一个这个例子,就把他当做机器人的一个关节,然后他再向右运动。

仔细看下面这张图,然后搞清楚每个图中的每个因素各对应着什么?我们之前看不懂,阻焊控制就是概念很模棱两可,比如说你想要像弹簧,那么弹簧在哪儿它起点是哪终点又是哪?如果你看懂了这张图,那么阻抗控制的控制,你自己就可以写出来。

这里我想让这个机器人物块儿移动到右边红旗的位置那里。到了之后直接停下来,速度为0。红色的实线是实际真正存在的东西。而我用绿色表示的就是你希望他表现出来的弹簧阻尼系统。

这里还没有涉及到与环境接触力的问题。我们就先简单分析这个场景。如果你希望。你的机器人系统所表现出来很大的刚度。也就是这里的弹簧k很大。那么在机器人物块距离期望目标位置一定的情况下。弹簧产生的拉力就非常大。那么他的速度必然就很快。

K : 所以这里的目标就出现了。如果这个物块跑得很快。那么你就会觉得确实这个弹簧的刚度很大。就是位置变化很快

B:如果你希望这个系统的阻尼很大,那么他表现的情况就是很缓慢。那么你就要让这个物体的速度变化很慢。

M:如果你想让这个物体的质量。很大。那么它所表现出来的特性就是它的加速度不容易改变。

加上与环境的交互力

也许这里加上力之后,会让你理解更加直观一点。在这个物块执行他任务的过程中,也就是移动到预期位置的时候。你的手不小心碰到了他。就在你手的位置接触到的那一刻。如果你希望这个木块它的刚度又大,质量也大。那么你就要控制这个物块,对你的手输出一个很大的力。

这个就是:基于力的阻抗控制,控制目标是力的大小(你可以自主采用各种方法实现)

换一种思路。你的手在不同的位置触碰到物块的时候,感受到的是相同的力。那么你在偏左边的时候。你就会觉得这个物块这个系统的刚度很小。如果你是在右边感受到同样的力,那么你就会觉得这个的刚度很大。

这个就是:基于位置的阻抗控制,(让用户感受相同力下)控制目标是位置(你也可以自主采用各种方法实现)

应用:打磨机的例子

本来要理想的打薄,但是锈迹太厚,产生力,我想要这个机器人表现很强硬,K很大,那么目前位置和实际位置有一个差值,这个是运动,那我理想阻抗特性K很大,那么我产生一个很大的力(控制目标),就是打磨力这才符合我的特性,所以里面就有一个力控制,

如果是另一种,传感器是接触力传感器,我同样要K很大,那我这个机器人系统怎么表现很刚,K很大,在这个力传感器测的一定值,那么位移差就越小,那这个机器人就越要接近目标位置(控制目标),尽管障碍物拦着,我还是要拼命去压它,让它感受我的K很大

最核心:控制目标的导出

这里我们采用第二种(控制目标是位置的)

注意:这里都是你想要的(K、B、M),所以才会得出你想要的a(或者说x(位置))

e = qr - x(1, i-1);     % 位置误差
de = -x(2, i-1);        % 速度误差 
a=M\(K*e+B*de-fe);

那都得出你想要的a,算x不是很简单?

x(2,i) = x(2,i-1) + a*0.01;    %速度x(1,i) = x(1,i-1) + x(2,i)*0.01; %位置

MATLAB程序仿真

机器人任务:这个物块要靠近期望的位置

情景一、

  • 没有人手干扰它(没有接触力)

  • 没有阻尼

  • qr = 5; % 期望位置

  • x0 = [0; 0]; % 初始位置和速度

  • K = 10; % 位置控制增益

    M = 5; % 质量控制增益
    B = 2; % 阻尼控制增益

这个物体是不是很像弹簧(没有阻尼)

情景二、

  • 没有人手干扰它(没有接触力)

  • 有阻尼

  • qr = 5; % 期望位置

  • x0 = [0; 0]; % 初始位置和速度

  • K = 10; % 位置控制增益

    M = 5; % 质量控制增益
    B = 2; % 阻尼控制增益

它的行为就像是有阻尼的弹簧

情景三、

  • 有人手干扰它(有接触力)fe = 10; % 参考力/力矩

  • 有阻尼

  • qr = 5; % 期望位置

  • x0 = [0; 0]; % 初始位置和速度

  • K = 10; % 位置控制增益

    M = 5; % 质量控制增益
    B = 2; % 阻尼控制增益

你可以看到,它的弹簧刚度是10,力也是10,正好位置就停靠在(5-4)=1差1,就像是你的手对弹簧施加力之后弹簧停在那里。

情景推广

这是在古月居看到的一个代码,暂时找不到链接了,找到挂上来

你可能觉得移动的固定位置太简单,想要追踪变化的,这里以sin函数为例(你直接想象那个弹簧的右边连接点一直sin移动就行)

你可能会觉得,这个蓝色的曲线这也太差了,我随便一个PID瞎调节都可以比它跟踪的好

重点:时刻区分控制目标和实际控制区别,这里的蓝色曲线看起来很差,但是我们目标并不是是要追踪sin曲线,我们的目标是在追踪sin的过程中像是一个弹簧阻尼系统在追踪

所以你接下来还是费心思设计控制器去追踪这个看起来很垃圾的蓝色曲线,这个具体你想用什么方法就不属于阻尼控制范围了,我只是告诉你你应该这么办

码字不易,多多点赞,关注Winter,后续将这个推广到6关节机器人,然后用simulink仿真

参考文献

力控机器人(触觉感知)阻抗控制性能(performance specifications)与MATLAB程序实现 - 古月居

干货 | 机械臂控制第2篇:单关节阻抗控制