1.4 偏移与旋转
1.4.1 基于Offs的偏移及实现原理
对于点位(Robtarget)的偏移,ABB工业机器人编程提供了Offs( p 1 , x 1 , y 1 , z 1 )函数,返回值为基于 p 1 点位,在pos数据中的 x 、 y 、 z 三个方向上叠加 x 1 、 y 1 和 z 1 。该函数不改变原有 p 1 的点位。例如,可以有以下用法,即机器人走到“p3000”沿着wobj2坐标系的 z 方向偏移100的位置:

对于存储类型不是CONST的点位数据,也可采用Offs函数赋值。例如:

在示教器中插入Offs函数赋值时,确认被赋值数据的存储类型不能是CONST。可以通过“程序数据”编辑器,选择对应点位数据,单击“编辑”—“更改声明”(见图1-48),修改对应点位的存储类型(见图1-49)。

图1-48 在“程序数据”中更改声明

图1-49 修改对应点位的存储类型
Offs函数本质上就是在Robtarget数值的 x 、 y 、 z 基础上增加对应差量并返回,可以自行编写函数如下,同样实现Offs函数功能:

ABB工业机器人只提供了基于Robtarget类型的偏移函数,没有提供基于Jointtarget类型的偏移函数。以下代码示例可以实现让机器人基于某个点位的1~6轴数据偏移一定的角度:

1.4.2 基于工件坐标系的批量偏移
假设已经有如图1-50(a)所示的工件坐标系workobject_1(定义了其中的uframe,oframe数值为0)。在workobject_1坐标系下示教了点p3000并利用Offs函数完成了基于p3000的一个方形轨迹。现在希望沿着workobject_1工件坐标系的 y 方向,整体偏移该方形轨迹,可以借助工件坐标系赋值。
创建一个临时工件坐标系wobj2,令其初值等于workobject_1。由于轨迹需要在workobject_1下偏移且原始oframe为0,则可以直接对新的wobj2的oframe的 y 赋值,如100。此时运行完第二个方形图形时,wobj2的位置如图1-50(b)所示。具体实现如下:

图1-50 基于工件坐标系的批量偏移

对于没有创建工件坐标系的轨迹(实质使用wobj0),如果偏移的方向与wobj0平行,也可创建一个临时坐标系等于wobj0,并对坐标系进行赋值。例如:

1.4.3 RelTool及实现原理
对于点位(Robtarget)数据沿着工具(Tooldata)方向偏移和旋转,ABB工业机器人编程提供了RelTool( p 1 , x 1 , y 1 , z 1 \Rx:=rx1\Ry:=ry1\Rz:=rz1)函数,即返回值基于 p 1 点位,沿着 p 1 姿态的 x 、 y 、 z 三方向偏移 x 1 、 y 1 和 z 1 ,同时可以绕 p 1 的姿态方向旋转。若同时使用可选参数Rx、Ry和Rz,旋转顺序为绕着 x 轴旋转,绕着新的 y 轴旋转、绕着新的 z 轴旋转(与标准欧拉角 z-y-x 的旋转顺序相反)。
例如,机器人走到原始点位p3002(使用MyTool2工具示教),然后需要沿着MyTool2的 z 方向前进300mm,同时绕着p3002原始姿态的 z 方向旋转45°,可以使用如下代码:

效果如图1-51所示。

图1-51 RelTool使用示例
同样,对于存储类型不是CONST的Robtarget类型的数据,也可使用RelTool函数赋值。例如:

对于RelTool( p 1 , x 1 , y 1 , z 1 \Rx:=rx1\Ry:=ry1\Rz:=rz1)函数,实质就是已知在 p 1 位姿坐标系下的偏移数据 x 1 、 y 1 和 z 1 ,以及绕着 p 1 位姿坐标系下旋转的角度rx1、ry1和rz1(注:RelTool函数中的旋转顺序为 x-y-z ),将这个新的位置转化到 p 0 坐标系下,如图1-52所示。所以,RelTool的实现本质就是使用1.1.4节提到的PoseMult函数。但要注意,PoseMult函数中的欧拉角顺序为 z-y-x ,所以如果要自行编写RelTool的实现,需要将PoseMult略做修改:

图1-52 RelTool坐标系转化示例

