李 伟,刘 忠,熊中刚,李源周,陈 忠
(1.长沙市电子工业学校,湖南 长沙 410205;2.桂林航天工业学院机电工程学院,广西 桂林 541004;3.桂林电子科技大学机电工程学院,广西 桂林 541004;4.桂林理工大学机械与控制工程学院,广西 桂林 541004)
对机器人在自动化生产线上的点位示教及欧拉角变换的研究已有相关报道。李福武等[1]利用Robot-Studio 仿真软件对码垛机器人作业仿真分析,论证了工业机器人码垛作业的可行性,提高了识别效率,未对环形陈列产品的点位进行研究。朱程广等[2-3]对欧拉角到四元数转化展开了研究,欧拉角角度的变化范围广和精度高的特点。韩华[4]为了提高企业自动化生产线的生产效率,利用RobotStudio 仿真软件对生产线进行虚拟设计及论证,验证系统的可行性,减少产品调试时间。王阳等人[5]针对工人在线分拣误差率大、时间成本高和工作效率低等问题,结合RobotStudio 仿真分析和实验验证了机器视觉的工业机器人自动分拣设备的可行性。
在企业生产中常会遇到不同大小、不同产品个数环形阵列产品的机器人点位进行示教,用传统方法对环形阵列中每个产品进行手动点位示教,工作量大,示教点位精度不高及效率低。针对以上问题,分析环形阵列异形产品如何在机器人点位示教安装调试过程中,减少机器人的点位示教数量,提高机器人调试效率和加工精度。通过创建参考工件坐标系和参考点位,采用欧拉角运算方法,将工件坐标方位的四元数转换成欧拉角,方便对工件坐标进行固定角度的旋转,再通过编程获取旋转后参考工件坐标系下的机器人点位,经过RobotStudio 仿真软件进行仿真模拟,减少机器人的点位示教量、提高机器人调试效率和加工精度。
环形阵列异形产品点位计算原理的实质是工件坐标的综合应用,在进行点位处理时,首先在环形阵列产品圆心处定义一个工件坐标wobj1 作为环形阵列点位处理的参考坐标,并示教环形阵列中任意一个产品在基坐标wobj0 及指定工具坐标系下的机器人位置作为环形阵列点位处理的基点,通过编程将示教的基点转换到参考工件坐标及相应工具下,作为后续的点位获取的参考点,再通过编程将参考坐标系wobj1 表示角度的四元数,转换成欧拉角,方便对参考坐标系的旋转。获得了参考坐标系wobj1 的欧拉角后,就可以根据环形阵列的个数,对参考坐标系旋转一固定的角度,并获取参考坐标系wobj1 旋转后的工件坐标系及相应工具下的机器人点位,最后再将获取的点位转换到基坐标wobj0 及指定工具坐标系下,并将该点位保存,重复上面旋转参考坐标及获取点位及转换点位的步骤,直到将环形阵列的点位全部获取。
为了更好地对环形阵列异形产品点位处理进行理解,通过图1 所示六个异形元件环形阵列来说明环形阵列点位处理的原理。
图1 环形阵列元件布局图
先建立一个robtarget 一维数组dw,大小根据环形阵列的个数来确定,用来存储环形阵列的机器人点位数据如图2(a)所示。接下来在环形阵列的圆心yd处定义一个工件坐标wobj1 作为环形阵列点位处理的参考坐标系如图2(b)所示,并示教在基坐标wobj0及工具xp(此例中机器人工具全为xp 工具)下的dw{1},作为环形阵列点位处理的基点。并通过编程将dw{1} 数据转换至工件坐标wobj1 及工具坐标xp 下,并保存在点位数据rdw 中,作为后续环形阵列点位获取的参考点。再通过编程,将表示wobj1 姿态的四元数转换为欧拉角度,方便wobj1 进行固定角度的旋转。准备工作全部做好后,就可以对参考工作坐标wobj1进行旋转了,旋转的角度根据环形阵列的元器件个数来确定。旋转后的工件坐标wobj1、如图2(c)所示,通过编程获取机器人在工件坐标wobj1 及工具坐标xp下的机器人位置,并将该点位转换至wobj0 及工具坐标xp 下的点位数据,并保存至数组dw 的第二个存储区dw{2}中,其它环形阵列点位按dw{2}数据获取步骤获取即可。
图2 环形阵列点位处理原理说明图
环形阵列异形产品点位处理的实质是工件坐标的灵活应用,参考工件坐标及参考点位的可靠定义决定了环形阵列中其他元件的机器人点位的精度,如何保证参考工件坐标及参考点位的精度和可靠性,是环形阵列产品点位处理的基础。
2.1.1 参考工件坐标系创建
工件坐标系的综合应用是解决环形阵列异形产品点位计算的基础。在创建参考工件坐标时,首先示教环形阵列的圆心yd,作为参考工件坐标的原点,如图3 所示。再在yd的基础上往x轴方向偏移一固定值,此处设为100 mm,作为参考工件坐标的x轴上的点xdw。最后在yd的基础上往y轴方向偏移一固定值100 mm,作为参考工件坐标的y轴方向的点ydw。点位的获取通过offs 偏移功能来实现,具体的编程如下:
图3 参考工作坐标定义示意图
proc js()
xdw=offs(yd,100,0,0);!在yd 点的基础上往x 轴方向移动100mm
ydw=offs(yd,0,100,0); !在yd 点的基础上往y轴方向移动100mm
end proc
参考工件坐标创建所需的三个点yd,xdw,ydw 确定好后,通过指令DefFrame 就可以创建参考工件坐标了,DefFrame(Define Frame)指令用于计算一个坐标系,并从三个位置来定义该坐标系,该三个位置分别为新坐标系的原点,x轴上的点和定义坐标系的xy平面y方向的点位。参考工件坐标wobj1 的定义的具体编程步骤为:
proc js()
xdw=offs(yd,100,0,0);!获取参考工件坐标的x轴上的点位
ydw=offs(yd,0,100,0);!获取参考工件坐标的y方向的点位
wobj1.uframe:=DefFrame (yd,xdw,ydw);!通过DefFrame 指令定义参考坐标系wobj1
end proc
2.1.2 参考点位创建
参考工件坐标wobj1 确定后,要获取在工件坐标wobj1 及相应工具坐标(工具坐标为xp)下的机器人位置数据,作为其他点位获取的参考点,首先示教在基坐标wobj0 及xp 工具坐标系下的dw{1},作为环形阵列点位处理的基点,再通过CalcJointT 指令获取在wobj0 及xp 工具坐标系下的机器人接头位置数据jdw(jointtarget 数据类型),再通过CalcRobT 指令获取参考工件坐标wobj1 及xp 工具坐标系下的机器人点位rdw(robtarget 数据类型),作为环形阵列中其它工件点位的参考点位,具体的编程操作如下所示:
proc js()
xdw=offs(yd,100,0,0); !获取参考工件坐标的x轴上的点位
ydw=offs(yd,0,100,0); !获取参考工件坐标的y方向的点位
wobj1.uframe:=DefFrame(yd,xdw,ydw);!计算出参考坐标系wobj1
jdw:=CalcJointT(dw{ 1},xpwobj:=wobj0);! 获取dw{1}在wobj0 及xp 工具坐标系下的机器人接头位置数据
rdw:=CalcRobT(jwz,xpwobj:=wobj1);!获取机器人接头位置数据jdw 在wobj0 及xp 工具坐标系下的机器人位置数据,作为环形阵列点位处理的参考点位
end proc
2.2.1 工件坐标旋转原理
ABB 工业机器人的工件坐标系的姿态是以四元数的形式来描述的,该四元数包括四个组成部分:q0、q1、q2和q3。通过用于描述坐标系各轴相对于参考系统方向的旋转矩阵,描述坐标系的姿态如图4 所示。
图4 坐标系各轴相对于参考系统方向的旋转矩阵示意图
旋转后的坐标系轴(x,y,z)为矢量,其可以用参考坐标系表示:
由式(1)可知,参考坐标系中x矢量的x轴向分量将为x1,y轴向分量将为x2,z轴向分量将为x3,以此类推。这三个矢量可在一个矩阵(旋转矩阵)组合,各矢量由此构成一栏:
四元数仅仅是一种描述此旋转矩阵的更为简洁的方式,根据旋转矩阵的各元素,计算四元数的计算式:
使用四元数的形式来改变工件坐标的姿态很不方便,如果可以用坐标轴的欧拉角分量来表示,就很容易进行角度的旋转,四元数与欧拉角转换的算式为:式(4)所示,绕固定坐标系的X-Y-Z轴旋转角度依次为α,β,γ角。
2.2.2 工件坐标旋转
在ABB 机器人中使用EulerZYX 指令,能够很方便将工件坐标系表示姿态的四元数转换成各轴欧拉角分量,获取了各轴欧拉角分量后,就可根据环形阵列元器件的阵列个数对参考坐标系进行绕某根轴进行固定角度旋转了,改变了相应轴的旋转角度后,需要在旋转后的参考坐标系处建立一个新的坐标系,要将欧拉角表示坐标轴的姿态转变成四元数来表示工件坐标姿态,用OrientZYX 指令来实现。具体的编程操作步骤如下:
proc gj()
rx:=EulerZYX(X,wobj1.uframe.rot);!获取wobj1的x 轴欧拉角分量
ry:=EulerZYX(Y,wobj1.uframe.rot);!获取wobj1的y 轴欧拉角分量
rz:=EulerZYX(,wobj1.uframe.rot);!获取wobj1的z 轴欧拉角分量
rz:=rz-(360/6);!改变z 轴方向的旋转角度,+/-号可以改变坐标旋转方向。
wobj1.uframe.rot:=OrientZYX (rz,ry,rx);!通过OrientZYX 指令重新定义工件坐标wobj1,使wobj1 绕Z 轴旋转60°。
endproc
通过将工件坐标的姿态转换为欧拉角表示,能够很方便对工件坐标姿态进行绕某根轴进行固定角度的旋转,获取环形阵列点位处理所需新工件坐标,先通过CalcJointT 指令获取在变换后工件坐标wobj1 及xp 工具坐标系下的机器人关节位置jdw(jointtarget 数据类型),再通过CalcRobT 指令获取wobj0 及xp 工具坐标系下的机器人点位(robtarget 数据类型),并将机器人点位保存至相应存储点位数组dw 中,即可获取相应角度下的机器人点位数据。其它环形阵列的点位获取步骤和方法都是一至的,可以用有限次循环指令for 来实现。具体的编程步骤如下:
!*点位获取的具体步骤例行程序,采用带参数例行程序来实现,ksd 为环形阵列点位存储的起始点,zls 为环形阵列的元器件个数*
proc js(num ksd,num zls)
FOR i FROM ksd+1 TO ksd+zls-1 DO
rx:=EulerZYX(X,wobj1.uframe.rot);!获取wobj1的x 轴欧拉角分量
ry:=EulerZYX(Y,wobj1.uframe.rot);! 获取wobj1的y 轴欧拉角分量
rz:=EulerZYX(,wobj1.uframe.rot);! 获取wobj1的z 轴欧拉角分量
rz:=rz-(360/zls);!参考坐标绕Z 轴旋转固定角度,+/-角度改变旋转方向
wobj1.uframe.rot:=OrientZYX(rz,ry,rx);!通过欧拉角旋转后,重新定义旋转后的工件坐标
jwz:=CalcJointT(rdw,xpwobj:=wobj1);!获取在工具坐标xp,旋转后的工件坐标wobj1 下的rdw 参考点位的机器人关节位置
dw{i}:=Calcrobt(jwz,xpwobj:=wobj0);!将机器人处在工具坐标xp,新工件坐标wobj1 下的机器人关节位置,转换为在工具坐标xp,工件坐标wobj0 下的机器人位置,并存储在数组dw 相应的存储区。
ENDFOR
endproc
通过上面的环形阵列点位获取步骤,理论上仅需要示教两个点,就可以将环形阵列的所有点位通过计算得出,为了对点位处理结果的可行性进行验证,在robotstudio 仿真软件中,搭建如图5 所示的工作站,通过smart 组件创建一个吸盘工具和一条异形元件传送带。在工作站中通过传送带将异形元件源源不断的送到指定位置,再通过机器人将元件安装到环形阵列的安放位置。将编写好的程序导入到示教器中,首先示教环形阵列的中心点yd,创建参考工件坐标wobj1,再在xp 工具和工件坐标wobj0 下示教第一个元件的安装点位,作为环形阵列点位处理的基点,运行程序,通过对异形产品环形阵列点位的计算处理,将环形阵列的机器人点位记录下来,在接下来的仿真过程中机器人能按环形阵列点位计算得出的点位,将传送带传过来的元件,精确的安装到环形阵中各元件安装位置。仿真程序主要由主程序、环形阵列点位计算例行程序及元器件装配例行程序组成。环形阵列点位计算例行程序主要负责对环形阵列点位的计算处理,元器件装配例行程序根据环形阵列点位计算例行程序计算得出的点位对元器件进行安装,主程序中对机器人的操作顺序进行调用,具体的仿真操作程序如下:
图5 robotstuio 中搭建的仿真工作站
module lianxi
proc main()
moveabsj home,v500,z0,xp;!程序启动前回home 点,确保安全
js 1,6;!调用环形阵列点位处理程序,启始存储位置为1,环形阵列的产品个数为6
PulseDOPLength:=0.1,object_control;!启动异形元件传送带
zp 1,6;!调用异形元件装配例行程序
moveabsj home,v500,z0,xp;!元件装配完成,机器人回home 点位
endproc
!**环形阵列点位处理例行程序,采用带参数例行程序来实现**
PROC js(num ksd,num zls)
xdw:=Offs(yd,100,0,0); ! 在yd 点的基础上往x轴方向移动100mm.
ydw:=Offs(yd,0,100,0); ! 在yd 点的基础上往y轴方向移动100mm.
wobj1.uframe:=DefFrame(yd,xdw,ydw); !创建参考坐标wobj1
jdw:=CalcJointT(dw{ksd},xpwobj:=wobj0); !获取基点位的关节位置
rdw:=CalcRobT(jdw,xpwobj:=wobj1);!获取旋转参考点位
FOR i FROM ksd+1 TO ksd+jsd-1 DO !循环对环形阵列点位获取
rx:=EulerZYX(X,wobj1.uframe.rot);!获取wobj1的x 轴欧拉分量
ry:=EulerZYX(Y,wobj1.uframe.rot);!获取wobj1的y 轴欧拉分量
rz:=EulerZYX(,wobj1.uframe.rot);!获取wobj1的z 轴欧拉分量
rz:=rz-(360/zls); ! 绕z 轴旋转固定角度
wobj1.uframe.rot:=OrientZYX(rz,ry,rx);!创建旋转后的新工件坐标
jdw:=CalcJointT(rdw,xpwobj:=wobj1);!旋转后参考点位的关节位置
dw{i}:=Calcrobt(jdw,xpwobj:=wobj0);!旋转后机器人安装点位获取
ENDFOR
ENDPROC
!**环形阵列异形产品装配例行程序**
proc zp(num ksd,num zls)
for num1 from ksd to ksd+zls-1 do !环形阵列产品装配次数
movej offs(sqd,0,0,50),v400,fine,xp;!异形元件拾取点安全点
waitdi object_dw,1;!等待异形产品运行到位
movel sqd,v400,fine,xp;!机器人运行至异形元件拾取点
Set xp_control;!打开吸盘,开始拾取元件
WaitTime 2;!等待0.2 秒,确保元件拾取可靠
MoveL offs(sqd,0,0,50),v400,fine,xp;!回异形元件拾取点安全点
MoveJ offs(dw{num1},0,0,50),v400,fine,xp;!安装元件安全点
movel dw{num1},v400,fine,xp;!机器人将元件放置到安装点
Reset xp_control;!关闭吸盘,安装元件
WaitTime 2;!等待0.2 秒,确保元件安装可靠
MoveL Offs (dw {num1},0,0,50),v400,fine,xp;!回安装元件安全点
endfor
endproc
endmodule
在robotstudio 软件中搭建环形阵列装配工作站,并将环形阵列点位处理程序导入,进行仿真验证,通过环形阵列异形产品机器人点位计算处理,能很方便计算出环形阵列中的点位。并且只需要以一个环形阵列的圆点作为参考工件坐标系和以任意一个环形阵列异形产品的机器人安装点位作为参考点位进行示教,就能通过调用环形阵列点位处理例行程序求出其它环形阵列中的机器人点位。在程序仿真中,可修改环形阵列点位处理例行程序的参数,适配不同大小和不同阵列个数的环形阵列异形产品,都只需要示教两个点位就可以很精确的得出其它环形阵列机器人的点位数据,大大地减少了点位示教的工作量,提高了机器人作业效率。