趙正旭,左宗成,申躍杰
(石家莊鐵道大學 復雜網絡與可視化研究所,石家莊 050043)
隨著科技的不斷發展,人類對地球的探索已經遠遠不能滿足人類的好奇心,自上世紀中期人類第一次發射衛星進入太空到現在人類已經探索距離地球更遠的空間,航天科技已經取得了質的飛躍[1].當下我國正在為進行探月工程月面無人采樣并安全返回地面的任務的緊急籌備中,因此尋找到一種可以可視化顯示月球探測器的途徑,可以為月面無人采樣的成功實施提供一定的保障.
目前,市場上存在著很多對空間機器人進行仿真的軟件,例如 MATLAB、unity3d、VRP(VR-Platform)、Virtool、VEGA、OGRE、OSG等等.其中MATLAB的優勢在于數據的可視化及分析上,它無法滿足實現對空間機器人的精確控制; 而unity3d主要應用于游戲行業的開發,但是對顯卡的要求較高,不適合低端機器需求的高端渲染效果; VRP更適用于場景的顯示模擬,例如城市規劃設計、工業仿真、室內場景動態顯示等[2].Virtool、VEGA、雖然對編寫代碼的需求較小,但是Virtool的缺點在于雖然是中文界面顯示,但是在開發過程中不支持中文輸入; VEGA只支持.fit格式文件,只能由配套的Creator軟件來建立模型,從而導致模型使用的方式過于單一; OSG和OGRE都是以C++進行開發的,這兩者十分相似,但是OGRE偏向于游戲開發,而OSG更偏向虛擬仿真,同時它更加強調庫的功能性.
OpenSceneGraph簡稱OSG,是以OpenGL底層渲染API為基礎,采用C++語言編寫,提供了大量的第三方庫,并且隨著技術的不斷發展,該庫也在不斷被完善[3,4].相比于OpenGL具有性能高、快速開發、可擴展性和可移植性強等優勢,同時它能夠讀取二維和三維圖像的格式,其中二維圖像支持的格式有.gif,.tiff,.bmp等,支持三維圖像的格式有.3DS,.obj等.因此利用OSG的第三方庫在Windows下以Qt和C++為基礎來研究對空間機器人的三維仿真具有重要意義.
本研究的完成是在基于Windows 7環境下借助Microsoft Visual Studio 2008、Qt和OSG來實現最終的可視化效果,因此需要的主要工有如下9種:
(1) 64位Windows 7操作系統的電腦1臺;
(2) Microsoft Visual Studio 2008;
(3) Cmake-3.8.0-win32-x86.exe;
(4) OpenSceneGraph-3.0.0.zip;
(5) OpenSceneGraph-Data-3.0.0.zip;
(6) 3rdParty_VC9sp1_x86_x64_V7.zip;
(7) Autodesk 3ds max 2011;
(8) qt-win-opensource-4.7.4-vs2008;
(9) qt-vs-addin-1.1.11-opensource.
其中(3)Cmake-3.8.0-win32-x86.exe是用來對OSG源代碼的軟件,并生成(2)Microsoft Visual Studio 2008能運行.sln文件; (4)OpenSceneGraph-3.0.0.zip中存放著OSG的源代碼; (5)中存放著有關于OSG中的實例數據和一些物體模型,如cow.osg、avatar.osg、lz.osg等; (6)3rdParty_VC9sp1_x86_x64_V7.zip中含有編譯所依賴的OSG第三方庫; (7)Autodesk 3dsmax 2011用于研究中所需的月面探測器的模型創建;(8)為Qt4.7.4的安裝包,它是一款跨平臺的C++圖形用戶界面應用程序開發框架,本研究中利用該軟件來搭建可視化平臺的界面; (9)是一款可以讓Qt在VS2008上進行程序編寫和框架搭建的插件.
上述(1)~(6)的工具是用于編譯生成OSG的庫,并應用在本研究中的場景模型的顯示,在安裝完成相應的軟件后,生成OSG的過程如圖1所示.

