李泰國,李文新,王偉文,高家祺
(蘭州空間技術物理研究所,甘肅 蘭州 730000)
隨著空間探索的不斷深入,空間機械臂應用技術已經成為空間技術的重要研究方向。由于機器臂結構復雜、真實設備成本昂貴、實驗條件受限等問題,會對機械臂的實驗研究開展帶來一定難度。因此,在機械臂的設計研究中,圖形仿真系統作為一種安全靈活的工具,發揮著非常重要的作用,并廣泛應用于機械臂研究和開發的各個方面。機械臂圖形仿真涉及機械臂機構學、運動學、零件建模、機械臂三維實現、運動控制和機械臂路徑規劃,是一項綜合性的有創新意義和實用價值的研究課題。因此針對機械臂在不同平臺下(如OpenGL、MATLAB機器人工具箱、LabView、ADAMS等)不同性能的仿真試驗,給機械臂的研究帶來了便利。能夠為機器臂結構方案與相關設計提供強有力的支撐;能夠有效地幫助設計師掌握機械臂工作空間的形態和極限;也能夠為離線編程人員提供一種有效的驗證手段;還能幫助檢測機械臂的工作環境與機械臂之間是否存在干涉,以保證機械臂運行的絕對安全等[1-4]。
目前,存在多種設計軟件方便進行機械臂的仿真研究,包括三維設計軟件UG、Pro/E、Solidworks,仿真軟件ADAMS、機器人專用軟件WorkSpace、專用計算軟件Matlab等。但是從三維建模,嵌入控制算法,實現3D仿真難易程度等多方面進行分析,發現UG、Pro/E、Solidworks等在機構仿真方面有一定的優勢,但是難以滿足機械臂控制仿真的要求;ADAMS和WorkSpace等仿真軟件在嵌入用戶開發算法方面存在明顯的不足;Matlab在算法開發和正確性驗證方面有優勢,但是難于直接對控制器進行驅動。而OpenGL是一個跨平臺、開源的圖形程序接口,具有較好的可視化功能,能夠為仿真及場景可視化提供較好的環境,可使用光效、霧效、紋理等特效功能,模擬現實世界物體對光的反射、散射原理,增強了曲面的材質感和臨場感,達到了良好的現實逼真效果。采用OpenGL技術,在Windows環境下以Visual C++為基礎進行機械臂三維重構可視化研究,便于嵌入用戶控制算法,滿足機械臂控制仿真的要求。
在計算機圖形學中有兩種方式表示三維模型:多邊形構成和NURBS曲面構成。在三維圖形的繪制過程中,如果直接利用OpenGL庫提供的基本幾何體構造復雜的圖形是相當困難的。原因在于OpenGL只能通過基本的幾何圖元點、線及多邊形建立三維模型,但是它不提供建立三維模型的高級命令。此外,如果直接利用OpenGL繪制復雜三維模型,則需要在程序設計時使用大量的繪圖語句。這樣OpenGL程序在運行時將占有大量內存,導致程序執行效率降低,相應地會增加程序設計的復雜度和工作量;并且程序的通用性和簡便性很難滿足,給系統的開發帶來了極大困難。
由于OpenGL對模型的數據格式相對比較通用,沒有特殊的要求。在仿真研究過程中比較可取的做法是先利用專業建模軟件(如3D Studio MAX、Pro/E等)建立需要的三維模型,然后轉換為OpenGL可以識別的模型數據格式(如3DS文件、STL文件等),最后將創建的模型數據導入OpenGL。然后在開發環境(Visual C++、LabView等)中直接獲取模型數據,結合OpenGL進行繪制及交互控制。該方法的優勢在于可以利用專業建模軟件3D Studio MAX的優點,快速建立復雜三維模型,還可以借助OpenGL的編程接口對模型進行實時繪制和交互控制,提高程序的執行效率,降低建模時間,加快系統開發進程[5-8]。
利用3D Studio MAX軟件創建模型并導出成3DS文件的流程如圖1所示。

