朱小利,王夢茹
(安徽郵電職業(yè)技術學院,安徽 合肥 230000)
隨著“工業(yè)4.0”概念在德國的提出,以“智能工廠、智能制造”為主導的第四次工業(yè)革命已經(jīng)悄然來臨。工業(yè)機器人產(chǎn)業(yè)在其中發(fā)揮了不可替代的作用。隨著工業(yè)機器人技術以及智能水平的提高,工業(yè)機器人已在眾多領域得到了廣泛的應用。未來幾年,隨著行業(yè)的需要和勞動力成本的不斷提高,中國機器人市場增長潛力巨大[1]。工業(yè)機器人專業(yè)的人才需求也會愈來愈強烈?;诖似鯔C,我院順應時代發(fā)展潮流,開設了工業(yè)機器人專業(yè)。新事物的產(chǎn)生會帶來一系列的變革,同時也會面臨發(fā)展初期的困境。如在實訓室建設方面,由于工業(yè)機器人實訓系統(tǒng)設備普遍較為昂貴,且設備的使用維護成本也較高,在資金有限的情況下,實訓設備數(shù)量難以滿足實訓要求[2]。為解決此問題,各院校采用機器人虛擬仿真軟件配合真實的工業(yè)機器人實訓設備進行實訓教學。采用虛擬仿真軟件可以形象地對工業(yè)機器人各種實際的工作案例進行仿真,能使學生即使沒條件去工業(yè)現(xiàn)場也能了解工業(yè)機器人的實際工作過程,并且安全可靠,不會出現(xiàn)實際的實訓設備在使用過程中出現(xiàn)的碰撞、損壞等情況。虛擬仿真實驗室的建設成本較低,只需在相應機房安裝仿真軟件即可,且維護成本較低[3]。為工業(yè)機器人專業(yè)學生從學校走向企業(yè)提供了良好過渡,為培養(yǎng)應用型人才提供支撐。
為此,各國都在開發(fā)研制工業(yè)機器人虛擬仿真軟件,目前市面上比較著名的且應用較為廣泛的有ABB公司的RobotStudio、KUKA公司的KUKASim、Fanuc公司的RoboGuide以及一些第三方公司的仿真軟件,如RoboDK、RobotMaster、ROBCAD等[4]。與其他軟件相比RoboDK有許多優(yōu)勢,各個公司生產(chǎn)的仿真軟件只能對其本品牌的工業(yè)機器人進行仿真,如RobotStudio只能仿真ABB品牌的機器人,KUKASim只能仿真KUKA品牌的機器人。而RoboDK可以仿真市面上大多數(shù)品牌的機器人,如ABB、KUKA、安川、匯博、埃夫特等,還可在軟件中創(chuàng)建機器人,且仿真功能強大,支持基于Python的編程仿真,并支持和機器人的通訊,可將在軟件中編制好的程序下載到機器人本體,以便于更好、更方便調(diào)試實現(xiàn)工業(yè)機器人工作站的功能[5]。
本文將在RoboDK中創(chuàng)建工作站,完成工作站、機器人、工具以及工件等的加載與布局,并采用Python編程來實現(xiàn)工件的生成與布局、工件的搬運等功能任務。
要實現(xiàn)的任務如下。首先,打開RoboDK新建工作站,并完成工作站、機器人、吸盤工具、工件的加載及位置布局,如圖1所示;之后編制Python程序,將圖1碼盤1中的1個工件復制生成9個工件,并放置到碼盤1對應的卡槽中;最后,編制Python程序,實現(xiàn)9個工件的搬運任務,將碼盤1中的9個工件搬運到碼盤2對應的卡槽位置中,且搬運程序可反復無誤地運行,2個碼盤及碼盤中卡槽位置如圖2所示。
圖1 工作站系統(tǒng) 圖2 碼盤及卡槽位置
表1 模型位置坐標值 mm
打開RoboDK新建工作站,將事先用其他三維軟件創(chuàng)建好的保存在本地的工作站模型、吸盤工具模型、ABB-120系列機器人模型加載進來,并根據(jù)表1所示坐標值對它們進行位置的布局。模型導入及布局后效果如圖3所示。
圖3 系統(tǒng)布局 圖4 工件坐標系及工件布局
表2 工件坐標系 mm
為實現(xiàn)將碼盤1中的9個工件搬運到碼盤2中對應的9個卡槽位置中,可分別以碼盤1及碼盤2的左上邊角為坐標系原點創(chuàng)建2個工件坐標系Frame1和Frame2。這樣,碼盤1中的1~9個卡槽的中心點位置相對于坐標系Frame1的原點位置偏移量與碼盤2中的1~9個卡槽的中心點位置相對于坐標系Frame2的原點位置偏移量是相同的,利用此特點,可使9個工件的搬運程序指令簡化,具體實現(xiàn)在后面詳細介紹。
由第三方軟件測得,碼盤1和碼盤2左上邊角相對于機器人基座標系原點偏移量見表2。根據(jù)此偏移量創(chuàng)建坐標系Frame1和Frame2,之后導入紅色三角形工件,并根據(jù)表2中的位置值進行布局,如圖4所示。
在RoboDK中創(chuàng)建Python程序,命名為“生成工件”,調(diào)用相關函數(shù),編寫相關指令,實現(xiàn)將1個紅色工件復制成9個,并放置到碼盤1相應的卡槽中。用第三方軟件測得新生成的8個工件在碼盤1中相對于參考坐標系Frame1的原點位置偏移量(表3)。為實現(xiàn)此功能,將調(diào)用工件的復制函數(shù)iPart.Copy(),此函數(shù)的功能是將工件iPart進行復制;并將調(diào)用工件的粘貼函數(shù)fFrame.Paste(),此函數(shù)的功能是將復制的工件粘貼到fFrame坐標系下;除此之外,還需調(diào)用函數(shù)iNewPart.setName( ),對新生成的工件名稱進行設置;最后調(diào)用iNewPart.setPose()函數(shù)。根據(jù)表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的工件坐標系。
之后調(diào)用相關函數(shù)進行工件的生成及布局,具體程序指令如下:
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.1 工件位置的初始化
本系統(tǒng)所要實現(xiàn)的工件搬運功能是將碼盤1中的9個工件搬運到碼盤2對應的卡槽中,并且每次運行程序之初,保證9個工件在碼盤1中的9個卡槽中,即需進行9個工件的位置初始化設置。為實現(xiàn)此功能,工件生成并如圖5所示布局后,可在Python程序中自定義初始化函數(shù),并調(diào)用;也可先創(chuàng)建Program程序,命名為“初始化物體位置”,并添加工件的初始化指令,對工件1~9的位置進行初始化設置,本項目采用后者,具體操作如圖6所示。之后在Python搬運程序中編寫指令語句:RDK.RunProgram(‘初始化物塊位置’),調(diào)用此Program程序,完成9個工件的位置初始化。
5.2 工件的搬運程序編制
創(chuàng)建Python程序,命名為“搬運”,調(diào)用相關函數(shù),編寫語句指令,完成碼盤1中的9個工件搬運到碼盤2對應的卡槽中的操作。為使搬運過程簡化,已在碼盤1和碼盤2的邊角處創(chuàng)建工件坐標系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個工件的搬運放置點。要實現(xiàn)9個工件的搬運,因此i取值在1~9之間。工件的搬運流程:機器人坐標原點→第i個工件預抓取點→第i個工件抓取點→抓取工件→返回第i個工件預抓取點→第i個工件預放置點→第i個工件放置點→放置工件→返回第i個工件預放置點→第i+1個工件預抓取點┄┄。為簡化搬運指令,可采用for循環(huán)語句實現(xiàn)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] #定義機器人初始關節(jié)值
調(diào)用Program指令“初始化物塊位置”完成9個工件的初始化設置:
RDK.RunProgram('初始化物塊位置') #定義工件的初始化程序
設置機器人的工具及運行速度:
iRobot.setPoseTool(iTool) #設置機器人工具
iRobot.setSpeed(20,20) #設置機器人速度
編寫運動指令,完成9個工件的搬運:
iRobot.MoveJ(jHome)#機器人以關節(jié)運動方式回原點位置
for i in range(1,10):#采用循環(huán)語句,實現(xiàn)9個工件的搬運
iPart = RDK.Item('工件'+str(i)) #定義待搬運塊“工件 i”
target_i = iPart.Pose()*rotx(pi) #計算工件的抓取點或放置點
iRobot.setPoseFrame(iFrame1) #設置抓取工件的參考坐標系
iRobot.MoveJ(target_i*transl(0,0,-50)) #機器人以關節(jié)運動方式移動到工件預抓取位置,即抓取位置點正上方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編寫指令實現(xiàn)對機器人工作站搬運案例進行仿真,需要先導入API模塊RoboDK和Robolink模塊;之后對工作站中的對象進行定義,并調(diào)用Item函數(shù)將工作站中的對象與在Python中對其定義的變量關聯(lián)起來。并需設定工具坐標系及工件坐標系,機器人運動過程中所走路徑的目標點均是在相應的坐標系下創(chuàng)建確定的。在編寫實現(xiàn)搬運功能的運動指令之前還需設置機器人的運動速度。執(zhí)行搬運指令之后的運行結果如圖7所示。
隨著工業(yè)機器人在制造業(yè)中的應用越來越廣泛,對工業(yè)機器人專業(yè)人才的需求也日益增多[6],因此,許多院校都開設了工業(yè)機器人專業(yè),來培養(yǎng)適應需求的工業(yè)機器人專業(yè)應用型人才,而工業(yè)機器人仿真軟件在教學、科研及生產(chǎn)過程中起到了非常大的作用,RoboDK是一款應用非常廣泛、功能強大且支持離線編程的仿真軟件[7]。
本文采用RoboDK中基于API的Python編程實現(xiàn)對工件的生成及位置布局以及對多個工件的搬運任務的仿真。采用Python編程可實現(xiàn)用Program編程無法實現(xiàn)的工件的生成功能,可方便地編寫相關指令語句實現(xiàn)目標點的計算,省去在工作站中一個個去創(chuàng)建目標點的過程。另外,采用Python中的for循環(huán)語句編程,可將多個工件的搬運指令簡化?;赗oboDK API的Python編程實現(xiàn)工件的生成與搬運仿真可通過編制Python指令語句實現(xiàn)將1個工件生成多個工件并進行位置的布局,同時可方便地完成多個工件的搬運任務,且RoboDK仿真界面立體直觀,使得搬運過程的仿真更為直觀,更有利于對工業(yè)機器人的研究以及教學活動的開展。