圖1 OSG編譯和生成過程
OSG雖然是以OpenGL為底層進行渲染的,但是同樣也同OpenGL一樣無法進行直接高效地建模.OSG中共有三種生成模型的方式: (1) 通過OpenGL的繪圖基元封裝后產生的幾何體,如osg:: Geometry; (2)OSG本身所攜帶大量的模型,這些模型可以滿足用戶學習使用; (3) 通過第三方建模軟件創建三維模型并導入OSG場景中.本研究需要使用指定的空間機器人的模型,第一種方法需要花費大量的時間和精力,同時因為需要使用大量的繪圖語句,這將會使內存占用過多,從而降低了程序的執行效率[5]; 第二種方法OSG的模型庫中不能提供本研究中所需的模型,因此采用第三種方法可以滿足本研究中的需求.
市場上有很多功能強大的建模工具,比如Autodesk 3ds Max、Maya、ZBrush、Blender等等,它們都能夠為建立三維模型提供很多高級命令,而本研究決定選用Autodesk 3ds Max 2011軟件創建三維模型,并導出生成.3DS格式的文件.
探月工程探測器是由著陸器、上升器、軌道器和返回器等多個部分組成,通過對月面采樣的著陸器的結構特征分析,對著陸器、上升器的主體部分建立三視圖如圖2所示.
圖2(a),(b),(c)為著陸器的前視圖、頂視圖和左視圖,分別有太陽能電板、點火裝置、土壤采集罐和機械臂等組成.著陸器的作用是為了實現在月球表面實現軟著陸,并且通過自身攜帶的機械臂完成月面土壤的采集和封罐任務.太陽能電板將太陽能轉化為電能存儲起來,為月面采樣和地月通信提供基礎保障; 雷達用于月面通信,比如月面環境信息的傳輸,接收地面控制機械臂的指令信息等等,點火裝置能夠為月面軟著陸提供動力.采樣罐用于接收機械臂采集的樣本,并存儲這些樣品.機械臂為四自由度機械臂,即分為四段機械短臂和四個關節點.在整個探月工程中,地面人員通過遙操作系統控制機械臂來改變位置及姿態來完成月面無人采樣任務.
圖2(d)、(e)、(f)分別為探測器上升器的前視圖、頂視圖和左視圖,由點火裝置、雷達等組成,它的作用是在完成月面采樣和封罐任務后,攜帶月面土壤樣本上升至月面軌道,與月面軌道上的軌道器進行交會對接,最終月面土壤被送至返回器內,由返回器攜帶月面樣本抵達地面.

圖2 著陸器和上升器的三視圖
Autodesk 3ds max軟件提供了多種建模方式,如:基礎建模、復合建模、多邊形建模、面片建模和NUBRS建模等.其中多邊形建模是利用3dsmax中已有的幾何體或者自行創建的幾何體進行修改而創建生成的模型,面片建模適用于一些表面性的建模,如樹葉等,NUBRS建模已經不是現在的主流建模方式,需要使用時基本靠插件來實現,經過分析,本研究綜合使用多邊形建模、基礎建模和復合建模三種方式.本研究使用多變形建模來創建著陸器、上升器等; 使用基礎建模和復合建模生成腳架和機械臂.
模型創建完成后,需要對模型添加紋理材質.在單個模型對象中需要用到多種貼圖材質,若對模型單個對象分離成多個對象進行貼圖,則會占用多個材質球,同時增加文件的大小,不利于后期的處理及導出生成.3DS文件格式,經過分析,決定采用多維子材質對模型進行貼圖處理.
通過上述2.1中的三視圖在Autodesk 3ds max 2011軟件中使用各種高級命令創建三維模型,并生成.max和.3DS文件,整個過程的流程圖如圖3所示.
3DS文件是由一個ID是“0x4D4D”的基本塊(chunk)通過樹狀結構組成,這個基本塊是3DS文件中必不可少的,是用于判斷該文件是否為3DS文件.一個塊由三部分組成,塊的ID,塊的長度和塊的數據內容,而數據內容中又可以包含子塊,同樣的每個子塊中也可以包含它結構下的子塊[6,7].在塊的模式中,它的總字節為塊的長度,其中ID占用前面2個字節,接下來有4個字節來存儲塊的長度,最后剩下的字節用于保存塊的數據信息內容[8].
3DS文件是一種小型文件,它能存儲的場景內當個單個模型不能超過64 000個面,在建模完成后需要計算3ds max中各個對象的面的總數,若場景內單個對象超過64 000個面,可以通過軟件中命令修改器中提供的MultiRes、ProOptimizer等各種命令來對模型進行優化,這些命令能夠減少模型的面數和頂點數,同時對模型最終的渲染效果的影響最小.若是對象在減面后仍然無法滿足導出.3DS格式的需求,可以將單個對象進行分割變成多個對象,同時又要保證盡量對象的個數比較少.

