錢小平,楊慶華,荀 一,鮑官軍
(浙江工業大學特種裝備制造與先進加工技術教育部/浙江省重點實驗室,浙江杭州310032)
隨著網絡的飛速發展,在網絡上實現虛擬現實系統的研究越來越成為熱點。在機械仿真領域中,利用便捷的網絡對創建的機械臂三維仿真虛擬環境實現異地共享,與Internet集成后運行在不同平臺上,從而實現“一次書寫,隨處運行”應運而生,而且極大地加快了仿真系統的開發。
1997年,SUN公司推出了跨平臺的三維圖形開發工具包Java 3D。Java 3D是Java 2SDK的標準擴展,它將OpenGL和DirectX這些底層技術包裝在Java接口中,這種全新的設計使3D技術變得不再繁瑣并可加入J2SF,J2FF整套架構,保證了Java3D技術強大的擴展性[1]。Java 3D本質是一個交互式的三維圖形應用編程接口,因此其可以和普通的Java 2D、Swing、Applet等很好地結合。它支持導入外部3D圖形文件。采用Pro/E,3DMAX等建模軟件,直觀、可視地建立零件模型,并給模型設置材質和貼圖,再利用Loader接口將建好的模型導人到Java3D場景中,這樣就大大減少了工作量,使設計者能夠把更多精力放在人機交互等更深入的研究上。因此,Java3D成為編寫三維應用程序的優越工具,在三維動畫、機械建筑仿真等領域有著廣泛的應用[2-3]。基于Java3D的機械臂三維虛擬場景創建及運動學仿真就是在這種背景下提出來的。
本研究在分析Java3D三維造型原理以及外部模型格式比較基礎上,將機械臂各關節造型導入到Java3D場景中進行裝配,最終在Java3D中實現四自由度機械臂仿真虛擬場景。最后,采用標準的D-H法對機械臂進行正、逆運動學分析,在Java中完成運動學仿真功能的實現。
Java3D作為Java語言在三維領域的擴展,是純粹的面向對象結構。其數據結構采用Scene Graph Structure(場景圖),這為描繪和渲染場景提供了一個簡單、靈活的機制。
Java3D場景圖是 DAG(Directed-acyclic Graph),即具有方向性的不對稱圖形[4]。在Java3D的場景圖中,最底層(根部)的節點是Virtual Universe,每一個場景圖只能有一個Virtual Universe。在Virtual Universe上面,就是Locale節點,絕大多數程序只有一個Locale,每一個Locale上面擁有一個或多個BranchGroup節點。要想建立三維應用環境,必須建立所需要的形體(Shape),給出外觀(Appearance)及幾何(Geometry),再把它們擺放在合適位置,這些形體及其擺放位置都建立在BranchGroup節點上,擺放位置通過另一節點TransformGroup設定。另外,安放好形體后,還需設定具體觀察位置,用View Platform表示,它也建立在TransformGroup節點之上。場景圖結構如圖1所示。
在Java3D編程過程中,三維形體是重要的處理對象,可以有3種方式生成需要的三維形體:①利用Java3D提供的用于編寫點、線、面的類生成點、線、面對象;②使用Utility里面用來生成基本形體的geometry classes;③通過調用外部其他格式的三維圖形文件,生成復雜的三維形體對象。

