李群与机器人视觉伺服

如本科技(RVBUST INC.)成立一年有余。我经常被问到,如本具体在做什么?

确实,这一年来,大部分时间都忙于核心模块与产品的技术研发,大家也就无从知晓我们在做什么了。

虽然现在的很多模块距离我们最终想做的产品还有很长的路要走,但是这一年在研发过程中也遇到了很多非常有趣的问题。所以我们之后将陆续在我们的微信公众号(ID:RVBUST)与知乎专栏(RVBUST)进行分享,希望能够与大家交流一下,同时也让大家了解如本在做什么,让更多志同道合的小伙伴加入如本。

前几天,李辉已经在知乎专栏里发布了第一篇序言。写得挺长、也挺好,但就是字太多了。

原本我的第一篇文章将会分享一些李群李代数的基础知识,但是连续两篇字太多的文章就会显得比较无趣。所以,我这篇改成了视频,先介绍一下李群李代数在机器人视觉伺服里的应用。

视觉伺服很多人应该都听说过,大概就是根据视觉的信号输入引导机械臂运动,可以认为是一个跟踪问题。

其实,机器人每个关节的运动也是在做伺服,控制关节角度跟踪轨迹的位置指令。

对于关节控制,我们通过轨迹插补获得目标角度 q_d ,用编码器获得关节当前角度 q_c ,整个系统的误差就是 e=(q_d-q_c)

得到误差后,我们就可以通过控制算法减小误差,让机械臂朝着规划的位置运动。最常用的控制算法就是 PID 了,所以,控制算法大概就是:

I=PID(q_d-q_c)

现在回到视觉伺服问题。我们能够通过标定好的视觉系统获取机器人工具在相机坐标系下的位置 T_c ,与完成机器人在相机坐标系下需要到达的目标位置 T_d

要实现视觉伺服,我们想到的自然就是计算两个位姿的误差,然后使用 PID 算法进行跟踪。

这就引出了我们今天要讨论的内容:如何计算两个刚体位姿之间的误差?

对于一个刚体位姿,我们经常将其分为位置 p 与姿态 R 两部分。

位置部分没有太多歧义,基本都是使用一个三维向量进行描述的 p=[x,y,z]^T 。但是,对于姿态部分,就有很多描述方式了,例如 3×3 旋转矩阵,四元数,欧拉角等等。

这主要是因为位置属于欧式空间,而姿态不属于欧式空间,而是一个李群 SO(3)。

简言之,对于两个位置, p_1=[x_1,y_1,z_1]^Tp_2=[x_2,y_2,z_2]^T ,从 p_1 运动到 p_2 的最短路径是一条直线:

p(λ) = (1-λ) \cdot p_1 + λ \cdot p_2 (0 \leq λ \leq 1)

对于姿态,不论是哪种描述方式,我们都不能用简单的向量加减法找到最短路径。就像是最短的飞机航线并不是两地经纬度相连获得的直线,而是一条曲线(测地线):

我们进行视觉伺服的时候,就是需要给控制器提供朝着目标姿态方向运动的最短测地线。

如果我们直接用欧拉角或者四元数各元素线性插值的方式,有可能会遇到机械臂跟踪控制器无法收敛的情况,甚至出现奇异点。

对此,我们就需要李群李代数了。一个刚体的位姿是属于一个 SE(3) 群的,我们在 SE(3) 群里很容易就可以计算两个位姿之间的测地线方向:

以姿态为例,姿态属于 SO(3) 空间。我们分别采用李群插值与欧拉角插值的方式显示从一个姿态运动到另一个姿态的过程:

(左)李群插值;(右)欧拉角插值

可以看出,李群插值的结果看起来似乎走的路程比欧拉角更短。

回到视觉伺服的问题,由于刚体位姿就是一个 SE(3) 李群,我们定义好李群内的加减法之后,就可以非常容易地使用 PID 完成视觉伺服任务:

I=PID(T_d-T_c)

RVBUST 内部,日常代码大概长下面这样:

有了这些东西,我们就可以非常简单地实现视觉伺服任务:

如果再加上精准的视觉与机器人控制,就可以完成更加有趣的任务了,例如穿针:

更完整的 demo 可以看我们的视频:

RVBUST:李群与机器人视觉伺服https://www.zhihu.com/video/1138505917258784768

来源:知乎 www.zhihu.com

作者:fly qq

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载