圖1 3DS文件創建流程
3DS文件結構由Chunk(塊)組成,每個Chunk描述了諸如場景數據,每個編輯窗口的狀態、材質、網格數據等[9]。Chunk由兩部分組成:ID和Length(下一個數據的位置)。二進制的3DS文件采用小尾端格式存儲,即低字節在前,高字節在后。3DS中每個塊的數據組織格式包括“塊ID”、“塊長度”和“塊數據”。
每個3DS文件都包括一個塊ID是“0x4D4D”的基本塊。基本塊是在3DS文件中必須存在的,也可用于檢測一個文件是不是3DS文件,它由ID為“0x3D3D”的編輯塊和ID為“0xB000”的關鍵幀塊組成。3DS編輯塊表明程序數據的開始,包括材質列表塊、兩配置塊、視口定義塊、物體定義塊等。3DS關鍵幀塊表明開始定義關鍵幀信息。3DS主要的幾個塊的ID及信息,包括(0xAFFF,材質信息開始)、(0xA000,材質名稱)、(0xA300,材質紋理名稱)、(0x4130,與三角面相關的材質信息)、(0x4000,模型中對象信息)、(0x4110,對象中定點信息)、(0x4120,對象中三角面信息)、(0x4140,紋理坐標)。
為使Windows能正確執行OpenGL的API函數,首先必須對繪圖環境進行初始化,只有在OpenGL繪制環境中,OpenGL命令才能被接收并執行,所以必須創建OpenGL繪制環境。OpenGL繪制環境初始化過程如表1所示。

表1 OpenGL繪制環境初始化
如1.2節所述,3DS文件中采用的是塊結構,并且塊與塊之間存在嵌套關系,所以可以采用遞歸的方法讀取3DS文件中的三維模型數據。基于面向對象的程序設計思想,設計了5個類用于空間機械臂3DS文件的讀取和重繪,分別是tChunk(定義塊信息)、t3DModel(定義模型信息)、t3DObject(定義模型對象信息)、tMaterialInfo(定義材質信息)和tFace(定義頂點信息和紋理坐標信息)。3DS文件讀取的算法偽代碼如下所述:
參數定義為:
ChunkLength:表示3DS文件長度;
ReadBytesLen:表示讀出的數據字節數;
TempBytesLen:用于保存讀出數據字節數的臨時變量。
算法步驟:
Step1:初始化變量,打開3DS文件;
Step2:讀取第一塊數據的ID及數據長度ChunkLength;
Step2.1:判斷ID為0x4D4D,ReadBytesLen加6,執行Step3;
Step2.2:判斷ID不為0x4D4D,則執行Step6。
Step3:讀取下一塊數據的ID及數據長度TempBytesLen;
Step3.1:判斷ID為0xA000,則將解析后的材質名稱保存至材質信息名稱隊列;
Step3.2:判斷ID為0xA020,則將解析后的材質顏色保存至材質信息顏色隊列;
Step3.3:判斷ID為0xA200,則將解析后的紋理信息保存至紋理信息隊列;
Step3.4:判斷ID為0xA300,則將解析后的材質文件名稱保存至材質文件名稱隊列;
Step3.5:如果為其他ID,忽略其數據信息。
Step4:ReadBytesLen=ReadBytesLen+TempBytesLen;
Step5:判斷已讀入數據長度ReadBytesLen是否小于塊長度ChunkLength;
Step5.1:如果ReadBytesLen小于或等于ChunkLength,繼續執行Step3;
Step5.2:如果ReadBytesLen大于ChunkLength,執行Step6。
Step6:程序結束。
將三維模型及場景數據從3DS文件讀出后,需要在OpenGL環境下完成三維模型的重繪[10-11]。三維模型重繪算法偽代碼如下所述:
參數定義:



算法步驟:
Step1:計算3DS模型中各個面的法向量;
Step1.4:保存計算后的各個面的法向量。
Step2:設置三維模型的材質紋理;
Step3:設置OpenGL繪圖環境;
Step3.1:創建繪圖描述表并設置像素格式;
Step3.2:初始化模型、大??;
Step3.3:設置光照、旋轉角度、轉速及模式。
Step4:遍歷3DModel對象,對存儲的對象逐一進行繪制,如果有紋理映射信息,則打開紋理映射;
Step5:開始以ViewMode模式繪制,先遍歷所有的面,然后嵌套遍歷三角形所有的點,獲得面對每個點的索引。給出法向量,最后完成繪制;
Step6:根據機械臂運動學求解結果判斷機械臂是否需要重繪;
Step6.1:如果是機械臂正運動學控制,則按從以太網接收到的機械臂各關節角的個數進行機械臂形狀的重繪;
Step6.2:如果是機械臂逆運動學控制,則根據從以太網接收到的機械臂末端狀態解算出各關節角,再進行機械臂形狀的重繪。
Step7:程序結束。
空間七自由度機械臂是一個完全結構對稱的冗余型機械臂,與臂桿兩端相連接的3個關節完全相同并且對稱。通過對空間機械臂的結構特征進行分析,建立的空間機械臂D-H坐標系如圖2所示,D-H參數如表2所示。

