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