圖1 場景圖結構
Java3D提供了基本形體以及編寫點、線、面各種對象的應用,這些可用在應用程序之中構造簡單的形體,然而復雜的形體則很難實現。可以通過調用其他格式的三維圖形文件獲得復雜形體,如直接調用VRML2.0、OBJ和 Lightwave格式的三維圖形文件,或者通過處理,間接調用DWG,DXF,3DS等格式的三維圖形文件。這些格式的三維模型可以很方便地應用在Java3D程序中。
四自由度機械臂的模型相對比較復雜,主要由基座、腰關節、肩關節、腕關節、肘關節等關節以及各連接手臂組成。復雜的形體一般很難通過編程直接實現建模。VRML和Java3D等建模語言由于受到模型復雜性的限制,一般只適用于建立一些相對比較簡單的基本模型或是由這些基本形體組成的規則模型。對于比較復雜的不規則模型(如機械臂模型),工作量相當大,并且難以實現精確建模。為了提高效率,研究者應充分利用在工程設計過程中已經大量存在的各種類型的CAD圖形文件。在比較多種格式的基礎上,本研究采用Java3D與VRML相結合的方式構建機械臂三維虛擬場景。
Java3D 支持導入的常見文件格式有:wrl、obj、3ds。3ds文件不易控制模型材質和組件,因而不適合作為模型文件格式。wrl與obj格式比較結果如下:
(1)wrl文件遠小于obj文件,wrl文件大小不到obj的1/10,這樣大大提高了數據傳輸率。
(2)wrl文件數據信息完整,obj文件不包含材質信息,而wrl文件數據信息較完整,包含幾何模型數據和材質數據。
(3)wrl文件可用VRML語言進行優化。
可見,VRML作為虛擬現實建模語言[5],具有文件體積小、易于編輯、適于網絡傳送等特點。另外,大多數CAD軟件都支持靜態的三維零件的VRML格式輸出,例如UG、Pro/E等,或者提供了不同文件類型的轉換,如3DSMAX可以讀入DWG、3DS格式的文件,并把它們轉換成VRML2.0格式。因此本研究在對obj、3ds與wrl這3個文件格式進行比較基礎上,選擇wrl格式作為機械臂各關節模型的保存格式,用以后續導入到Java3D場景中。
現在比較流行的三維建模軟件如 UG、Pro/E、3DSMAX等都提供VRML接口。UG和Pro/E支持VRML2.0格式,但輸出的 VRML代碼格式不規范。3DSMAX具有強大的建模功能,它提供的VRML97 Exporter可將創建的3D場景經過優化后轉換成標準的VRML格式直接加入到最終場景中,轉換后的VRML文件較3DS文件大大減小,從而降低了模型文件網絡傳輸時間。
3DSMAX由于其獨特的優點,本研究選用3DSMAX作為機械臂關節模型的創建工具。三維模型在最終導入Java3D之前還需要進行相關處理。本研究在3DSMAX里修改零件之間的鏈接關系,對需要旋轉的物體設置好旋轉軸,以便設置正確的運動關系,從而建立高質量的虛擬原型,然后輸出Vrml97格式,利用Vrml97 Loader導入到Java3D虛擬空間中。
四自由度機械臂主要部件有基座、腰關節、肩關節、肘關節、肘腕關節、腕關節等。各關節在3Dmax8.0中造型時以3DS格式保存,最終輸出對應的VRML格式。以基座和二指手關節為例,3DSMAX創建并修改后得到的造型如圖2所示。

圖2 機械臂關節的3DS模型
Java3D 的 com.Sun.j3d.loaders包中包括 Loader和Scene兩個接口,在Java3D中調用不同格式的3D圖形文件,應根據這兩個接口編寫自己的Loader類。在Java3D中使用VRML格式外部模型是通過Vrml97 Loader實現的,需先下載VRML97.jar,并設置好其路徑,通常放在“%JAVAHOME%lib”目錄中。導入時需要用到VrmlLoader和Scene兩個類,其中VrmlLoader提供了用于載入圖形文件的方法,Scene則用來容納載入的圖形。當Scene中賦以圖形對象后,可使用TransfomGroup對象裝載該圖形對象中的3D模型,以便后續裝配時對其進行方位調整。具體方法如下:
(1)創建形體所在的局部坐標系:

(2)設置VRML文件的導入接口:

(3)將VRML造型添加到場景中:

各關節的導入都基于以上原理,當在一個場景中多次調用外部的VRML文件時,本研究可以把用于處理調用問題的部分提取出來單獨作為一個類,以便多次重復使用。以基座和二指手關節為例,機械臂關節模型導入Java3D場景的相關程序運行結果如圖3所示,用以后續組合裝配成完整機械臂。

圖3 機械臂關節的VRML模型導入Java3D場景
機械臂作為一個裝配體,由各關節零件與手臂裝配而成。其中每個關節零件由 VRML造型,通過VRML97Loader轉換為對應的BranchGroup對象后被添加到三維場景中;手臂造型則直接采用在Java3D場景中通過生成圓柱體這種基本形體的方法。
當各關節完成建模并導入Java3D場景后,便可利用形體變換類 TransformGroup,Transform3D來組裝。本研究對每個單獨關節設置一個局部坐標系Trans-formGroup,然后根據各關節位置姿態利用Transform3D的方法將它們進行重組并建立鏈接關系。組裝時最關鍵的是使每一個部件自身運動對其他部件的影響正確體現出來,并且這些部件能夠正確動作。為此,需將動作從屬于A的部件B的transformGroupB加入到transformGroupA中,并使各個部件能繞正確的軸心轉動。
構建機械臂仿真模型的關鍵代碼如下:

實驗室的機械臂實物模型如圖4所示。

圖4 機械臂實體模型
Java3D構建的機械臂虛擬模型如圖5所示。

