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