趙正旭,左宗成,申躍杰
(石家莊鐵道大學(xué) 復(fù)雜網(wǎng)絡(luò)與可視化研究所,石家莊 050043)
隨著科技的不斷發(fā)展,人類對地球的探索已經(jīng)遠遠不能滿足人類的好奇心,自上世紀中期人類第一次發(fā)射衛(wèi)星進入太空到現(xiàn)在人類已經(jīng)探索距離地球更遠的空間,航天科技已經(jīng)取得了質(zhì)的飛躍[1].當(dāng)下我國正在為進行探月工程月面無人采樣并安全返回地面的任務(wù)的緊急籌備中,因此尋找到一種可以可視化顯示月球探測器的途徑,可以為月面無人采樣的成功實施提供一定的保障.
目前,市場上存在著很多對空間機器人進行仿真的軟件,例如 MATLAB、unity3d、VRP(VR-Platform)、Virtool、VEGA、OGRE、OSG等等.其中MATLAB的優(yōu)勢在于數(shù)據(jù)的可視化及分析上,它無法滿足實現(xiàn)對空間機器人的精確控制; 而unity3d主要應(yīng)用于游戲行業(yè)的開發(fā),但是對顯卡的要求較高,不適合低端機器需求的高端渲染效果; VRP更適用于場景的顯示模擬,例如城市規(guī)劃設(shè)計、工業(yè)仿真、室內(nèi)場景動態(tài)顯示等[2].Virtool、VEGA、雖然對編寫代碼的需求較小,但是Virtool的缺點在于雖然是中文界面顯示,但是在開發(fā)過程中不支持中文輸入; VEGA只支持.fit格式文件,只能由配套的Creator軟件來建立模型,從而導(dǎo)致模型使用的方式過于單一; OSG和OGRE都是以C++進行開發(fā)的,這兩者十分相似,但是OGRE偏向于游戲開發(fā),而OSG更偏向虛擬仿真,同時它更加強調(diào)庫的功能性.
OpenSceneGraph簡稱OSG,是以O(shè)penGL底層渲染API為基礎(chǔ),采用C++語言編寫,提供了大量的第三方庫,并且隨著技術(shù)的不斷發(fā)展,該庫也在不斷被完善[3,4].相比于OpenGL具有性能高、快速開發(fā)、可擴展性和可移植性強等優(yōu)勢,同時它能夠讀取二維和三維圖像的格式,其中二維圖像支持的格式有.gif,.tiff,.bmp等,支持三維圖像的格式有.3DS,.obj等.因此利用OSG的第三方庫在Windows下以Qt和C++為基礎(chǔ)來研究對空間機器人的三維仿真具有重要意義.
本研究的完成是在基于Windows 7環(huán)境下借助Microsoft Visual Studio 2008、Qt和OSG來實現(xiàn)最終的可視化效果,因此需要的主要工有如下9種:
(1) 64位Windows 7操作系統(tǒng)的電腦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)中存放著有關(guān)于OSG中的實例數(shù)據(jù)和一些物體模型,如cow.osg、avatar.osg、lz.osg等; (6)3rdParty_VC9sp1_x86_x64_V7.zip中含有編譯所依賴的OSG第三方庫; (7)Autodesk 3dsmax 2011用于研究中所需的月面探測器的模型創(chuàng)建;(8)為Qt4.7.4的安裝包,它是一款跨平臺的C++圖形用戶界面應(yīng)用程序開發(fā)框架,本研究中利用該軟件來搭建可視化平臺的界面; (9)是一款可以讓Qt在VS2008上進行程序編寫和框架搭建的插件.
上述(1)~(6)的工具是用于編譯生成OSG的庫,并應(yīng)用在本研究中的場景模型的顯示,在安裝完成相應(yīng)的軟件后,生成OSG的過程如圖1所示.
圖1 OSG編譯和生成過程
OSG雖然是以O(shè)penGL為底層進行渲染的,但是同樣也同OpenGL一樣無法進行直接高效地建模.OSG中共有三種生成模型的方式: (1) 通過OpenGL的繪圖基元封裝后產(chǎn)生的幾何體,如osg:: Geometry; (2)OSG本身所攜帶大量的模型,這些模型可以滿足用戶學(xué)習(xí)使用; (3) 通過第三方建模軟件創(chuàng)建三維模型并導(dǎo)入OSG場景中.本研究需要使用指定的空間機器人的模型,第一種方法需要花費大量的時間和精力,同時因為需要使用大量的繪圖語句,這將會使內(nèi)存占用過多,從而降低了程序的執(zhí)行效率[5]; 第二種方法OSG的模型庫中不能提供本研究中所需的模型,因此采用第三種方法可以滿足本研究中的需求.
市場上有很多功能強大的建模工具,比如Autodesk 3ds Max、Maya、ZBrush、Blender等等,它們都能夠為建立三維模型提供很多高級命令,而本研究決定選用Autodesk 3ds Max 2011軟件創(chuàng)建三維模型,并導(dǎo)出生成.3DS格式的文件.
探月工程探測器是由著陸器、上升器、軌道器和返回器等多個部分組成,通過對月面采樣的著陸器的結(jié)構(gòu)特征分析,對著陸器、上升器的主體部分建立三視圖如圖2所示.
圖2(a),(b),(c)為著陸器的前視圖、頂視圖和左視圖,分別有太陽能電板、點火裝置、土壤采集罐和機械臂等組成.著陸器的作用是為了實現(xiàn)在月球表面實現(xiàn)軟著陸,并且通過自身攜帶的機械臂完成月面土壤的采集和封罐任務(wù).太陽能電板將太陽能轉(zhuǎn)化為電能存儲起來,為月面采樣和地月通信提供基礎(chǔ)保障; 雷達用于月面通信,比如月面環(huán)境信息的傳輸,接收地面控制機械臂的指令信息等等,點火裝置能夠為月面軟著陸提供動力.采樣罐用于接收機械臂采集的樣本,并存儲這些樣品.機械臂為四自由度機械臂,即分為四段機械短臂和四個關(guān)節(jié)點.在整個探月工程中,地面人員通過遙操作系統(tǒng)控制機械臂來改變位置及姿態(tài)來完成月面無人采樣任務(wù).
圖2(d)、(e)、(f)分別為探測器上升器的前視圖、頂視圖和左視圖,由點火裝置、雷達等組成,它的作用是在完成月面采樣和封罐任務(wù)后,攜帶月面土壤樣本上升至月面軌道,與月面軌道上的軌道器進行交會對接,最終月面土壤被送至返回器內(nèi),由返回器攜帶月面樣本抵達地面.
圖2 著陸器和上升器的三視圖
Autodesk 3ds max軟件提供了多種建模方式,如:基礎(chǔ)建模、復(fù)合建模、多邊形建模、面片建模和NUBRS建模等.其中多邊形建模是利用3dsmax中已有的幾何體或者自行創(chuàng)建的幾何體進行修改而創(chuàng)建生成的模型,面片建模適用于一些表面性的建模,如樹葉等,NUBRS建模已經(jīng)不是現(xiàn)在的主流建模方式,需要使用時基本靠插件來實現(xiàn),經(jīng)過分析,本研究綜合使用多邊形建模、基礎(chǔ)建模和復(fù)合建模三種方式.本研究使用多變形建模來創(chuàng)建著陸器、上升器等; 使用基礎(chǔ)建模和復(fù)合建模生成腳架和機械臂.
模型創(chuàng)建完成后,需要對模型添加紋理材質(zhì).在單個模型對象中需要用到多種貼圖材質(zhì),若對模型單個對象分離成多個對象進行貼圖,則會占用多個材質(zhì)球,同時增加文件的大小,不利于后期的處理及導(dǎo)出生成.3DS文件格式,經(jīng)過分析,決定采用多維子材質(zhì)對模型進行貼圖處理.
通過上述2.1中的三視圖在Autodesk 3ds max 2011軟件中使用各種高級命令創(chuàng)建三維模型,并生成.max和.3DS文件,整個過程的流程圖如圖3所示.
3DS文件是由一個ID是“0x4D4D”的基本塊(chunk)通過樹狀結(jié)構(gòu)組成,這個基本塊是3DS文件中必不可少的,是用于判斷該文件是否為3DS文件.一個塊由三部分組成,塊的ID,塊的長度和塊的數(shù)據(jù)內(nèi)容,而數(shù)據(jù)內(nèi)容中又可以包含子塊,同樣的每個子塊中也可以包含它結(jié)構(gòu)下的子塊[6,7].在塊的模式中,它的總字節(jié)為塊的長度,其中ID占用前面2個字節(jié),接下來有4個字節(jié)來存儲塊的長度,最后剩下的字節(jié)用于保存塊的數(shù)據(jù)信息內(nèi)容[8].
3DS文件是一種小型文件,它能存儲的場景內(nèi)當(dāng)個單個模型不能超過64 000個面,在建模完成后需要計算3ds max中各個對象的面的總數(shù),若場景內(nèi)單個對象超過64 000個面,可以通過軟件中命令修改器中提供的MultiRes、ProOptimizer等各種命令來對模型進行優(yōu)化,這些命令能夠減少模型的面數(shù)和頂點數(shù),同時對模型最終的渲染效果的影響最小.若是對象在減面后仍然無法滿足導(dǎo)出.3DS格式的需求,可以將單個對象進行分割變成多個對象,同時又要保證盡量對象的個數(shù)比較少.
圖3 3DS文件創(chuàng)建的流程圖
3DS文件在導(dǎo)出后無法保存位圖等貼圖,只能保存漫反射的材質(zhì)顏色,因此在導(dǎo)出3DS文件的同時利用3ds max中的資源收集器將相應(yīng)的模型材質(zhì)導(dǎo)出,并且在使用這些3DS文件中的模型時要重新附上貼圖.
搭建可視化顯示平臺界面可以更加方便用戶對三維模型等的資源管理,有效地減少了用戶尋找模型位置所花的時間.本研究使用Qt4.7.4和OSG庫基于Windows7環(huán)境下使用C++編程語言搭建可視化界面.可視化顯示系統(tǒng)能夠讓月面探測器顯示在場景中,同時能夠?qū)崿F(xiàn)簡單的縮放、旋轉(zhuǎn)功能,能夠進行多方位的觀測探測器.
使用Qt4.7.4在VS2008上進行可視化系統(tǒng)的界面設(shè)計,在該界面的菜單欄中有任務(wù)、窗口、幫助這三個菜單項,其中任務(wù)菜單中含有用于探月工程的各項任務(wù)列表,而探測器可視化顯示為其中的任務(wù)之一,窗口菜單是自定義窗口布局,幫助菜單是有關(guān)該系統(tǒng)的相關(guān)說明.
在菜單欄下方左邊是資源管理器、文件管理器和任務(wù)管理器三個子窗口,通過分頁的方式顯示出來,右側(cè)是任務(wù)窗口,如可視化顯示界面分布在該位置.
最下方的左右兩邊是相關(guān)進程的信息,分別為文件接收信息,后臺監(jiān)控信息和文件查詢結(jié)果等.
三維重構(gòu)可視化需要借助OSG中的各種庫,通過這些庫可以完成對整個探測器的文件模型的三維重構(gòu),并實現(xiàn)對場景中探測器的旋轉(zhuǎn),縮放,移動等功能.整個三維重構(gòu)所涉及到有關(guān)OSG庫和工具庫說明如下.
osg庫,提供用于創(chuàng)建場景中的二維或三維圖形的節(jié)點類,向量和矩陣運算的類、三維模型變換的類和有關(guān)渲染的類等.這些類主要有osg::Geode,osg::Vec3,osg::Position Attitude Transform,osg::Vec4,osg::ShapeDrawable,osg::MatrixTransform等.
osgViewer庫,主要用于OSG的視窗管理,它提供了各種視口類,并且能與Qt結(jié)合使用.相關(guān)的類如osgViewer::Viewer[9].
osgUtil庫,該庫包含的類主要用于渲染器的創(chuàng)建和對osg場景中的模型進行相關(guān)的操作.
osgDB庫,提供三維模型數(shù)據(jù)庫類和方法,可用來實現(xiàn)對模型的讀取,從而實現(xiàn)模型顯示在場景中的功能.如osgDB::readNodeFile().
將模型顯示在場景中有多種方法,可以對模型整個全部一次性加載到場景中,也可以對模型進行分割依次導(dǎo)入到場景中.考慮到后續(xù)月面無人采樣時控制機械臂移動,本研究中采用將整個探測器模型分割開來分別加載到場景中.分別為四段機械臂,四個關(guān)節(jié)點和一個探測器主體共九個3DS文件.在將3DS文件加載到場景后,在程序中相關(guān)的參數(shù)描述如表1所示.
將探測器模型分為九個部分之前,要對九個分開的模型的坐標軸的位置進行調(diào)整,探測器主體的坐標位置為第一段機械臂的位置,機械臂mj_1的坐標軸位置和探測器主體的位置相同,機械臂mj_2的坐標軸位置在機械臂mj_1的末端,機械臂mj_3的坐標軸位置在機械臂mj_2的末端,同理機械臂mj_4坐標軸的位置在機械臂mj_3的末端.場景中坐標軸的位置能使探測器能夠很好的連接起來并使后續(xù)機械臂移動時不會破壞模型的整體效果,使的三維重構(gòu)趨于真實情況.
要對其分別加載到場景中,本研究從探測器主體開始依次加載剩余的文件,直至完成所有3DS文件的讀取.最后在加載模型和場景數(shù)據(jù)包括模型材質(zhì)、光照等信息后,完成整個模型重繪.圖4表示了加載3DS文件的整個過程.
表1 用于模型變量的參數(shù)
圖4 月面探測器重繪過程圖
整個加載模型到場景中分為以下六個步驟:
第一步: 讀取探測器的主體部分的3DS文件,并賦值給_model,若探測器主體模型未成功讀取,則加載錯誤,模型不顯示; 將_model作為子節(jié)點賦給_MTModel;
第二步: 聲明新的節(jié)點node,讀取機械臂1的3DS文件并賦給變量node,如果機械臂不存在,則不顯示,將node作為子節(jié)點添加到mj_1進行位置矩陣變換之后添加到_MTModel,并將關(guān)節(jié)點1添加到機械臂1上.
第三步: 重新聲明node變量,讀取機械臂2的3DS文件并賦給變量node,將node作為子節(jié)點添加到mj_2進行位置矩陣變換之后添加到mj_1; 并將關(guān)節(jié)點2添加機械臂2上.
第四步: 重新聲明node變量,讀取機械臂3的3DS文件并賦給變量node,將node作為子節(jié)點添加到mj_3進行位置矩陣變換之后添加到mj_2; 并將關(guān)節(jié)點3添加機械臂3上.
第五步: 重新聲明node變量,讀取機械臂4的3DS文件并賦給變量node,將node作為子節(jié)點添加到mj_4進行位置矩陣變換之后添加到mj_3; 并將關(guān)節(jié)點4添加機械臂4上.
第六步: 將所有模型加載成一個組,賦給m_group并進行位置和姿態(tài)初始化.
在進行上述設(shè)計后,在Windows7環(huán)境下的可視化界面及探測器三維重構(gòu)的結(jié)果如圖5所示.
三維可視化系統(tǒng)采用面向?qū)ο驝++為開發(fā)語言,在Microsoft Visual Studio 2008平臺上結(jié)合Qt和OSG庫完成可視化界面的搭建,使用Autodesk 3dsmax軟件用于創(chuàng)建“嫦娥五號”探測器,并利用該系統(tǒng)能夠?qū)崿F(xiàn)“嫦娥五號”探測器的三維重構(gòu)可視化顯示.該系統(tǒng)還能通過旋轉(zhuǎn)、縮放視角、移動等功能實現(xiàn)了對探測器進行全方位的觀測,為未來月面探測可視化顯示方面提供一定的參考依據(jù),甚至對其它的有關(guān)星體探測提供一個可視化平臺.目前該系統(tǒng)還存在一定的不足,有待后期進一步完善,如控制機械臂移動,模擬月面土壤采集的情景,因此可在今后的工作中對如何控制機械臂模擬月面采樣進行設(shè)計并進行可視化顯示.