朱湘龍,于天朋,侯 師
(1北京理工大學(xué),北京 100081;2國營304廠,福建三明 365000)
現(xiàn)代戰(zhàn)爭越來越依賴于復(fù)雜、昂貴的武器系統(tǒng)。由于新型武器系統(tǒng)的復(fù)雜性,要形成戰(zhàn)斗力必須反復(fù)訓(xùn)練其使用者,其相比于傳統(tǒng)武器更依賴于熟練的使用者。而新型武器系統(tǒng)一般價格昂貴,實彈訓(xùn)練費用高,很難像傳統(tǒng)武器系統(tǒng)一樣采用大規(guī)模的實彈訓(xùn)練,嚴(yán)重阻礙了其戰(zhàn)斗力的快速形成。針對這種情況,各國普遍為新型武器系統(tǒng)開發(fā)相應(yīng)的虛擬訓(xùn)練系統(tǒng),以較低的成本和較好的效果完成使用者的初步訓(xùn)練。
虛擬訓(xùn)練系統(tǒng)設(shè)計的難點在于高度仿真的虛擬視景設(shè)計。傳統(tǒng)虛擬訓(xùn)練系統(tǒng)大多采用OpenGVS、Vega等軟件設(shè)計虛擬視景,但這些軟件有價格高、開發(fā)難度較大、視覺沉浸感不夠優(yōu)秀等問題。法國VIRTOOLS公司的Virtools是一款非常優(yōu)秀的、大量應(yīng)用于游戲領(lǐng)域的三維交互軟件。它能將現(xiàn)有常用的虛擬視景檔案整合在一起,如3D的模型、2D圖形、音效等構(gòu)成三維交互系統(tǒng)[2]。Virtools采用圖形化編程語言。開發(fā)人員無需編寫底層代碼,只需要拖動打包好的行為模塊(building block)即可構(gòu)建優(yōu)秀的三維交互系統(tǒng),開發(fā)難度小,Virtools軟件本自帶了大量打包好的行為模塊供開發(fā)者調(diào)用。其三維引擎已獲得微軟Xbox認(rèn)可。Virtools主要用于網(wǎng)絡(luò)游戲領(lǐng)域,與實物系統(tǒng)數(shù)據(jù)通信能力較為薄弱,未提供標(biāo)準(zhǔn)模塊。文中深入分析了Virtools的運行機制和Virtools SDK開發(fā)構(gòu)架,通過調(diào)用回調(diào)函數(shù),完成了基于Virtools SDK半實物串行通信接口的設(shè)計。
本虛擬訓(xùn)練系統(tǒng)由仿真彈筒和仿真計算機兩部分組成。仿真彈筒用于模擬導(dǎo)彈發(fā)射的全過程,給受訓(xùn)者真實的觸覺感受。仿真計算機主要功能是虛擬視景的生成和彈道仿真。虛擬視景經(jīng)過渲染之后輸送到虛擬瞄具,給受訓(xùn)者逼真的視覺感受。虛擬訓(xùn)練系統(tǒng)通過音箱播放訓(xùn)練過程音效給受訓(xùn)者逼真的聽覺感受。仿真彈筒為本系統(tǒng)的實物部分,仿真計算機為虛擬部分。兩部分中間通過全雙工異步串行通信接口連接進(jìn)行通信,如圖1所示。通信接口設(shè)計重點在串口通信行為模塊(SerialBB)的設(shè)計。SerialBB通過Virtools行為模塊實現(xiàn)。在每一個仿真周期內(nèi),SerialBB讀取一組仿真彈筒發(fā)送的數(shù)據(jù),然后解包,提取執(zhí)行本幀所需數(shù)據(jù),傳送給虛擬視景,供虛擬視景運行。
圖1 虛擬訓(xùn)練系統(tǒng)總體構(gòu)架
Virtools是一個實時引擎,能對自身場景變化做出實時準(zhǔn)確的反應(yīng)。一個Virtools場景只有一個系統(tǒng)進(jìn)程,也是單線程運行。因而其能夠自行決定其任務(wù)的優(yōu)先級,讓所有任務(wù)在Virtools本身的時間軸上實時的運行,而不受宿主非實時操作系統(tǒng)的限制。
Virtools視景執(zhí)行過程中,以幀的方式在自身時間軸上推進(jìn)視景進(jìn)程。每一幀內(nèi)按固定的時序執(zhí)行一次過程循環(huán),如圖2所示。最先執(zhí)行的是管理預(yù)處理,在此Virtools會運行視景腳本中的管理預(yù)處理模塊。然后執(zhí)行的是行為模塊,視景腳本中的行為模塊依次運行。執(zhí)行完畢后進(jìn)入后置管理處理段,在此執(zhí)行視景腳本中的后置管理模塊。執(zhí)行完畢后對場景進(jìn)行渲染,完成一幀的執(zhí)行。
圖2 Virtools幀結(jié)構(gòu)
本虛擬訓(xùn)練系統(tǒng)中,Virtools虛擬視景不僅需要對自身場景中的事件做出實時準(zhǔn)確的反應(yīng),還需對仿真彈筒上的操作做出實時的反應(yīng)。而仿真彈筒時序以現(xiàn)實世界的時間軸為基礎(chǔ)。所以虛擬視景時間軸需與現(xiàn)實世界時間軸有可解析關(guān)系。因此,本虛擬視景采用固定幀率的方式運行。確定好虛擬視景幀率之后,仿真計算機性能足夠的前提下,虛擬視景時間軸能與現(xiàn)實世界的時間軸同步。因而就實現(xiàn)了仿真彈筒時間軸與虛擬視景時間軸的同步。
Vrtools虛擬視景在事件發(fā)生時會調(diào)用相應(yīng)的回調(diào)函數(shù)來處理。在本虛擬訓(xùn)練系統(tǒng)視景運行過程中主要的事件有:打開VT、開始執(zhí)行視景、停止視景、暫停視景、復(fù)位視景。經(jīng)測試事件和回調(diào)函數(shù)對應(yīng)關(guān)系如表1所示。
表1 回調(diào)函數(shù)調(diào)用邏輯
Virtools軟件架構(gòu)高度模塊化。圖3所示為其API整體構(gòu)架。所有的Virtools可執(zhí)行程序都是在該架構(gòu)上通過動態(tài)鏈接庫(DLLs)的形式實現(xiàn)的。其核心組件有兩個DLLs:CK2和VxMath。VxMath提供較為底層的函數(shù);CK2提供核心的行為函數(shù),并且負(fù)責(zé)管理關(guān)聯(lián)其他組件。本系統(tǒng)設(shè)計的SerialBB就是通過調(diào)用CK2和VxMath提供的API實現(xiàn)的[1]
圖3 Virtools API整體構(gòu)架
SerialBB中行為模塊框架通過調(diào)用Virtools API實現(xiàn)。串口打開/關(guān)閉時序部分通過回調(diào)函數(shù)實現(xiàn)。串口通信部分、數(shù)據(jù)處理部分通過調(diào)用Win32 API實現(xiàn)。
3.1.1 行為模塊框架實現(xiàn)
行為模塊軟件結(jié)構(gòu)包括5部分,通過這5部分就能實現(xiàn)行為模塊框架。
1)Plugin信息注冊函數(shù):該函數(shù)用于Plugin信息的注冊,調(diào)用CKGetPluginInfo()函數(shù)創(chuàng)建了指向CKPluginInfo結(jié)構(gòu)類型的指針對Plugin版本號、插件類型、作者等相關(guān)信息進(jìn)行指定,調(diào)用CKGetPluginInfo-Count()函數(shù)獲取注冊的Plugin的個數(shù)。上述兩個函數(shù)將最后生成的DLL文件聲明為Building Block Plugin,該 Plugin用來執(zhí)行 BB,BB的執(zhí)行是 Building Block Plugin的一部分。最后調(diào)用 RegisterBehavior-Declaration()函數(shù)注冊Building Block Plugin將要執(zhí)行的BB,完成對BB的注冊。
2)BB聲明函數(shù):該函數(shù)用于BB描述函數(shù)的聲明,通過調(diào)用CreateCKObjectDeclaration()創(chuàng)建CKObjectDeclaration類型的指針,該指針指向BB描述函數(shù)結(jié)構(gòu)體。通過該函數(shù)指定BB的類型、版本號、功能等相關(guān)參數(shù)和信息。
3)BB創(chuàng)
建函數(shù):該函數(shù)用于BB實體的創(chuàng)建,包括輸入輸出接口、輸入輸出參數(shù)接口、功能函數(shù)指定等。函數(shù)用CreateBehaviorPrototype()創(chuàng)建CKBehaviorPrototype類型的指針,用來指向?qū)⒁獎?chuàng)建的BB原型的函數(shù)。創(chuàng)建函數(shù)則只有在BB真正使用的時候才會被調(diào)用。
4)BB執(zhí)行函數(shù):該函數(shù)用于定義BB的行為功能,是BB的核心。BB的每次調(diào)用都會執(zhí)行該函數(shù)。BB執(zhí)行過程中參數(shù)處理過程為:首先用ActiveInput()函數(shù)激活模塊的輸入端,開始執(zhí)行模塊。然后調(diào)用函數(shù)GetInputParameterValue()從參數(shù)入口讀取輸入?yún)?shù)。然后對參數(shù)進(jìn)行處理,處理完成之后通過SetOutputParameterValue()函數(shù)將處理結(jié)果輸出到參數(shù)輸出口,供其它模塊調(diào)用。模塊每次調(diào)用都會更新輸出端口值。參數(shù)處理完畢后停止模塊運行并激活模塊輸出端口,標(biāo)志BB的一次調(diào)用完成。
5)BB回調(diào)函數(shù):該函數(shù)用于對一些特定事件(如鍵盤、鼠標(biāo)等)做出響應(yīng),以及對BB是時間依賴還是幀依賴做出選擇[1,5]。
以上5部分函數(shù)依靠指針按圖4所示順序執(zhí)行,實現(xiàn)行為模塊框架。
3.1.2 串口開關(guān)邏輯切換實現(xiàn)
虛擬視景狀態(tài)流圖如圖5所示。系統(tǒng)正常運行需保證計算機COM口在視景停止和暫停狀態(tài)為關(guān)閉,在視景運行狀態(tài)為開啟。
對照表1經(jīng)分析,最后選擇在回調(diào)函數(shù)CKM_BEHAVIORRESUME中調(diào)用打開串口函數(shù),在回調(diào)函數(shù)CKM_BEHAVIORPAUSE和KM_BEHAVIORRESET中調(diào)用關(guān)閉串口函數(shù)。從而保證計算機COM的開關(guān)時序[6]。
3.1.3 串口通信部分的實現(xiàn)
圖4 行為模塊軟件構(gòu)架
串口通信部分通過調(diào)用Win32 API中的文件操作函數(shù)實現(xiàn)。打開串口通過調(diào)用CreateFile()函數(shù)實現(xiàn)。發(fā)送數(shù)據(jù)通過調(diào)用WriteFile()函數(shù)實現(xiàn)。接受數(shù)據(jù)通過調(diào)用ReadFile()函數(shù)實現(xiàn)[3-4]。串口的打開和關(guān)閉在回調(diào)函數(shù)中實現(xiàn)。程序運行到BB執(zhí)行函數(shù)時BB被激活。程序首先初始化參數(shù),然后向仿真彈筒發(fā)送握手信號,如果收到握手成功的反饋信號則將握手成功位置位,否則在BB下一次激活時繼續(xù)給仿真彈筒發(fā)送握手信號直至成功握手。成功握手后,BB在每個幀循環(huán)都會調(diào)用ReadFile()函數(shù)從計算機COM口讀取一組數(shù)據(jù)。經(jīng)過解包和數(shù)據(jù)處理之后輸出供其它模塊調(diào)用。直至 BB不再被激活。因為Virtools以基于幀的方式運行,所以行為模塊程序本身并不需要寫循環(huán),圖中幀循環(huán)是通過Virtools腳本實現(xiàn)的。這種方式可以保證程序讀數(shù)周期與Virtools運行周期相同。
圖5 虛擬視景狀態(tài)流圖
圖6 SerialBB程序流程圖
圖7 串口行為模塊
程序編譯之后生成SeialBB如圖 7所示。SerialBB模塊輸入端和輸出端相連,形成一個循環(huán),每幀結(jié)束后都會激活輸出端,然后由輸出端激活輸入端,保證在下一幀時SerialBB仍舊處于激活狀態(tài)。
將SerialBB集成到Virtools行為腳本中測試發(fā)現(xiàn)半實物接口能夠很好的工作,仿真彈筒發(fā)送的數(shù)據(jù)都及時、準(zhǔn)確的到達(dá)了虛擬視景。虛擬視景實時的對仿真彈筒的操作做出了正確的反應(yīng)。虛擬彈筒的瞄準(zhǔn)過程、發(fā)射信號等都能實時準(zhǔn)確的反應(yīng)到虛擬視景,并由虛擬視景仿真出來。系統(tǒng)整體運行流暢,未出現(xiàn)可覺察到延遲現(xiàn)象,受訓(xùn)者感受到預(yù)期的沉浸效果。視景在各種操作組合下,計算機COM口都能正確的在打開和關(guān)閉狀態(tài)間切換,避免了異常數(shù)據(jù)接受。
文中在Virtools SDK開發(fā)構(gòu)架下,通過調(diào)用Virtools API和Win 32 API完成了虛擬訓(xùn)練系統(tǒng)半實物接口的設(shè)計和開發(fā)。通過合理的使用Virtools回調(diào)函數(shù),準(zhǔn)確地控制了接口的開關(guān)邏輯。實現(xiàn)了基于Virtools虛擬訓(xùn)練系統(tǒng)仿真彈筒和仿真計算機的實時通信。
這些工作是針對計算機COM做的,但并不局限于COM口。在相同的構(gòu)架下,通過其它Win32 API的調(diào)用理論上能實現(xiàn)任意計算機支持的接口與Virtools虛擬視景間的通信。
[1]VIRTOOLS.Virtools SDK Documentation[S].FRANCE:VIRTOOLS,2006.
[2]王立群,李紅.簡明教程[M].上海:復(fù)旦大學(xué)出版社,2008.
[3]艾塞明格.Win32開發(fā)人員參考庫[M].北京:機械工業(yè)出版社,2001.
[4]龔建偉,熊光明.Visual C++/Turbo C串口通信編程實踐[M].北京:電子工業(yè)出版社,2007.
[5]楊國平.Virtools SDK初探[J].程序員:游戲創(chuàng)造,2006,6:73-75.
[6]吳明勛.VIRTOOLS使用手冊(一)[M].臺灣:愛迪斯通股份有限公司,2006.
[7]陳定方,羅亞波.虛擬設(shè)計[M].北京:機械工業(yè)出版社,2007.