張國棟 洪榮晶,2 方成剛,2
1(南京工業大學機械與動力工程學院 江蘇 南京 211816)2(南京工大數控科技有限公司 江蘇 南京 211800)
機器人虛擬仿真方便了人們對整個機器人工作站的布局規劃以及整體預覽[1]。在實際工業應用中,常用的離線編程軟件robotstudio、DELMIA、SprutCAM都需要通過存儲設備將離線程序導入到機器人中,這一操作不能及時驗證機器人軌跡的正確性。在機器人離線編程的過程中,采用虛擬仿真與實際設備進行聯動,可以更方便地監控周遭設備的運行狀態。很多仿真軟件例如roboguide雖然實現了與機器人的信號交互,但與周遭設備之間的聯動運動卻不是很好,甚至根本無法做到。
針對以上實際研究過程中的不足與存在的問題,本文使用Python語言基于RoboDK軟件平臺開發了與周遭設備之間的信號交互功能,以及與機器人之間實時數據交互功能。這兩大功能在實際過程中有如下用途:(1)通過TCP/IP協議實現與機器人通信,可以將運動指令發送給機器人,方便檢查機器人軌跡的正確性,方便及時調整,并可以實時監控機器人運行狀態。(2)通過Python-Snap7模塊實現與周遭設備進行通信,實現與周遭設備的聯動,便于在項目實行時候查看整個工作站的運行情況。
機器人伴隨仿真系統具體流程框架如圖1所示,主要是Python接口函數與機器人端實現數據交互,然后通過解包等相關流程,結合RoboDK中Robolink、Robodk相關模塊,實現伴隨仿真。

圖1 仿真框架結構圖
機器人的正向運動學是旋轉運動中從機器人關節變量空間到笛卡爾坐標系空間的運動變換。對于給定的一組關節變量,求取末端執行器的位置和方向是正向運動學的主要問題[2]。確定UR機器人的正向運動學,主要是為了在實時傳輸機器人的關節值之后可以準確獲得相關機器人的一個實時姿態,從而在RoboDK的圖形界面中實時顯示機器人的姿態。
在RoboDK將機器人三維模型根據運動機構數分為BASE、J1、J2、J3、J4、J5、J6七個部分,保證機器人的基坐標系的位置處于工作站的原點。通過“實用程序”中“創建機構或者機器人”選項創建機器人,對于標準6軸機器人,通過其關節值和軸運動范圍定義機器人。其中UR機器人的關節長度如圖2所示。創建完成之后,機器人的D-H參數如表1所示。

圖2 UR機器人連桿長度

表1 UR機器人的D-H參數表
根據D-H參數方法,得到機器人的相鄰關節n到n-1的位姿變換為:
n-1A(θn)=
Rot(xn-1,θn)Trans(0,0,dn)Trans(an,0,0)Rot(xn,αn)
(1)
式中:an和dn為平移距離;θn和αn為旋轉角度。
對于六軸機械手,機器人法蘭末端到機器人的基坐標系的變換矩陣為:
Tn=0A11A22A33A44A55A6
式中:0A11A22A3確定末端法蘭的位置;3A44A55A6確定末端法蘭的姿態。
1.2.1Socket通信獲取機器人信息
Socket是TCP/IP網絡通信中最為常用的一個API(應用程序接口),任何網絡通信都是通過Socket來完成的。本文所使用的UR機器人在TCP/IP協議的基礎上,提供了豐富的端口用于與外部設備進行交互[3]。其中UR機器人30003為實時反饋端口,與客戶端信息交流的頻率為125 Hz,通過此端口每次收到的數據為1 044個字節,以標準網絡格式排列。主要反饋內容包括機器人的關節目標、速度、加速度、電流、扭矩等值。在Python中建立通信客戶端,對機器人控制器中的數據進行實時讀取,使用到的Python中提供的Socket模塊對象函數主要如表2所示。

表2 Socket對象函數
客戶端與服務器端(機器人端)連接時的時序圖如圖3所示。