圖3 3DS文件創建的流程圖
3DS文件在導出后無法保存位圖等貼圖,只能保存漫反射的材質顏色,因此在導出3DS文件的同時利用3ds max中的資源收集器將相應的模型材質導出,并且在使用這些3DS文件中的模型時要重新附上貼圖.
搭建可視化顯示平臺界面可以更加方便用戶對三維模型等的資源管理,有效地減少了用戶尋找模型位置所花的時間.本研究使用Qt4.7.4和OSG庫基于Windows7環境下使用C++編程語言搭建可視化界面.可視化顯示系統能夠讓月面探測器顯示在場景中,同時能夠實現簡單的縮放、旋轉功能,能夠進行多方位的觀測探測器.
使用Qt4.7.4在VS2008上進行可視化系統的界面設計,在該界面的菜單欄中有任務、窗口、幫助這三個菜單項,其中任務菜單中含有用于探月工程的各項任務列表,而探測器可視化顯示為其中的任務之一,窗口菜單是自定義窗口布局,幫助菜單是有關該系統的相關說明.
在菜單欄下方左邊是資源管理器、文件管理器和任務管理器三個子窗口,通過分頁的方式顯示出來,右側是任務窗口,如可視化顯示界面分布在該位置.
最下方的左右兩邊是相關進程的信息,分別為文件接收信息,后臺監控信息和文件查詢結果等.
三維重構可視化需要借助OSG中的各種庫,通過這些庫可以完成對整個探測器的文件模型的三維重構,并實現對場景中探測器的旋轉,縮放,移動等功能.整個三維重構所涉及到有關OSG庫和工具庫說明如下.
osg庫,提供用于創建場景中的二維或三維圖形的節點類,向量和矩陣運算的類、三維模型變換的類和有關渲染的類等.這些類主要有osg::Geode,osg::Vec3,osg::Position Attitude Transform,osg::Vec4,osg::ShapeDrawable,osg::MatrixTransform等.
osgViewer庫,主要用于OSG的視窗管理,它提供了各種視口類,并且能與Qt結合使用.相關的類如osgViewer::Viewer[9].
osgUtil庫,該庫包含的類主要用于渲染器的創建和對osg場景中的模型進行相關的操作.
osgDB庫,提供三維模型數據庫類和方法,可用來實現對模型的讀取,從而實現模型顯示在場景中的功能.如osgDB::readNodeFile().
將模型顯示在場景中有多種方法,可以對模型整個全部一次性加載到場景中,也可以對模型進行分割依次導入到場景中.考慮到后續月面無人采樣時控制機械臂移動,本研究中采用將整個探測器模型分割開來分別加載到場景中.分別為四段機械臂,四個關節點和一個探測器主體共九個3DS文件.在將3DS文件加載到場景后,在程序中相關的參數描述如表1所示.
將探測器模型分為九個部分之前,要對九個分開的模型的坐標軸的位置進行調整,探測器主體的坐標位置為第一段機械臂的位置,機械臂mj_1的坐標軸位置和探測器主體的位置相同,機械臂mj_2的坐標軸位置在機械臂mj_1的末端,機械臂mj_3的坐標軸位置在機械臂mj_2的末端,同理機械臂mj_4坐標軸的位置在機械臂mj_3的末端.場景中坐標軸的位置能使探測器能夠很好的連接起來并使后續機械臂移動時不會破壞模型的整體效果,使的三維重構趨于真實情況.
要對其分別加載到場景中,本研究從探測器主體開始依次加載剩余的文件,直至完成所有3DS文件的讀取.最后在加載模型和場景數據包括模型材質、光照等信息后,完成整個模型重繪.圖4表示了加載3DS文件的整個過程.

表1 用于模型變量的參數

圖4 月面探測器重繪過程圖
整個加載模型到場景中分為以下六個步驟:
第一步: 讀取探測器的主體部分的3DS文件,并賦值給_model,若探測器主體模型未成功讀取,則加載錯誤,模型不顯示; 將_model作為子節點賦給_MTModel;
第二步: 聲明新的節點node,讀取機械臂1的3DS文件并賦給變量node,如果機械臂不存在,則不顯示,將node作為子節點添加到mj_1進行位置矩陣變換之后添加到_MTModel,并將關節點1添加到機械臂1上.
第三步: 重新聲明node變量,讀取機械臂2的3DS文件并賦給變量node,將node作為子節點添加到mj_2進行位置矩陣變換之后添加到mj_1; 并將關節點2添加機械臂2上.
第四步: 重新聲明node變量,讀取機械臂3的3DS文件并賦給變量node,將node作為子節點添加到mj_3進行位置矩陣變換之后添加到mj_2; 并將關節點3添加機械臂3上.
第五步: 重新聲明node變量,讀取機械臂4的3DS文件并賦給變量node,將node作為子節點添加到mj_4進行位置矩陣變換之后添加到mj_3; 并將關節點4添加機械臂4上.
第六步: 將所有模型加載成一個組,賦給m_group并進行位置和姿態初始化.
在進行上述設計后,在Windows7環境下的可視化界面及探測器三維重構的結果如圖5所示.
三維可視化系統采用面向對象C++為開發語言,在Microsoft Visual Studio 2008平臺上結合Qt和OSG庫完成可視化界面的搭建,使用Autodesk 3dsmax軟件用于創建“嫦娥五號”探測器,并利用該系統能夠實現“嫦娥五號”探測器的三維重構可視化顯示.該系統還能通過旋轉、縮放視角、移動等功能實現了對探測器進行全方位的觀測,為未來月面探測可視化顯示方面提供一定的參考依據,甚至對其它的有關星體探測提供一個可視化平臺.目前該系統還存在一定的不足,有待后期進一步完善,如控制機械臂移動,模擬月面土壤采集的情景,因此可在今后的工作中對如何控制機械臂模擬月面采樣進行設計并進行可視化顯示.