文章内容转载自知乎【邵天兰的回答】
===================================
0. 前言
===================================
我尽可能把事情说的通俗一些,所以内容并不会非常严谨。而且这个领域的术语很乱,Impedance control, stiffness control, admittance control, compliance control等等词汇在不同作者手中都有好多不同的意思。所以我只能保证用词尽可能自洽,阅读时请勿硬套名词。
讨论实现方法以前一定要先搞清楚动机和目的。因为实践中经常要做出各种妥协和Hack,如果目的不明确,很容易干出削足适履、南辕北辙的事情来。下面我先讨论动机,然后抽象出一个控制目标,最后再说实现方式。
===================================
1. 完美定位是不够的
===================================
机器人最传统、最常用的控制方式就是位置控制了。这里无需讨论任何实现细节,只需设想一个完美的位置控制机器人:它能够以0误差来到达指定的位置,或以0误差跟随指定的轨迹。
这样的机器人看起来叼炸天,然而考虑一个简单的任务——开门。
假设这个门是一个理想门:门板围着固定轴转动,门板末端的轨迹是一个完美的圆弧。门板重量为0,摩擦力为0,弹性为0。机器人紧紧地抓住门板的末端。
![](https://i-blog.csdnimg.cn/blog_migrate/9da901e352a0ed2313becd8d2e8ac553.png)
很明显,由于门板没有重量也没有摩擦,机器人甚至 无需对门施加任何力,只要沿着图中的圆弧运动,就可以把门打开。当一个完美的机器人,遇到一个完美的门,so simple! what could possibly go wrong?
![](https://i-blog.csdnimg.cn/blog_migrate/c448abadafeaf6e645b002c518be2652.jpeg)
然而,实践中机器人和门的相对位置几乎不可能极为精确的确定,如下图所示。机器人的实际路线与理想的圆弧会有微小的误差。
![](https://i-blog.csdnimg.cn/blog_migrate/1471af26938d20af16da929e65e21183.png)
但是门的末端不可能偏离圆弧运动,而机器人末端又紧紧的抓住了门。。。于是, 要么门被拽掉,要么机器臂被扯断。不给力啊老师!
===================================
2.柔性是环境互动的好朋友
===================================
前述完美机器人解决不了的事情,一根破弹簧就能搞定。。。如下图,让机器人通过一个弹簧和门相连。可以想象,机器人开门时,误差只会导致弹簧伸长,不会把门扯掉了。当然还需要一点摩擦力来避免弹簧无限振荡。)
![](https://i-blog.csdnimg.cn/blog_migrate/4bfc89bd4ced36e18447f0619e714597.png)
再举一例,让前述完美定位机器人 用无限硬的刀在无限硬的桌子上切薄纸也很难:因为一点点误差就会导致要么切不到纸,要么把刀弄折,要么把桌子切坏。但是用厚海绵擦桌子就很容易:误差只会导致海绵变形一点而已。从这些例子中可以看出, 当机器人和外物有直接接触时,一定的柔性是你的好朋友。It’s all about interaction.
*注意下面的方法不是显式力控制(Explicit Force Control). 显式力控制是另外好大一滩事,另说吧。
===================================
3.系统控制目标
===================================
但是机器人不能总是有弹簧相助,而且弹簧的刚度(stiffness)不能按需调节,也很难做到各向异性(在不同方向上有不同的刚度)。所以希望能用控制算法让机器臂表现出想要的柔性。也就是下图中虚线框中的系统,实际上是由控制算法实现的。
![](https://i-blog.csdnimg.cn/blog_migrate/543cc2068d3fbe6c38b6bcbacd57f51b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e1809853387c5adbfffae01edf62d4cd.png)
===================================
4.实现目标的不同路线
===================================
用公式描述一下这个系统的表现:
![M\ddot{x} + b\dot{x} + kx = F + F_{ext}](https://i-blog.csdnimg.cn/blog_migrate/406b2a001d267ca2b6f9b55500f5a420.png)
注意,这个公式有两种解读方式:
其实这就是胡克定律F = kx的两种解读:既可以说弹簧是因为形变而产生力,也可以说弹簧是因为产生力(注意这里不是外力,是弹簧自己产生的力)而形变。后一种解读可能直观上感觉有点奇怪,但数学上两种说法没有对错之分。毕竟胡克定律只是确定了F和x间的线性关系,并没有因果上的意义。
两种解读方式,分别对应两种实现方法:
1. 测量当前位置和目标位置的差,调整末端产生的力(一般通过调整各关节力矩实现)。这种通常称为impedance control或stiffness control.
2. 测量末端受到的力,调整末端的速度。这种常称为admittance control.
(下面一段烧脑预警)
在第一种方法中,可以认为机器人本身是一个Admittance(输入是力矩,输出是运动),而控制器是一个Impedance(输入是位置,输出是力矩)。在第二种方法中,机器人本身是Impedance (输入是速度,输出是对外的力),而控制器是Admittance(输入是外力,输出是运动)。其实这是必然的,因为admittance和impedance需要相间出现。
两种方法各有利弊。
第一种方法与环境接触时稳定性好,但是无接触时对位置实际上是开环的,因此对于建模的要求比较高。如果建模误差大,则位置的精度会受影响。
第二种方法无接触时位置精度比较高,但是当机器人本身刚性很大又与刚性环境接触时,系统容易不稳定。
![](https://i-blog.csdnimg.cn/blog_migrate/b818aeeeeca544f5459e119ec03ae05b.png)
===================================
5.其他选择
===================================
此外,上面提到的Mass–Spring-Damper系统中有M, b, k三个参数。一般而言,k对任务的影响很大,因此绝大多数柔顺控制的算法都可以调节k,而且一般可为不同的方向设定不同的k值。而M则不同:对于轻型机器臂来说,M在奇异点以外的地方一般不会太大,而且对大部分任务来说也并不本质。因此大部分实现中M是不能调节的(without inertia shaping)。
上面提到的都是在笛卡尔空间中的柔顺控制,当然柔顺控制也可以定义在关节空间。
一些机器人每个关节上都装备有力矩传感器(如iiwa),或使用电流来估计电机上带的力矩。在这些情况下,可以直接实现关节空间的柔顺控制。而且外力可以直接作用在机器臂上,而不仅仅限制在末端上。这在拖动示教时很方便,特别是对于7轴冗余机器人(否则肘部不容易控制)。
因为上述方法不属于Explicit Force Control,所以并不能直接调整对外界环境施加的力。例如在前述刀切纸的例子里,如果用Impedance control而且希望精确控制刀对纸面施加的力,那么需要在impedance control外面再套一层环,通过调节平衡点(可以理解为弹簧的0力点)的位置来控制力的大小。
===================================
6. 总结
===================================
总之,柔顺控制根据测量量、反馈量、可调节参数、定义空间等等不同,有很多很多的实现方式。具体选用哪个要根据需求和硬件调节决定。但万变不离其宗,柔顺控制就是让机器人能够跟环境和人更平顺的交互。