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