圖3 面向連接TCP的時序圖
通過Socket連接之后,客戶端接收由機器人30003端口發送出來的機器人所有狀態信息,返回信息以字節形式返回。其中客戶端接收機器人的主要信息如下:
dic= {′MessageSize′: ′i′, ′Time′: ′d′, ′q target′: ′6d′, ′qd target′: ′6d′, ′qdd target′: ′6d′,′I target′: ′6d′,
′M target′: ′6d′, ′q actual′: ′6d′, ′qd actual′: ′6d′, ′I actual′: ′6d′, ′I control′: ′6d′,
′Tool vector actual′: ′6d′, ′TCP speed actual′: ′6d′, ′TCP force′: ′6d′, ′Tool vector target′: ′6d′,
′TCP speed target′: ′6d′, ′Digital input bits′: ′d′, ′Motor temperatures′: ′6d′, ′Controller Timer′: ′d′,
′Test value′: ′d′, ′Robot Mode′: ′d′, ′Joint Modes′: ′6d′, ′Safety Mode′: ′d′, ′empty1′: ′6d′, ′Tool Accelerometer values′: ′3d′,
′empty2′: ′6d′, ′Speed scaling′: ′d′, ′Linear momentum norm′: ′d′, ′SoftwareOnly′: ′d′, ′softwareOnly2′: ′d′, ′V main′: ′d′,
′V robot′: ′d′, ′I robot′: ′d′, ′V actual′: ′6d′, ′Digital outputs′: ′d′, ′Program state′: ′d′, ′Elbow position′: ′3d′, ′Elbow velocity′: ′3d′}
1.2.2struct函數解析數據
在TCP/IP協議進行諸如Int、char之類的數據傳輸的時候,服務器端需要某種機制將某些特定的結構體的類型打包成二進制流的字符串后進行網絡傳輸,而客戶端也應該經過某種機制進行解包還原原來的結構體數據[4]。從機器人控制器端發送來的1 044個字節,對其進行解包獲得相應的數據,對照機器人30003端口發送的數據表得知前256個字節的排列順序以及相關內容如表3所示。

表3 實時反饋數據包
通過struct.unpack_from()對接收到的機器人的信息進行解包,其流程如圖4所示。

圖4 數據解包流程
Struct.unpack_from()函數中參數分別表示:格式化字符串格式、緩沖區、偏移量。函數定義方法如下:根據格式化字符串格式從位置偏移處開始從緩沖區解包。緩沖區大小(以字節為單位,減去偏移量)至少為格式所需要的大小。圖4表示從緩存區第256個字節開始解包,解包數據格式為“!dddddd”,即6個整數,按網絡字節順序進行排列,即得到機器人6個實時關節值。
通過1.1節、1.2節獲得機器人的實時關節數據。機器人傳輸過來的值為UR所規定的格式,均為弧度制。需要對其利用相關的數學公式轉化為度數,然后利用Robolink模塊對應函數,實現對模擬環境中機器人的動作控制。
程序中可設置刷新時間以及進行多線程編程,可以讓機器人進行數據獲取的同時執行模擬環境中機器人移動操作。在RoboDK中,通過其提供的基于Python的API,將工業機器人虛擬環境中的三維運動與實際相結合。用于Python的RoboDK API分為以下兩個模塊:Robolink模塊,Robodk模塊。Robolink模塊主要功能為:檢索RoboDK工作站樹中的任何對象,由Item對象表示;根據Robolink.Item類對該項執行不同的操作。本次運用到的Robolink.ltem類函數主要是setJoints(),其主要說明為:設置機器人或目標的當前關節。如果設置了機器人關節,則將在屏幕上更新機器人位置。
對從上述Socket通信和解包所得到的真實機器人的關節值進行相關數學轉換,轉換程序如下:
def on_packet(packet):
global ROBOT_JOINTS
#從數據包中檢索所需信息
rob_joints_RAD=packet_value(packet,UR_GET_JOINT_POSITIONS)
#print(rob_joints_RAD)
ROBOT_JOINTS=[ji*180.0/pi for ji in rob_joints_RAD]
轉換完成之后得到的機器人的關節值為度數,將變量放入到setJoints函數中即可。在此之前,需要獲取已經配置好的機器人名稱,其中更新位姿的主要流程如圖5所示。

圖5 更新位姿流程
上述過程完成之后,在RoboDK客戶端實時獲取實際機器人的末端位姿,在UR5機器人控制器中固定IP,啟用機器人以太網通信。通過UR機器人控制面板polyscope面板控制機器人運動,即可在RoboDK中實時顯示機器人位姿,如圖6所示。其中,左端為離線編程的環境中機器人位姿,右端為機器人polyscope控制面板。可以看出,實際機器人的關節值實時傳遞給虛擬環境中的機器人,到達位姿一致,且可以實時更新,保證機器人控制面板和虛擬機器人面板的關節值均保持相同。

圖6 實驗結果圖
在工業機器人的離線編程的實際應用中,機器人常會與周遭設備進行互動,例如焊接時,焊接機器人往往需要與變位機設備進行互動,如果在仿真場景中實時反饋變位機的位姿,對機器人的離線編程具有很大的幫助。在自動化系統之中,很多設備都是由PLC監控其運行,通過PLC可以知道當前設備的一個運行狀態、位置。可以在虛擬場景中得知PLC相關狀態的信號,然后將這些信號通過RoboDK中Robolink、Robodk兩大模塊,虛擬出實際場景中運動機構的動作。機構半實物仿真相關過程如圖7所示。

