鄭怡廷 趙琛 王一帆 陶澤勇
(國(guó)核電站運(yùn)行服務(wù)技術(shù)公司,上海 200233)
隨著當(dāng)今科技的快速發(fā)展,工業(yè)用機(jī)械臂已經(jīng)成為工業(yè)生產(chǎn)、運(yùn)輸、無損檢測(cè)等多種領(lǐng)域不可或缺的設(shè)備。尤其是在高溫、高輻射、有毒氣體等惡劣環(huán)境中,機(jī)械臂能夠代替操作人員進(jìn)行現(xiàn)場(chǎng)工作,使得操作人員可在安全位置進(jìn)行遠(yuǎn)程操控[1-3]。
各類機(jī)械臂廠商會(huì)提供響應(yīng)的操作界面,但有時(shí)其使用受到各類限制且使用起來不甚方便,故而廠商也提供了各類接口供操作人員進(jìn)行二次開發(fā),通過二次開發(fā),可定制各類特定功能以方便現(xiàn)場(chǎng)的各類操作[4-7]。機(jī)械臂在實(shí)際使用過程中,如果直接在某些場(chǎng)合使用,會(huì)造成碰撞等事故,對(duì)現(xiàn)場(chǎng)設(shè)備和機(jī)械臂本身造成損壞。再者,操作過程中有時(shí)操作人員收現(xiàn)場(chǎng)條件限制,無法準(zhǔn)確觀測(cè)現(xiàn)場(chǎng)情況,需要借助仿真軟件輔助推斷現(xiàn)場(chǎng)情況。故而機(jī)械臂仿真軟件對(duì)于機(jī)械臂的使用起到極其重要的作用。
本文介紹使用Python語言對(duì)優(yōu)傲公司生產(chǎn)的UR10機(jī)械臂進(jìn)行二次開發(fā),實(shí)現(xiàn)對(duì)UR10機(jī)械臂進(jìn)行遠(yuǎn)程操控,同時(shí)連接V-REP EDU仿真軟件,實(shí)現(xiàn)同步仿真功能。
優(yōu)傲公司(Universal Robots,簡(jiǎn)稱UR)是一家專業(yè)從事生產(chǎn)多功能、協(xié)作式工業(yè)機(jī)械臂的丹麥公司,主要產(chǎn)品包括臺(tái)式的機(jī)械臂UR3、UR3e,中小型機(jī)械臂UR5、UR5e、UR10、UR10e,重型機(jī)械臂UR16e。所有的型號(hào)都是六關(guān)節(jié)機(jī)械臂,依照不同型號(hào)支持不同的負(fù)載。優(yōu)傲公司生產(chǎn)的機(jī)械臂在多種場(chǎng)合廣泛運(yùn)用,為了在現(xiàn)場(chǎng)的環(huán)境中能夠更好的使用,有必要對(duì)其進(jìn)行仿真的開發(fā)研究[8]。
本軟件采用了UR10型號(hào)的機(jī)械臂作為研究對(duì)象。該機(jī)械臂擁有1300mm半徑移動(dòng)范圍,有效荷載10千克和六個(gè)軸,所有軸轉(zhuǎn)動(dòng)范圍都支持正負(fù)360°,支持Modbus-TCP,EthernetIP以及Profinet三種主線。同時(shí),UR10支持多個(gè)通訊接口,包括Dashboard、Primary、Secondary、Realtime、RTDE、Socket、XML-RPC等接口,主要使用的接口包括:Dashboard使用29999端口,執(zhí)行機(jī)器人初始化、加載程序、開始和暫停程序、運(yùn)行以及設(shè)置用戶角色等,該接口需要上位機(jī)主動(dòng)發(fā)送Dashboard命令字符串后返回相應(yīng)數(shù)據(jù);Primary接口使用30001端口,主要發(fā)送機(jī)器人狀態(tài)以及附加信息,會(huì)以10HZ的頻率向上位機(jī)發(fā)送相關(guān)信息,當(dāng)接口在收到上位機(jī)腳本指令字符串后會(huì)立即中斷當(dāng)前運(yùn)行的程序,然后運(yùn)行收到的指令。Secondary接口使用30002端口,與Primary接口相似,但發(fā)送的信息中只包括機(jī)器人狀態(tài)而不包括附加信息。Realtime,接口使用30003端口,與Primary、Secondary接口相似,以125HZ的頻率向上位機(jī)發(fā)送詳細(xì)狀態(tài)信息。RTDE接口使用3004端口,RTDE接口不能接收腳本信息,只能以125HZ頻率發(fā)送機(jī)器人的詳細(xì)狀態(tài)信息。Socket 通訊通過Socket相關(guān)腳本指令與上位機(jī)進(jìn)行通訊。XML-RPC通訊通過XML格式傳輸數(shù)據(jù)。Modbus-TCP通過Modbus協(xié)議傳輸數(shù)據(jù)。UR10機(jī)械臂支持三種運(yùn)動(dòng)模式:關(guān)節(jié)運(yùn)動(dòng)、線性運(yùn)動(dòng)、圓周運(yùn)動(dòng)。關(guān)節(jié)運(yùn)動(dòng)(MoveJ),通過輸入6個(gè)關(guān)節(jié)的弧度值來確定移動(dòng)位置,移動(dòng)采用曲線路徑。線性運(yùn)動(dòng)(MoveL),通過輸入6個(gè)參數(shù),其中3個(gè)參數(shù)代表位置,3個(gè)參數(shù)代表姿態(tài)來確定移動(dòng)位置,移動(dòng)采用線性方式,使工具保持在線性路徑上。圓周運(yùn)動(dòng)(MoveP)同樣通過輸入6個(gè)參數(shù),3個(gè)參數(shù)代表位置,3個(gè)參數(shù)代表姿態(tài)來確定移動(dòng)位置,但是是以恒定速度通過圓形混合區(qū)進(jìn)行移動(dòng)。
UR機(jī)械臂有三種種編程方式:Polyscope編程、URScript腳本編程以及C-API編程,本文中UR10為更好通過Python來呈現(xiàn),降低延遲率,故選用UR公司自有的URScript腳本級(jí)機(jī)器人編程語言。和大部分腳本編程語言一樣,URScript支持布爾值、整數(shù)、浮點(diǎn)、字符串、null等基本類型,此外有獨(dú)有的姿態(tài)類型,用來表示機(jī)械臂的位姿。URScript支持自定義函數(shù)、控制流語句、多線程功能[9]。
在UR10機(jī)械臂運(yùn)動(dòng)編程仿真環(huán)境中,基于通訊接口Realtime來開發(fā),可以將不同語言開發(fā)的模型集成在一個(gè)平臺(tái)上運(yùn)行,實(shí)現(xiàn)低延遲操控和仿真。通過對(duì)UR10機(jī)械臂、空間環(huán)境、運(yùn)動(dòng)策略等參數(shù)進(jìn)行配置,能夠快速構(gòu)建適用于所需空間和運(yùn)動(dòng)操控的任務(wù),如圖1所示。
Python語言作為當(dāng)今最流行的程序開發(fā)語言之一,代碼優(yōu)美易讀,開發(fā)效率高,擁有種類齊全豐富的開發(fā)庫(kù)。本文考慮語言通用性,采用版本Python3.6來進(jìn)行語言編寫,其中,程序使用Tkinter8.6圖形界面接口庫(kù),Tk是一個(gè)輕量級(jí)、跨平臺(tái)的圖形用戶開發(fā)包,Tkinter是其在Python上的接口。在開發(fā)時(shí)使用的集成開發(fā)環(huán)境(IDE)為JetBrains PyCharm,是著名的開發(fā)Python語言的IDE,界面簡(jiǎn)潔,功能齊全,易于使用[10]。
圖1 UR10機(jī)械臂編程仿真結(jié)構(gòu)
Python在官方網(wǎng)站下載即可,注意下載與本機(jī)操作系統(tǒng)和位數(shù)相符的安裝本,下載完成后默認(rèn)安裝即可,注意需要勾選Add Python to PATH,否則安裝完成后需要手動(dòng)配置環(huán)境變量。如果選擇自定義安裝,則一定要勾選td/tk and IDLE,Tkinter是Python的自帶庫(kù),完成安裝后即搭建了開發(fā)環(huán)境。
V-REP(Virtual Robot Experimentation Platform EDU,虛擬機(jī)器人實(shí)驗(yàn)平臺(tái)(教育版))是一款跨平臺(tái)的仿真軟件。V-REP軟件內(nèi)自帶眾多機(jī)器人模型,同時(shí)也支持從外部文件導(dǎo)入模型。V-REP支持嵌入腳本、附加腳本或沙盒腳本、插件、遠(yuǎn)程API、ROS節(jié)點(diǎn)。其中嵌入腳本、附加腳本或沙盒腳本、插件都支持Lua語言,遠(yuǎn)程API支持C、Python、Java、Matlab、Octave和Lua等語言。V-REP軟件自帶UR10模型,可直接使用,但為了能和程序進(jìn)行正常通訊,需要作一定的配置。首先,要在V-REP中新建場(chǎng)景,之后將UR10模型拖入場(chǎng)景中,然后需要編輯UR10的子腳本,在自動(dòng)生成的子腳本下function sysCall_init()子函數(shù)中調(diào)用simRemoteApi.start函數(shù),該函數(shù)可在指定端口上啟動(dòng)API服務(wù),用于與程序進(jìn)行通訊,做循環(huán)判定,當(dāng)simRemoteApi.start函數(shù)返回-1時(shí)則結(jié)束程序[11-12]。
為了更好地觀測(cè)仿真UR10的運(yùn)動(dòng)軌跡,需要在UR10的TCP處加入軌跡顯示,在UR10_link7節(jié)點(diǎn)新增Graph控件,在Graph控件的配置中新增三個(gè)記錄數(shù)據(jù)流(data stream to record),分別對(duì)應(yīng)UR10_link7在笛卡爾坐標(biāo)系的X,Y,Z軸,配置完畢后,隨著機(jī)械臂在V-REP軟件內(nèi)的移動(dòng),操作人員可在V-REP軟件內(nèi)直觀觀察到過去一段時(shí)間機(jī)械臂的移動(dòng)軌跡,當(dāng)機(jī)械臂作一定功能的移動(dòng)時(shí),軌跡功能很好的輔助操作人員確認(rèn)移動(dòng)情況。
UR10機(jī)械臂可視化仿真平臺(tái)由三個(gè)模塊組成,分別為數(shù)據(jù)接收模塊、數(shù)據(jù)發(fā)送模塊、仿真交互模塊。數(shù)據(jù)接收模塊接收UR10機(jī)械臂發(fā)出的狀態(tài)數(shù)據(jù),數(shù)據(jù)發(fā)送模塊發(fā)送向機(jī)械臂發(fā)送指令使機(jī)械臂運(yùn)動(dòng),仿真交互模塊與VREP交互數(shù)據(jù)實(shí)現(xiàn)仿真。
數(shù)據(jù)接收模塊使用Realtime接口,30003端口,采用TCP連接方式連接,連接后機(jī)械臂會(huì)以以125HZ的頻率發(fā)送詳細(xì)狀態(tài)信息。考慮到上位機(jī)的處理能力和資源配置情況,在時(shí)間精度要求不高的場(chǎng)合,不必拆解每一個(gè)包,可根據(jù)實(shí)際情況適當(dāng)降低獲取的頻率。
Realtime接口每次發(fā)送1108個(gè)字節(jié)(UR10不同的內(nèi)置軟件版本會(huì)有所不同,但主要數(shù)據(jù)格式不變),發(fā)送的數(shù)據(jù)格式如表1:
表1中的笛卡爾坐標(biāo)采用(X,Y,Z,Rx,Ry,Rz)表示,其中X,Y,Z表示位置,Rx,Ry,Rz表示姿態(tài),UR10機(jī)械臂采用旋轉(zhuǎn)矢量法表示姿態(tài)。由于并非所有的數(shù)據(jù)都需要觀測(cè),本程序僅選取較為重要的一些數(shù)據(jù)進(jìn)行顯示。獲取數(shù)據(jù)后,使用struct.unpack函數(shù),將tcp接收到的返回值轉(zhuǎn)換為指定格式,除了數(shù)據(jù)包總長(zhǎng)度為int外其他所有的數(shù)據(jù)都為double,此外還需要注意,接收到的數(shù)據(jù)為大端格式,所以要按照">d"的格式轉(zhuǎn)換數(shù)據(jù),無論有幾個(gè)值,數(shù)據(jù)最終都以元祖格式返回,后續(xù)處理時(shí)需自行轉(zhuǎn)換。
表1
如下示例獲取第一個(gè)軸的實(shí)際位置:
data = tcp_connect.get_tcp_recv()
position = struct.unpack(">d",data[252:260])[0]
獲取的值是弧度,在程序中將其轉(zhuǎn)換為角度方便使用。在獲取到數(shù)據(jù)后,程序如上述例子數(shù)據(jù)處理并顯示到程序界面上供操作人員查看。
數(shù)據(jù)發(fā)送模塊負(fù)責(zé)將根據(jù)操作人員的操作生成的上位機(jī)指令發(fā)送到UR10機(jī)械臂,以實(shí)現(xiàn)對(duì)通過二次開發(fā)的本軟件對(duì)UR10機(jī)械臂的操控。數(shù)據(jù)發(fā)送模塊同樣采用30003端口,TCP協(xié)議發(fā)送,發(fā)送命令使用URScript語言。移動(dòng)命令支持JOG、Move Pose、Move Location模式。JOG,即點(diǎn)動(dòng),按下鼠標(biāo)左鍵后開始移動(dòng),移動(dòng)過程中松開鼠標(biāo)不放,鼠標(biāo)放開后即停止。支持兩種方式,軸移動(dòng)和位姿移動(dòng),軸移動(dòng)采用關(guān)節(jié)運(yùn)動(dòng)方式,即MoveJ方式,位姿移動(dòng)采用線性運(yùn)動(dòng),即MoveL方式。
MoveJ方式:movej([j1,j2,j3,j4,j5,j6],a,v),其中j1-j6代表UR10機(jī)械臂的六個(gè)軸,a代表關(guān)節(jié)加速度(rad/s^2),v代表關(guān)節(jié)速度(rad/s),還有兩個(gè)可選參數(shù)時(shí)間和交融半徑可選,本程序不用。點(diǎn)動(dòng)時(shí),操作人員選擇要?jiǎng)拥妮S,程序通過拼接字符串將命令拼接好發(fā)送至UR10機(jī)械臂。
MoveL方式:movel([x,y,z,Rx,Ry,Rz],a,v),其中x,y,z代表三軸的位置,Rx,Ry,Rz代表姿態(tài),其他與MoveJ類似。
Move Pose方式,即由操作人員輸入6軸的位置,UR10機(jī)械臂通過內(nèi)部算法直接移動(dòng)到響應(yīng)位置。
Move Location方式,與Move Pose類似,操作人員輸入位姿的6個(gè)參數(shù),UR10機(jī)械臂通過內(nèi)部算法直接移動(dòng)到響應(yīng)位置。
當(dāng)需要機(jī)械臂停止時(shí),發(fā)送停止命令即可,stopj命令對(duì)應(yīng)MoveJ運(yùn)動(dòng)方式,stopl命令對(duì)應(yīng)MoveL移動(dòng)方式。本程序還定制了一些現(xiàn)場(chǎng)實(shí)際使用的特定模式,例如三點(diǎn)間的循環(huán)運(yùn)動(dòng),機(jī)械臂與每個(gè)點(diǎn)停留一定時(shí)間,之后向下個(gè)點(diǎn)運(yùn)動(dòng)。腳本直接存放于程序下,可根據(jù)現(xiàn)場(chǎng)的實(shí)際情況實(shí)施修改。
仿真交互模塊負(fù)責(zé)程序與V-REP交互,主要功能是將UR10機(jī)械臂的位置數(shù)據(jù)反饋到V-REP中,使得操作者能夠觀測(cè)仿真環(huán)境。在使用前,需要對(duì)程序進(jìn)行配置才可使Python程序正常鏈接V-REP。在V-REP安裝目錄下programming emoteApiBindingspythonpython目錄中找到vrep.py、vrepConst.py、remoteApi.dll這三個(gè)文件,將其拷貝到本程序的同級(jí)目錄下,之后在Python程序頭部導(dǎo)入vrep模塊即可。隨后需要考慮鏈接V-REP的功能,使用vrep.simxStar函數(shù),該函數(shù)作用是啟動(dòng)一個(gè)通信線程與V-REP相連,注意函數(shù)中的端口號(hào)要與V-REP子腳本中配置的端口號(hào)一致。
圖2 UR10機(jī)械臂可視化平臺(tái)操控界面
使用時(shí)分為仿真模式和實(shí)時(shí)同步模式,仿真模式時(shí)只在V-REP中驅(qū)動(dòng)仿真界面不操作實(shí)際機(jī)械臂,實(shí)時(shí)同步模式實(shí)際操作機(jī)械臂,通過數(shù)據(jù)接收模塊讀取UR10機(jī)械臂的實(shí)際位置后將其反饋給V-REP。仿真模式較為簡(jiǎn)單,由于無需與UR10機(jī)械臂交互,當(dāng)操作人員點(diǎn)擊按鈕后,只要算出移動(dòng)后的位置,將移動(dòng)位置傳輸給V-REP接口即可。實(shí)時(shí)同步模式中,當(dāng)操作人員點(diǎn)擊按鈕后,首先通過數(shù)據(jù)發(fā)送模塊將命令傳送給UR10機(jī)械臂,然后通過數(shù)據(jù)接收模式獲取UR10機(jī)械臂的實(shí)時(shí)位置反饋,最后通過仿真交互模塊將位置數(shù)據(jù)傳給V-REP以實(shí)現(xiàn)仿真功能。
在連接成功后,通過vrep.simxGetObjectHandle函數(shù)獲取UR10和UR10各個(gè)關(guān)節(jié)軸的句柄,將其存于一個(gè)變量之中以供之后調(diào)用。當(dāng)用戶操作后程序獲取位置時(shí),將各軸位置通過vrep.simxSetJointTargetPosition函數(shù)通知VREP程序,調(diào)用時(shí)將各軸位置和之前獲取的句柄一一對(duì)應(yīng)。simxSetJointTargetPosition中的各軸位置使用的是弧度,源程序使用的角度,需要在程序中進(jìn)行轉(zhuǎn)換。
基于Python的UR10機(jī)械臂可視化平臺(tái)操控界面如圖2所示。
首先,打開V-REP軟件,打開先前設(shè)置好的V-REP場(chǎng)景,并啟動(dòng)模擬環(huán)境。之后打開操作程序,點(diǎn)擊V-REP連接按鈕,當(dāng)程序提示成功后,如果使用仿真模式即可直接操作,在V-REP上查看仿真運(yùn)動(dòng)軌跡。如果使用實(shí)時(shí)同步模式還需要點(diǎn)擊機(jī)械臂連接按鈕,之后即可各種操作,觀察UR10機(jī)械臂的運(yùn)動(dòng)情況和V-REP中的仿真情況。操作人員按下各個(gè)JOG+、JOG-按鈕即可對(duì)相應(yīng)的軸或者位姿進(jìn)行點(diǎn)動(dòng),放開鼠標(biāo)即停止點(diǎn)動(dòng),為了安全原因,每次點(diǎn)動(dòng)最多移動(dòng)90°,移動(dòng)超過90°后會(huì)自動(dòng)停止,需要繼續(xù)移動(dòng)要松開鼠標(biāo)并再次按下鼠標(biāo)。經(jīng)過測(cè)試,本軟件能夠順利操控機(jī)械臂,延遲時(shí)間低,在實(shí)時(shí)同步模式下UR10機(jī)械臂與VREP軟件延遲低于0.1s,能夠使操作人員較好的利用仿真環(huán)境操控實(shí)際機(jī)械臂,實(shí)現(xiàn)了UR機(jī)械臂模擬的需求。
基于對(duì)UR10機(jī)械臂可視化仿真平臺(tái)設(shè)計(jì)分析,敘述了Python語言編寫的操控及仿真的機(jī)構(gòu)、設(shè)計(jì)和實(shí)現(xiàn),通過仿真結(jié)果來驗(yàn)證該設(shè)計(jì)方案的可行性,體現(xiàn)了平臺(tái)的通用性和可擴(kuò)展性,為進(jìn)一步優(yōu)化、研究機(jī)械臂仿真和操控打下了基礎(chǔ)。