基于RoboDK Python编程的工业机器人工作站工件生成及搬运仿真
2021-04-12朱小利王梦茹
朱小利,王梦茹
(安徽邮电职业技术学院,安徽 合肥 230000)
0 引 言
随着“工业4.0”概念在德国的提出,以“智能工厂、智能制造”为主导的第四次工业革命已经悄然来临。工业机器人产业在其中发挥了不可替代的作用。随着工业机器人技术以及智能水平的提高,工业机器人已在众多领域得到了广泛的应用。未来几年,随着行业的需要和劳动力成本的不断提高,中国机器人市场增长潜力巨大[1]。工业机器人专业的人才需求也会愈来愈强烈。基于此契机,我院顺应时代发展潮流,开设了工业机器人专业。新事物的产生会带来一系列的变革,同时也会面临发展初期的困境。如在实训室建设方面,由于工业机器人实训系统设备普遍较为昂贵,且设备的使用维护成本也较高,在资金有限的情况下,实训设备数量难以满足实训要求[2]。为解决此问题,各院校采用机器人虚拟仿真软件配合真实的工业机器人实训设备进行实训教学。采用虚拟仿真软件可以形象地对工业机器人各种实际的工作案例进行仿真,能使学生即使没条件去工业现场也能了解工业机器人的实际工作过程,并且安全可靠,不会出现实际的实训设备在使用过程中出现的碰撞、损坏等情况。虚拟仿真实验室的建设成本较低,只需在相应机房安装仿真软件即可,且维护成本较低[3]。为工业机器人专业学生从学校走向企业提供了良好过渡,为培养应用型人才提供支撑。
为此,各国都在开发研制工业机器人虚拟仿真软件,目前市面上比较著名的且应用较为广泛的有ABB公司的RobotStudio、KUKA公司的KUKASim、Fanuc公司的RoboGuide以及一些第三方公司的仿真软件,如RoboDK、RobotMaster、ROBCAD等[4]。与其他软件相比RoboDK有许多优势,各个公司生产的仿真软件只能对其本品牌的工业机器人进行仿真,如RobotStudio只能仿真ABB品牌的机器人,KUKASim只能仿真KUKA品牌的机器人。而RoboDK可以仿真市面上大多数品牌的机器人,如ABB、KUKA、安川、汇博、埃夫特等,还可在软件中创建机器人,且仿真功能强大,支持基于Python的编程仿真,并支持和机器人的通讯,可将在软件中编制好的程序下载到机器人本体,以便于更好、更方便调试实现工业机器人工作站的功能[5]。
本文将在RoboDK中创建工作站,完成工作站、机器人、工具以及工件等的加载与布局,并采用Python编程来实现工件的生成与布局、工件的搬运等功能任务。
1 系统任务要求
要实现的任务如下。首先,打开RoboDK新建工作站,并完成工作站、机器人、吸盘工具、工件的加载及位置布局,如图1所示;之后编制Python程序,将图1码盘1中的1个工件复制生成9个工件,并放置到码盘1对应的卡槽中;最后,编制Python程序,实现9个工件的搬运任务,将码盘1中的9个工件搬运到码盘2对应的卡槽位置中,且搬运程序可反复无误地运行,2个码盘及码盘中卡槽位置如图2所示。
图1 工作站系统 图2 码盘及卡槽位置
2 模型的导入及布局
表1 模型位置坐标值 mm
打开RoboDK新建工作站,将事先用其他三维软件创建好的保存在本地的工作站模型、吸盘工具模型、ABB-120系列机器人模型加载进来,并根据表1所示坐标值对它们进行位置的布局。模型导入及布局后效果如图3所示。
图3 系统布局 图4 工件坐标系及工件布局
3 创建工件坐标系
表2 工件坐标系 mm
为实现将码盘1中的9个工件搬运到码盘2中对应的9个卡槽位置中,可分别以码盘1及码盘2的左上边角为坐标系原点创建2个工件坐标系Frame1和Frame2。这样,码盘1中的1~9个卡槽的中心点位置相对于坐标系Frame1的原点位置偏移量与码盘2中的1~9个卡槽的中心点位置相对于坐标系Frame2的原点位置偏移量是相同的,利用此特点,可使9个工件的搬运程序指令简化,具体实现在后面详细介绍。
由第三方软件测得,码盘1和码盘2左上边角相对于机器人基座标系原点偏移量见表2。根据此偏移量创建坐标系Frame1和Frame2,之后导入红色三角形工件,并根据表2中的位置值进行布局,如图4所示。
4 工件的生成
在RoboDK中创建Python程序,命名为“生成工件”,调用相关函数,编写相关指令,实现将1个红色工件复制成9个,并放置到码盘1相应的卡槽中。用第三方软件测得新生成的8个工件在码盘1中相对于参考坐标系Frame1的原点位置偏移量(表3)。为实现此功能,将调用工件的复制函数iPart.Copy(),此函数的功能是将工件iPart进行复制;并将调用工件的粘贴函数fFrame.Paste(),此函数的功能是将复制的工件粘贴到fFrame坐标系下;除此之外,还需调用函数iNewPart.setName( ),对新生成的工件名称进行设置;最后调用iNewPart.setPose()函数。根据表3中的位置偏移量对新生成的工件进行布局。
表3 新工件位置 mm
具体程序指令如下所示:
首先导入API模块RoboDK和Robolink:from robolink import * # RoboDK API
from robodk import * # Robot toolbox
RDK = Robolink()
然后对工作站中的对象进行定义:
1)iPart=RDK.Item('工件1')#定义工件。
2)fFrame1=RDK.Item('Frame1')#定义编码盘1的工件坐标系。
之后调用相关函数进行工件的生成及布局,具体程序指令如下:
iPart.Copy()#复制工件
iNewPart1=fFrame1.Paste()#粘贴工件
iNewPart2=fFrame1.Paste()#粘贴工件
iNewPart3=fFrame1.Paste()#粘贴工件
iNewPart4=fFrame1.Paste()#粘贴工件
iNewPart5=fFrame1.Paste()#粘贴工件
iNewPart6=fFrame1.Paste()#粘贴工件
iNewPart7=fFrame1.Paste()#粘贴工件
iNewPart8=fFrame1.Paste()#粘贴工件
iNewPart1.setName('工件2')#设置工件的名字
iNewPart2.setName('工件3')#设置新工件的名字
iNewPart3.setName('工件4')#设置新工件的名字
iNewPart4.setName('工件5')#设置新工件的名字
iNewPart5.setName('工件6')#设置新工件的名字
iNewPart6.setName('工件7')#设置新工件的名字
iNewPart7.setName('工件8')#设置新工件的名字
iNewPart8.setName('工件9')#设置新工件的名字
iNewPart1.setPose(transl(58.5,23,3))#设置新工件的位置
iNewPart2.setPose(transl(100,23,3))#设置新工件的位置
iNewPart3.setPose(transl(25,53,3)*rotz(-pi))#设置新工件的位置
iNewPart4.setPose(transl(66,53,3)*rotz(-pi))#设置新工件的位置
iNewPart5.setPose(transl(108,53,3)*rotz(-pi))#设置新工件的位置
iNewPart6.setPose(transl(17,83,3))#设置新工件的位置
iNewPart7.setPose(transl(58.5,83,3))#设置新工件的位置
iNewPart8.setPose(transl(100,83,3))#设置新工件的位置
运行程序,进行新工件的生成及布局,如图5所示。
图5 新工件的生成及布局 图6 工件的初始化
5 工件的搬运
5.1 工件位置的初始化
本系统所要实现的工件搬运功能是将码盘1中的9个工件搬运到码盘2对应的卡槽中,并且每次运行程序之初,保证9个工件在码盘1中的9个卡槽中,即需进行9个工件的位置初始化设置。为实现此功能,工件生成并如图5所示布局后,可在Python程序中自定义初始化函数,并调用;也可先创建Program程序,命名为“初始化物体位置”,并添加工件的初始化指令,对工件1~9的位置进行初始化设置,本项目采用后者,具体操作如图6所示。之后在Python搬运程序中编写指令语句:RDK.RunProgram(‘初始化物块位置’),调用此Program程序,完成9个工件的位置初始化。
5.2 工件的搬运程序编制
创建Python程序,命名为“搬运”,调用相关函数,编写语句指令,完成码盘1中的9个工件搬运到码盘2对应的卡槽中的操作。为使搬运过程简化,已在码盘1和码盘2的边角处创建工件坐标系Frame1和Frame2。因码盘1中9个卡槽中心点相对于Frame1坐标系原点的偏移量与码盘2中相对应的9个卡槽中心点相对于Frame2坐标系原点的偏移量相同,即某一工件的抓取点相对于Frame1坐标系原点的偏移量与其放置点相对于Frame2坐标系原点的偏移量相同。因此,在搬运程序编写过程中,在参考坐标系Frame1下计算出某一工件的抓取点之后,只需将参考坐标系改成Frame2即可计算出其放置点。工件的抓取点可由工件在码盘1中的放置位置点(即在Frame1坐标系下的位置偏移量)在x轴方向旋转180°得到。因此,可用指令iPart = RDK.Item('工件'+str(i))计算出第i个工件的位置,再编写指令target_i = iPart.Pose()*rotx(pi)计算出第i个工件的抓取点或放置点。当参考坐标系选择Frame1时,target_i即为第i个工件的搬运抓取点;当参考坐标系选择Frame2时,target_i即为第i个工件的搬运放置点。要实现9个工件的搬运,因此i取值在1~9之间。工件的搬运流程:机器人坐标原点→第i个工件预抓取点→第i个工件抓取点→抓取工件→返回第i个工件预抓取点→第i个工件预放置点→第i个工件放置点→放置工件→返回第i个工件预放置点→第i+1个工件预抓取点┄┄。为简化搬运指令,可采用for循环语句实现9个工件的搬运。
具体指令如下所示:
导入API模块RoboDK和Robolink:
from robolink import * # RoboDK API
from robodk import * # Robot toolbox
RDK = Robolink()
定义工作站中的对象:
iWorkstation = RDK.Item('workstation7') #定义工作台
iRobot = RDK.Item('ABB IRB 120-3/0.6') #定义机器人
iTool = RDK.Item('Gripper') #定义工具
iFrame1 = RDK.Item('Frame 1') #定义编码盘1的工件坐标系
iFrame2 = RDK.Item('Frame 2') #定义编码盘2的工件坐标系
定义机器人初始位置目标点:
jHome = [0,0,0,0,90,0] #定义机器人初始关节值
调用Program指令“初始化物块位置”完成9个工件的初始化设置:
RDK.RunProgram('初始化物块位置') #定义工件的初始化程序
设置机器人的工具及运行速度:
iRobot.setPoseTool(iTool) #设置机器人工具
iRobot.setSpeed(20,20) #设置机器人速度
编写运动指令,完成9个工件的搬运:
iRobot.MoveJ(jHome)#机器人以关节运动方式回原点位置
for i in range(1,10):#采用循环语句,实现9个工件的搬运
iPart = RDK.Item('工件'+str(i)) #定义待搬运块“工件 i”
target_i = iPart.Pose()*rotx(pi) #计算工件的抓取点或放置点
iRobot.setPoseFrame(iFrame1) #设置抓取工件的参考坐标系
iRobot.MoveJ(target_i*transl(0,0,-50)) #机器人以关节运动方式移动到工件预抓取位置,即抓取位置点正上方50 mm的位置,也即在抓取点z轴方向偏移-50 mm
iRobot.MoveL(target_i) #机器人以直线运动方式移动到工件抓取位置
iTool.AttachClosest() #抓取工件
iRobot.MoveL(target_i*transl(0,0,-50)) #机器人以直线运动方式返回工件预抓取位置
iRobot.setPoseFrame(iFrame2) #设置放置工件的参考坐标系
iRobot.MoveL(target_i*transl(0,0,-50)) #机器人移动到工件预放置位置
iRobot.MoveL(target_i) #机器人移动到工件放置位置
iTool.DetachAll(iFrame2) #放置工件于iFrame2坐标系下
iRobot.MoveL(target_i*transl(0,0,-50)) #机器人返回工件预放置位置
图7 搬运程序运行结果
iRobot.MoveJ(jHome)#机器人返回原点位置
用Python编写指令实现对机器人工作站搬运案例进行仿真,需要先导入API模块RoboDK和Robolink模块;之后对工作站中的对象进行定义,并调用Item函数将工作站中的对象与在Python中对其定义的变量关联起来。并需设定工具坐标系及工件坐标系,机器人运动过程中所走路径的目标点均是在相应的坐标系下创建确定的。在编写实现搬运功能的运动指令之前还需设置机器人的运动速度。执行搬运指令之后的运行结果如图7所示。
6 结 论
随着工业机器人在制造业中的应用越来越广泛,对工业机器人专业人才的需求也日益增多[6],因此,许多院校都开设了工业机器人专业,来培养适应需求的工业机器人专业应用型人才,而工业机器人仿真软件在教学、科研及生产过程中起到了非常大的作用,RoboDK是一款应用非常广泛、功能强大且支持离线编程的仿真软件[7]。
本文采用RoboDK中基于API的Python编程实现对工件的生成及位置布局以及对多个工件的搬运任务的仿真。采用Python编程可实现用Program编程无法实现的工件的生成功能,可方便地编写相关指令语句实现目标点的计算,省去在工作站中一个个去创建目标点的过程。另外,采用Python中的for循环语句编程,可将多个工件的搬运指令简化。基于RoboDK API的Python编程实现工件的生成与搬运仿真可通过编制Python指令语句实现将1个工件生成多个工件并进行位置的布局,同时可方便地完成多个工件的搬运任务,且RoboDK仿真界面立体直观,使得搬运过程的仿真更为直观,更有利于对工业机器人的研究以及教学活动的开展。