圖5 Java3D機械臂虛擬模型
導入VRML造型文件到Java3D場景后,便可利用Java3D非常完善的API進行相關操作,使三維程序實現所需的人機交互行為。
Java3D中可以利用一系列Interpolator內插器對象與Alpha對象結合來編寫各種三維應用動畫程序。其中Alpha對象提供了時間控制環節,內插器定義了三維形體如何在空間做運動[6]。
對于虛擬仿真而言,交互是必不可少的,Java3D中可以利用Java事件處理機制實現交互[7],也可通過Behavior類的子類來實現交互。設計者利用Java3D提供的鼠標、鍵盤交互等技術就可以實現簡單的人機交互,也可對Java 3D里已存在的行為類改寫[8],以滿足自身特定需要,實現進一步的復雜人機交互。
Java3D 中的 MouseZoom、MouseRotate、MouseTranslate、MouseWheelZoom、KeyNavigator類可以實現鼠標、鍵盤對構建的機械臂運動仿真三維虛擬場景進行漫游,關鍵代碼如下:

機械臂的三維運動仿真是以正、逆運動學為基礎[9],仿真需要得到機械臂正、逆運動學方程。位置逆解問題是最重要的研究問題,它直接關系到機械臂離線編程、軌跡規劃和實時控制等工作。本研究采用標準D-H參數法建立機械臂正運動學模型,用解析法推導出逆運動學模型,為后續仿真奠定基礎。
已知各關節角度求末端執行器位置,稱為正向運動學[10]。兩桿間位姿矩陣是求手部位姿矩陣的基礎,從基坐標系到末端連桿坐標系順序相乘可得到機器人的運動學方程。
D-H法建立兩桿間位姿變換矩陣[11]為:

本研究對所研究的四自由度機械臂各關節建立坐標系,并采用簡化的線模型表示,機械臂關節坐標如圖6所示。

圖6 機械臂關節坐標系
本研究根據表1中D-H參數建立相鄰關節間變換矩陣,然后相乘,最后得到正運動學方程。

表1 機械臂D-H參數表
正運動學方程為:

已知機械臂末端位姿求解各關節的角度值θ1,θ2,θ3,θ4,稱為運動反解。采用矩陣逆乘法求得機械臂運動學逆解為:


計算出所有可能解后,由于關節運動范圍限制,本研究對某些解(甚至所有解)進行剔除,以選取最接近當前操作臂的解[12]。
對機械臂的正、逆運動學分析與求解后,即可在Java中實現四自由度機械臂正、逆運動學的相關仿真。采用Java Swing技術開發的運動學仿真界面及本研究具體的運動學仿真模塊如圖7所示。當機械臂末端位置取值為(800,0,349)時,仿真可得機械臂4個關節角度值分別為0.000,-45.007,-67.229,22.236。

圖7 機械臂運動學仿真
正運動學仿真實現的關鍵代碼如下:


逆運動學仿真實現的關鍵代碼如下:

通過應用Java3D可以開發出具有高度視覺真實感的3D圖形應用程序。該程序可成為Applet被插入到HTML中用支持Java的網頁瀏覽器進行操作,并在瀏覽器上實現瀏覽或交互,以及實現基于Web的特點。它的最大優勢在于代碼的可傳輸性,生成的可視化場景由服務器方便地傳輸給客戶端,然后在客戶端本地運行。正因為如此,結合VRML文件的通用性和Java3D對三維場景強大的操作性及跨平臺性,Java3D被用來在網頁上構造動態的三維世界和虛擬現實。構建基于Java3D的網絡交互式三維虛擬環境對開發機械臂運動仿真系統具有很大的意義。
下一步,本研究將充分發揮Java 3D在網絡三維仿真領域的強大優勢,繼續深化Java3D機械臂仿真系統的開發。
[1]SUN Inc..Java3D/Tutorial[EB/OL].[2005 - 05 - 07].http://java.sun.com/products/java-media/java 3D.
[2]都志輝.Java3D編程實踐 -網絡上的三維動畫[M].2版.北京:清華大學出版社,2002.
[3]張 杰.Java3D交互式三維圖形編程[M].3版.北京:人民郵電出版社,1999.
[4]鮑彥如,任長明.Java3D實現VRML瀏覽器新途徑[J].計算機應用研究,2001,12(2):23-25.
[5]黃鐵軍,柳 健.VRML國際標準與應用指南[M].北京:電子工業出版社,1999.
[6]李 敏,丁友東.Java圖形與動畫編程實例[M].北京:清華大學出版社,2003.
[7]王 鵬,何昀峰.Java Swing圖形界面開發與案例詳解[M].北京:清華大學出版社,2008.
[8]鄧文生,馬王俊美.Java3D擴展鼠標交互功能的研究與實現[J].計算機仿真,2007,4(3):176-179.
[9]蔡自興.機器人學[M].北京:清華大學出版社,2000.
[10]王庭樹.機器人運動學及動力學[M].西安:西安電子科技大學出版社,1990.
[11]侯國柱,孔慶忠.關節型機械臂運動學分析及雅可比矩陣求解[J].寧夏工程技術,2007,5(4):36-38.
[12]姜宏超,劉士榮,張波濤.六自由度模塊化機械臂的逆運動學分析[J].浙江大學學報:工學版,2010,44(7):1348-1354.