圖2 空間機械臂D-H坐標系

連桿iθidi/mmai-1/mmαi-11θ1000°2θ2d2090°3θ3d3a3-90°4θ40a40°5θ5d500°6θ6d6090°7θ7d70-90°
其中,d2=d3=d5=d6=d7=515;a3=a4=5 540。
根據機械臂D-H參數可以完成機械臂的正運動學和逆運動學的求解,根據正運動學的解算可以完成機械臂正運動的仿真控制;若已知機械臂末端執行器的坐標位置,則可以通過該位置坐標結合逆運動學求解公式計算出機械臂各個關節的角度值,可以完成機械臂的逆運動控制及路徑規劃控制。將機械臂的正逆運動學的求解算法嵌入基于OpenGL的空間機械臂三維模型中,通過利用圖形程序接口來完成場景及三維模型的更新顯示,以此可以達到動態顯示三維仿真的效果[12-14]。
根據系統需求分析,空間機械臂三維可視化系統的整體架構設計如圖3所示。
在設計完成后,在Visual C++環境下該系統的運行效果如圖4所示。

圖3 機械臂三維可視化系統架構

圖4 空間機械臂三維可視化系統運行效果
利用3D Studio MAX建模具有模型逼真形象、開發效率高的特點,完成空間機械臂三維模型及場景的創建。在Visual C++ 6.0環境下,完成三維模型數據3DS文件的讀取與解析,采用OpenGL技術進行三維模型的重繪,大大降低了OpenGL建立復雜模型的難度。在此基礎上,運用OpenGL對三維模型的處理技術,對三維模型場景進行實時渲染,使得生成的場景逼真,真實感強。建立的空間機械臂三維可視化系統可實現空間機械臂的運動學仿真,為進一步研究空間機械臂的路徑規劃研究奠定基礎。
[1] 唐立才,張海濤,張敬鵬,等.基于OSG的空間機械臂三維仿真平臺的設計與實現[J].計算機測量與控制,2015,23(3):987-989.
[2] 廖 明,周良辰,閭國年,等.基于OpenGL驅動的三維場景重構[J].計算機應用研究,2015,32(4):1276-1280.
[3] 董天平,馬 燕,劉倫鵬.基于OpenGL的工業化機器人仿真研究[J].重慶師范大學學報:自然科學版,2013,30(2):60-64.
[4] 陳 琳,戴 駿,馮俊杰,等.基于OpenGL的多機器人仿
真環境[J].組合機床與自動化加工技術,2014(9):10-13.
[5] 李 新,李珊珊.3ds模型在OpenGL中的讀取和重繪[J].首都師范大學學報:自然科學版,2008,29(2):101-104.
[6] 萬 鵬,姜立軍,陳學東,等.基于圖像處理的外螺紋三維模型重構[J].圖學學報,2012,33(1):68-72.
[7] HERBORT S,WOHLER C.An introduction to image-based 3D surface reconstruction and a survey of photometric methods[J].3D Research,2011,2(3):1-17.
[8] MERAT P,AGHILI F,SU Chunyi.Modeling,control and simulation of a 6-DOF reconfigurable space manipulator with lockable cylindrical joints[C]//International conference on intelligent robotics and applications.[s.l.]:[s.n.],2013:121-131.
[9] 劉志林,蘇 麗.基于COSMOSMotion的機械臂三維虛擬仿真[J].機械設計與制造,2010(12):92-94.
[10] Shreiner D.OpenGL編程指南[M].王 銳,譯.第8版.北京:機械工業出版社,2014.
[11] 錢小平,楊慶華,荀 一,等.基于Java3D的機械臂三維虛擬場景創建及運動學仿真[J].機電工程,2014,31(1):47-51.
[12] CHEN M Q,GONG Y W. Research on technology of three-dimension Roam based on OpenGL[C]//International conference on computer application and system modeling.[s.l.]:[s.n.],2010:562-564.
[13] LIU N,PANG M Y.Rendering soft shadows with OpenGL based on planar projection method[C]//2nd international conference on network infrastructure and digital content.[s.l.]:IEEE,2010:235-239.
[14] 僧德文,李仲學,李春民,等.基于OpenGL的真實感圖形繪制技術及應用[J].計算機應用研究,2005,22(3):173-175.