1.4.4 左乘与右乘
由1.1.1节所知,机器人的姿态数据可以由3×3的旋转矩阵表示,位姿可由4×4的齐次矩阵表示。矩阵的乘法不满足交换律,即矩阵 A × B 通常不等于 B × A 。
由1.1.4小节所知,姿态数据 A 右乘一个姿态数据 B 得到新的姿态 C ( C = A × B ),相当于姿态 A 绕着自身旋转了姿态 B 得到新姿态数据 C ,参考坐标系为姿态 A ,如图1-53所示。
而姿态数据 A 左乘一个姿态数据 B 得到新的姿态 C ( C = B × A ),相当于姿态 A 绕着姿态 A 参考的坐标系方向( w 0 )旋转了姿态 B 得到新姿态数据 C ,参考坐标系为姿态 w 0 ,如图1-54所示。

图1-53 姿态数据的右乘

图1-54 姿态数据的左乘
使用工具MyTool,在工件坐标系workobject_1下记录原始点位p3000[见图1-55(a)]。使用姿态数据右乘相当于使用了RelTool(p3000,0,0,0\Rx:=rx\Ry:=ry\Rz:=rz)的效果(注:RelTool的旋转顺序为 x-y-z ),即绕原有点位p3000的姿态旋转。执行以下代码,机器人最终的姿态如图1-55(b)所示。


图1-55 姿态数据的右乘
使用姿态左乘,相当于把workobject_1的原点平移到p3000位置( x-y-z ),p3000的姿态绕着平移到p3000后的workobject_1的姿态旋转。执行以下代码,机器人最终的姿态如图1-56(b)所示。



图1-56 姿态数据的左乘
机器人当前的TCP如图1-57(a)所示,此时TCP的 z 方向沿着抓手方向(与工件产品平行),TCP的 x 方向垂直于工件产品表面。
通过外设(激光测距等设备),可得知当前工件设备绕自身旋转了一定角度(如10°),如图1-57(b)所示。

图1-57 机器人当前的TCP和工件设备绕自身旋转一定角度
希望机器人能调整自身姿态,使得抓手与旋转10°后的产品平行,并沿着产品方向前进100mm。此时即可使用姿态的左乘调整姿态(令图1-58中原始位姿的tx、ty、tz绕着与Base坐标系平行的一个坐标系的 z 轴旋转10°),再使用RelTool沿着工具方向前进,具体实现如以下代码所示。

图1-58 机器人的原始位姿

综上,可以编写如下基于工具/工件坐标系的偏移和旋转函数:

若选择参考tool,则实现方式采用RAPID标准的RelTool指令;若选择参考wobj,则先沿着wobj平移,再绕着wobj的姿态方向旋转,使用参考wobj,效果同在示教器中使用重定位,参考坐标系为“工件坐标系”,如图1-59所示。

图1-59 重定位参考坐标系为工件坐标系
同理,在使用PoseMult函数时也存在左乘与右乘的区别。右乘为绕着当前坐标系先平移后旋转(如图1-60所示,位姿 A 先沿着坐标系 A 平移到 A ′ ,再绕着 A ′ 旋转得到位姿 C ,即 C = A × B )。PoseMult左乘则为位姿 A 绕着参考的固定坐标系(位姿 w 0 )的原点先旋转位姿 B 中的姿态数据,再沿着原有参考坐标系( w 0 )平移位姿数据 B 中的位置部分,得到新位姿 C ( C = B × A ),如图1-61所示。

图1-60 位姿数据的右乘

图1-61 位姿数据的左乘
使用工具MyTool,在工件坐标系workobject_1下记录原始点位p3000[见图1-62(a)]。使用p3000中的位姿数据右乘位姿数据pose1([[30,0,0],OrientZYX(45,0,0)]),即先沿着p3000原始姿态的 x 方向平移30,得到图1-63中的 x 1 、 y 1 、 z 1 ,再绕 x 1 、 y 1 、 z 1 的 z 轴旋转45°得到 x 2 、 y 2 、 z 2 。执行以下代码,机器人最终的姿态如图1-62(b)所示。


图1-62 位姿数据的右乘

图1-63 位姿数据的右乘
使用工具MyTool,在工件坐标系workobject_1下记录原始点位p3000[见图1-64(a)]。使用p3000中的位姿数据左乘位姿数据pose1([[30,0,0],OrientZYX(90,0,0)]),即p3000绕着参考坐标系workobject1的原点的 z 轴旋转90°,得到图1-65中的位姿1,再将位姿1沿着workobject1的 x 方向平移30得到图1-65中的位姿2,即最终位姿。执行以下代码,机器人最终的姿态如图1-64(b)所示。


图1-64 位姿数据的左乘

图1-65 位姿数据的左乘