圖7 機構半實物仿真過程
Python與西門子PLC進行通信,主要是靠snap7套件。snap7是一個開源的32/64位多平臺以太網通信套件[5],主要用于與西門子S7系列1200、1500的PLC進行本地連接。Python-snap7是snap7庫的Python包裝器。通過RoboDK中嵌套的Python API接口,安裝好Python-snap7模塊、snap7模塊。完成環境搭建工作之后,方可與相關的PLC之間進行通信。
結合Python-snap7的模塊函數的相關分析以及相關文檔,Python-snap7庫中的函數主要類方法是read_area和write_area[6],函數中主要的函數參數為需要提供PLC的區域地址(area、dbnumber)、起始偏移地址(start)、讀和寫的數據長度(size/data)。PLC能提供如下信息:PLC的存儲區通過tag的形式與存儲區間關聯,分為輸入(I)、輸出(O)、位存儲區(M)、數據塊(DB)。程序在訪問對應的(I/O)tag時,是通過訪問CPU中的過程影響存儲區對應的地址進行操作的。函數參數中area、size的取值與數據區域、數據類型的對應關系如表4所示。

表4 函數參數對應關系表
從PLC的用戶手冊可知,對于M3.4,對應的就是MK(0x83),對應的起始地址是3,對應的bit位為4,即數據類型為bit。在讀取該位即調用函數的時候,其變量需要設置為area=snap7.snap7types.areas.MK,dbnumber=0,start=3.3,size=1,即可讀取關于M3.4的狀態。為了更好地對PLC狀態進行讀寫,現通過Python語言實現了PLC程序監控測試面板,并且通過RoboDK中嵌入的API接口將面板嵌入其中,如圖8所示,通過該交互界面可以實現以下功能:

圖8 PLC程序監控面板
(1)PLC狀態讀取。通過GUI界面中輸入PLC的IP,確定其機架號、插槽號;并且設置相關的讀取數據區域,其中讀寫數據的參數主要由表4到表6決定,設置好相關參數之后,點擊“查詢數據”按鈕,即可在最下方文本顯示框中看到相關數據。
(2)PLC 數據寫入。先設置好要寫入的數據區域(基本步驟參見第一步),然后設置要寫入的數據,如要寫入MB0中的M0.3、M0.4為1,設置好讀寫區域之后,將準備發送的數據寫為“2#0001 1000”或“24”即可。
將上述功能面板進行精簡化之后,所得PLC信號監控面板如圖9所示。為了方便對機構的控制,通過博途軟件進行PLC程序的編寫,將梯形圖程序下載到PLC中之后,通過PLC信號設置精簡面板,設置相對應的PLC輸入信號以及監控相關輸出信號,驅動相應機構運動,并且設置相關的仿真機構的運動。本次仿真機構為變位機,其驅動程序如圖10所示。

圖9 PLC信號設置精簡面板

圖10 變位機驅動程序
變位機運動由三個電磁閥控制,其中:閥1、閥2分別控制變位機正轉、反轉;閥3控制壓緊氣缸的伸縮,并且有一光電傳感器開關為變位機運動到位的標記信號。M2.0、M2.1控制變位機的正反轉,如表5所示。對PLC進行值寫入時,直接對MB2進行操作即可。

表5 變位機狀態與MB2取值對應表
通過變位機的三維創建其機構,如圖11所示。設置其變位機機構回轉速度和回轉加速度與真實機構一致,將仿真機構的驅動信號設置為PLC的等待信號。程序結構如圖12所示。

圖11 創建變位機機構

圖12 變位機運動程序
通過驅動該程序,設置MB2信號為1,真實變位機正轉,同時變位機仿真程序也開始運行。設置MB2信號為0,真實變位機回零位,同時仿真程序驅動虛擬變位機回零位[7]。
本文通過RoboDK中Python的API接口,實現機器人關節目標值的讀取,并且利用了RoboDK API接口中Robolink模塊,完成了從實際機器人控制虛擬機器人的伴隨仿真。拓展了該軟件的新功能,并且可在其他支持TCP/IP通信的機器人上進行相關測試。該功能可在離線環境中實時觀測機器人的位置,便于機器人位置的監控,且可以方便機器人創建相對工件坐標系。對于離線軌跡的創建也較為方便,在離線仿真中意義重大。同時也實現與PLC控制系統之間的信號交互,可實現與實際設備之間的伴隨仿真。目前該系統功能測試階段已過,處于程序優化階段,但基本功能已經實現。今后將繼續優化該系統的兩大功能,進一步完善RoboDK相關拓展功能[8-9]。