李占麗 史曉萌 高琳
摘 ?要:文章介紹了基于HLA的仿真系統(tǒng)的開發(fā)過程,重點說明了基于VR-Link的聯(lián)邦成員的開發(fā)過程和開發(fā)過程中需要注意的問題。針對Matlab仿真模型,設(shè)計了適配器,實現(xiàn)了Matlab仿真模型與HLA/RTI的數(shù)據(jù)交互,可以對類似的HLA應(yīng)用開發(fā)起到借鑒作用。
關(guān)鍵詞:HLA;VR-Link;Matlab適配器
中圖分類號:TP391.9 ? ? ?文獻標(biāo)志碼:A ? ? ? ? 文章編號:2095-2945(2020)02-0085-03
Abstract: This paper introduces the development process of HLA-based simulation system, the development process of federate base on VR-Link and the problems are emphasized. For Matlab simulation model, the adapter is designed, to realized the data interaction between Matlab simulation model and HLA/RTI, It can be used for reference in similar HLA applications.
Keywords: HLA; VR-Link; Matlab adapter
1 概述
高層體系結(jié)構(gòu)HLA(High Level Architecture)是美國國防部提出的一個分布式仿真技術(shù)框架,它的主要目的是解決仿真應(yīng)用的互操作性和仿真資源的可重用性問題。它通過運行支撐環(huán)境RTI將具體的仿真功能實現(xiàn)、仿真運行管理和底層傳輸三者分離,隱蔽它們各自的實現(xiàn)細(xì)節(jié),使各個部分可以相對獨立地開發(fā),實現(xiàn)應(yīng)用系統(tǒng)的即插即用。
VR-Link對RTI函數(shù)進行了封裝,提供了可以使聯(lián)邦成員創(chuàng)建工作更容易的高層功能,使開發(fā)人員重點專注于仿真模型的設(shè)計,大大減少他們的工作量。
Matlab是用以開發(fā)數(shù)值模型的強大建模和分析工具,但是Matlab本身并不支持HLA/RTI,設(shè)計Matlab適配器,使Matlab仿真模型能夠參與到基于HLA的協(xié)同仿真中來,可以提高系統(tǒng)開發(fā)的效率。
2 開發(fā)過程
2.1 聯(lián)邦概念模型(FCM)開發(fā)
聯(lián)邦的概念模型是對問題域的抽象,是在需求和實現(xiàn)之間架起的一座橋梁。主要任務(wù)是對系統(tǒng)的組成和行為進行宏觀的描述,包括仿真系統(tǒng)的構(gòu)成和工作過程。
2.2 聯(lián)邦對象模型(FOM)設(shè)計
FOM的設(shè)計是整個仿真系統(tǒng)的開發(fā)過程中一個重要的部分,開發(fā)FOM的過程,是對仿真系統(tǒng)中的交互數(shù)據(jù)進行抽象和建模的過程,其一般步驟為:
(1)分解仿真任務(wù),確定聯(lián)邦成員及其實體類型和事件;
(2)確定FOM中的對象類和交互類;
(3)確定對象類屬性和交互類參數(shù)的特性;
(4)生成仿真對象模型(SOM)表;
(5)綜合SOM表,生成FOM表。
2.3 生成FED(Federation Execution Data)文件
FED文件是FOM開發(fā)的結(jié)果,用于向RTI和VR-Link提供FOM表的信息。在開發(fā)時,可以根據(jù)FOM表對FED文件進行修改,以滿足系統(tǒng)的需求。
2.4 聯(lián)邦成員開發(fā)
聯(lián)邦成員需要與聯(lián)邦中的其他成員共同實現(xiàn)FCM中定義的聯(lián)邦需求。根據(jù)FCM映射到本聯(lián)邦成員需要實現(xiàn)的功能,開發(fā)聯(lián)邦成員。VR-Link的開發(fā)聯(lián)邦成員的過程為:
(1)創(chuàng)建并加入聯(lián)邦
仿真開始時,需要通過DtExerciseConn產(chǎn)生聯(lián)邦,如果聯(lián)邦已經(jīng)產(chǎn)生,則加入聯(lián)邦。需要注意的是,構(gòu)造DtExerciseConn時,必須提供聯(lián)邦執(zhí)行名和聯(lián)邦成員名,并且同一聯(lián)邦的聯(lián)邦執(zhí)行名和FED文件名必須相同。
DtExerciseConn exConn;
exConn = new DtExerciseConn(execName, fedName, DtRprFomMapper::create(0),"VR-Link.FED", 0 );
如果用戶不向DtExerciseConn構(gòu)造函數(shù)提供FED文件的名稱,則假設(shè)FED文件名與聯(lián)邦執(zhí)行的名稱相同,VR-Link會在運行的程序所在的目錄中尋找FED文件,要確保用戶正在DtExerciseConn中使用的FED文件在運行程序所在的目錄中。
(2)對象類的發(fā)布與訂閱
聯(lián)邦產(chǎn)生以后,需要發(fā)布和訂閱FOM中的對象類屬性。如果發(fā)布、訂閱的是對象類的全部屬性,需要構(gòu)造對象發(fā)布器(DtEntityPublisher)和映射實體列表(DtReflected-EntityList);如果發(fā)布、訂閱的是對象類的部分屬性,可以使用DtObjClassDesc的成員函數(shù)publish( )/subscribe( )。
(3)屬性更新
在每一個仿真步長中,DtEntityPublisher通過調(diào)用tick()函數(shù)把更新的實體狀態(tài)發(fā)送出去。對DtExerciseConn::drainlnPut()接收到的遠(yuǎn)程實體, DtReflectedEntityList會將其更新信息存放到與該映射實體對應(yīng)的實體狀態(tài)庫中。
(4)交互類的發(fā)布和訂閱
HLA中使用交互來表示所發(fā)生的事件,VR-Link通過派生DtInteraction類來管理這些交互。交互類的發(fā)送是交互類實例在交互事件發(fā)生時進行發(fā)送的,發(fā)送交互的示例:
DtExamInteraction inter; ? //創(chuàng)建交互實例
inter. setPar1(par1); ? ? ? //設(shè)置參數(shù)1
inter. setPar2(par2); ? ? ? //設(shè)置參數(shù)2
inter. setPar3(par3); ? ? ? //設(shè)置參數(shù)3
exConn. sendStamped(inter); //發(fā)送交互
交互類的訂購需要交互接受方在仿真開始之前為交互類注冊一個回調(diào)函數(shù),對接收到的交互進行響應(yīng)。
DtExamInteraction:: addCallback(&exConn,theInteractionCb, this);
參數(shù)中,theInteractionCb為回調(diào)函數(shù),當(dāng)接受到交互后,調(diào)用此函數(shù)。因為回調(diào)函數(shù)是作為普通的VR-Link回調(diào)注冊函數(shù)指針傳入的,所以回調(diào)函數(shù)本身不能是非靜態(tài)成員函數(shù),它可以是全局函數(shù)或靜態(tài)類成員。該函數(shù)原型為:
void
theInteractionCb(DtExamInteraction* inter, void*usr)
{ … …}
(5)交互處理
在回調(diào)函數(shù)中獲取交互數(shù)據(jù)后,要對數(shù)據(jù)進行處理,可在回調(diào)函數(shù)中設(shè)置事件,利用事件機制觸發(fā)處理過程。對于復(fù)雜的處理,事件發(fā)生后可利用消息機制發(fā)送消息,通知消息處理函數(shù)進行處理。
Handle hEvent;
SetEvent(hEvent);
if(WaitForSingleObject(hEvent) == WAIT_OBJECT_0)
{
::PostMessage(stsComponent->m_hWnd, MessageName, 0, 0);
}
需要注意的是,這里要利用PostMessage函數(shù),而不能利用SendMessage函數(shù)。
3 Matlab適配器
由于仿真模型采用Matlab建立,而Matlab沒有提供HLA/RTI的接口,為了把這些模型集成到仿真系統(tǒng),實現(xiàn)基于HLA的協(xié)同仿真,就需要采用一定的機制將RTI與這些模型連接起來,使這些模型能夠和RTI進行數(shù)據(jù)交換和時間同步。
3.1 設(shè)計思路
本文采用Matlab引擎的方式開發(fā)適配器,使Matlab作為一個聯(lián)邦成員加入聯(lián)邦,通過適配器發(fā)布和訂購所需要的對象類與交互類。
為實現(xiàn)Matlab仿真模型與RTI的數(shù)據(jù)交互,適配器將Matlab所需要的對象類和交互類映射為Matlab仿真模型中的輸入輸出變量,并根據(jù)仿真控制子系統(tǒng)的控制指令(如啟動、暫停、繼續(xù)和終止等),通過Matlab的API接口對Matlab引擎進行相應(yīng)的控制,其實現(xiàn)機制如圖1所示。
3.2 適配器的實現(xiàn)
Matlab引擎采用客戶/服務(wù)器模式,利用ActiveX自動化和DDE技術(shù),實現(xiàn)VC++與Matlab之間的動態(tài)數(shù)據(jù)交換。在VC++中使用Matlab引擎來編寫程序時,VC++作為客戶端,負(fù)責(zé)用戶接口并提出數(shù)據(jù)請求;Matlab作為服務(wù)器端,向客戶端提供數(shù)據(jù)服務(wù)。VC++通過調(diào)用Matlab引擎與Matlab服務(wù)器建立連接,實現(xiàn)動態(tài)通信。具體過程如圖 2所示。
上面的過程中包含了兩個重要問題,一個是引擎接口的設(shè)計與使用,VC++為Matlab引擎調(diào)用Matlab服務(wù)提供了應(yīng)用程序接口,用于完成連接的建立與撤銷、數(shù)據(jù)的傳遞與接收,主要的引擎庫函數(shù)如表1所示。
另一個問題是數(shù)據(jù)組織,即VC++數(shù)據(jù)類型與mxArray矩陣的轉(zhuǎn)換問題,數(shù)據(jù)組織方式正確與否直接決定著VC++與Matlab服務(wù)器之間動態(tài)數(shù)據(jù)交換的有效性。
Matlab對VC++數(shù)據(jù)的組織利用mxArray矩陣結(jié)構(gòu)和它的相關(guān)函數(shù)來實現(xiàn)。對于每種VC++數(shù)據(jù)類型,都有一個函數(shù)用于創(chuàng)建mxArray矩陣結(jié)構(gòu),如表2所示。
在VC++中對Matlab引擎的調(diào)用過程可用如下偽代碼實現(xiàn):
IF engOpen ?//啟動引擎成功
BEGIN
//進行數(shù)據(jù)初始化;
mxCreatexxx(); //進行數(shù)據(jù)類型轉(zhuǎn)換;
engPutArray(); //向Matlab引擎發(fā)送數(shù)據(jù);
engEvalString();//調(diào)用仿真模型,可以是M 函數(shù);
engGetArray();//獲取仿真結(jié)果;
mxDestoryArray();//刪除矩陣;
engClose();// 關(guān)閉引擎;
END
利用Matlab適配器可以方便地將Matlab仿真模型轉(zhuǎn)化為一個HLA/RTI邦元,如圖3所示。
4 結(jié)束語
本文論述了利用VR-Link開發(fā)HLA應(yīng)用的過程,設(shè)計了Matlab適配器,詳細(xì)說明了適配器的實現(xiàn)方法,利用適配器使Matlab仿真模型可以參與到HLA/RTI協(xié)同仿真中來,可以對類似的HLA應(yīng)用起到借鑒作用。
參考文獻:
[1]王勃,艾祖亮.VR-Link開發(fā)[M].北京:國防工業(yè)出版社,2009.
[2]王凈,戰(zhàn)凱,吳朝暉.基于HLA的潛艦對抗模擬訓(xùn)練系統(tǒng)的設(shè)計與實現(xiàn)[J].火力與指揮控制,2012,37(8):127-132.
[3]郝雁中,楊承志.基于HLA的電子戰(zhàn)飛機作戰(zhàn)仿真系統(tǒng)研究[J].指揮控制與仿真,2008,30(3):102-105.
[4]曾艷麗,李華.基于HLA的仿真應(yīng)用成員的設(shè)計與實現(xiàn)[J].電子對抗技術(shù),2004,19(4):16-18,23.