韓 晨 劉超慧 陳雪英
(1.海軍航空兵學院艦載機系 葫蘆島 125001)(2.海軍航空兵學院作戰指揮系 葫蘆島 125001)
?
關于GL Studio在某型飛行模擬器多功能顯示器建模與仿真中幾點關鍵問題的探究*
韓 晨1劉超慧2陳雪英2
(1.海軍航空兵學院艦載機系 葫蘆島 125001)(2.海軍航空兵學院作戰指揮系 葫蘆島 125001)
使用GL Studio軟件結合VC++6.0混合編程的設計方法,可以實現對飛行模擬器多功能顯示器的建模與仿真。但是由于多功能顯示器顯示的信息量較大、交聯關系較多、控制邏輯復雜,因此在建模與仿真過程中難度較大。論文就某型飛行模擬器多功能顯示器建模與仿真中的幾點關鍵問題進行了研究與分析,并給出了最終的仿真結果。實踐證明,論文提出的方法較好地解決了多功能顯示器建模與仿真中的幾個難點問題。
GL Studio; VC++6.0; 多功能顯示器; 控制邏輯; 建模與仿真
Class Number TP391.9
隨著越來越多的高科技武器被應用到部隊,運用虛擬現實技術對武器設備進行仿真是解決使用實際裝備訓練效率低、維護成本高、安全性差等諸多問題的有效途徑。
由于飛行模擬器多功能顯示器顯示元素多、復雜程度高,無論是使用OpenGL語言,還是使用3Dmax、Creator等軟件進行建模,工作量都較大,并且對計算機的硬件設備要求較高[1],使用GL Studio專業的儀表仿真軟件,結合VC++6.0的混合編程設計方法,可以明顯縮短開發周期,并且達到較好的仿真效果。
本文對多功能顯示器的系統結構進行了梳理,介紹了GL Studio軟件的開發流程,重點對某型飛行訓練模擬器多功能顯示器建模與仿真過程中的幾點關鍵問題進行了研究與分析。
多功能顯示器中顯示的信息包括航行儀表信息、武器外掛信息、編隊信息、目標信息,以及機載設備狀態信息五大類別[2]。具體內容包括飛機位置、當前航向、待飛距離與時間、外掛武器數量與狀態、編隊組成、目標分配、目標飛行狀態以及機載設備工作檢測信息等。
由于多功能顯示器顯示的元素較多、信息量較大、邏輯關系復雜,因此在對多功能顯示器建模與仿真之前,應該對多功能顯示器的系統結構進行仔細梳理。多功能顯示器具體結構圖如圖1所示。

圖1 MFD結構圖
GL Studio是DiSTI公司開發的獨立于平臺、面向對象的開發工具,軟件工具包主要由圖形設計器與代碼生成器兩部分組成,圖形設計器支持所有繪圖操作,代碼生成器被內建到GL Studio設計器中,能夠生成可移植的C++代碼。開發過程分為組建圖形對象和編寫行為代碼兩個部分[3~4]。
為了實現對飛機多功能顯示器的建模與仿真,首先應該創建紋理,對多功能顯示器的操作控制板進行建模。方法有兩種[5~6]:一種是將去除了所有動態圖形單元 (例如:按鍵、開關、旋鈕等)的多功能顯示器控制面板的真實照片作為紋理;另一種是使用圖形編輯軟件(例如:PhotoShop),按照GL Studio對紋理制作的要求進行處理后產生紋理。GL Studio提供的紋理制作工具支持BMP、PNG、GIF、TIFF、JPEG等圖片格式[1,6~7]。
然后,在圖形設計器中創建圖形單元,在GL Studio中進行版面設計,將處理好的控制面板和各動態圖形單元紋理插入到圖形設計窗口中,并為所有的對象命名。在圖形設計畫布中,使用GL Studio工具欄中的各種圖元,分別繪制所有的子畫面,繪圖程序界面具有“所見即所得”的特點[3~4],設計畫布中顯示的圖元就是最終的顯示界面。
最后,在圖形用戶接口中為各對象編寫屬性和方法,實現對各圖元的動態控制。GL Studio軟件將仿真中常見的開關量與模擬量進行了完整的封裝[8]。關于按鍵、旋鈕、開關的制作,很多書籍和文章中都有詳細的介紹與講解[1,3~4]。之后使用代碼生成器生成源代碼,將源代碼嵌入到C++應用程序中,編譯生成解決方案并鏈接調試。使用GL Studio的開發流程如圖2所示[9~10]。

圖2 GL Studio開發流程圖
采用GL Studio結合VC++6.0對多功能顯示器進行建模與仿真時,由于多功能顯示器顯示的子畫面眾多,控制邏輯復雜,因此在仿真過程中存在幾點關鍵問題,具體情況如下。
4.1 導航界面中航向刻度帶的功能實現
航向刻度帶在建模時被劃分為導航界面的一個類,中間矩形方框中顯示飛機當前的實時航向。飛行過程中,界面中的飛機固定不動,航向刻度帶以飛機為中心進行旋轉,各讀數不斷變化,并隨航向刻度帶的旋轉而旋轉。建模時沒有直接繪制360°完整的航向刻度帶,而是采用“弧線+角度盤”的模式。GL Studio4.0工具欄提供了角度盤繪制圖標“”,以10°為間隔,起始角度為285°,繪制16個角度盤刻度線,弧線弧度為90°,弧線每側各多出3個角度盤刻度線。建模后如圖3所示。
然后,需要解決各圖元的驅動問題。
在類屬性Class Properties窗口創建float型成員變量currentCourse,并在用戶程序中添加代碼:
static float scale =-30.0f/30.0f; // 30 logical units, 30 degrees
char output[16], outputLeft[16], outputRight[16], outputLeft1[16], outputRight1[16];
char outputcurrentCourse[16];
_currentCourse = value; //當前航向等于實時取值
int current_course = (int)(_currentCourse + 0.5f); //對當前航向小數點后一位進行四舍五入
float diff;
int center;
center = (int)_currentCourse; //初始化中間航向值
center = center-(center % 30)+15;
sprintf(outputcurrentCourse,"%3d",current_course);
currentCourseReadout->String(outputcurrentCourse); //顯示當前航向
if(center<45) //分情況討論防止航向刻度值出現負數
{
sprintf(outputLeft1,"%3d",center-45+360);
sprintf(outputLeft,"%3d",center-15);
sprintf(outputRight,"%3d",center+15);
sprintf(outputRight1,"%3d",center+45);
leftAzimuth1Readout->String(outputLeft1);
leftAzimuthReadout->String(outputLeft);
rightAzimuthReadout->String(outputRight);
rightAzimuth1Readout->String(outputRight1);
}
else if(center<15)
{此處省略…}
else if(center>345)
{此處省略…}
else if(center>315)
{此處省略…}
else
{此處省略…}
diff = _currentCourse-(float)center;
scaleGroup->DynamicRotate(-diff*scale,Z_AXIS); //刻度帶進行旋轉
leftAzimuthReadout->DynamicRotate (diff*scale,Z_AXIS); //航向刻度值讀數反向旋轉
此處省略…
之后,需要將航向刻度帶運行顯示時多余的部分進行遮擋。
在需要顯示的航向刻度帶部分上繪制一Polygon命名為clipthis,并隱藏。在類方法Class Methods的Initialize()窗口中添加程序:
SetViewport(clipthis); //顯示矩形區域內內容
scaleGroup->GetLocation(startLoc); //獲取航向角度盤刻度線及周邊度數的初始位置
最后,需要獲取當前航向值。
在多功能顯示器主界面的類屬性Class Properties窗口創建相同的float型成員變量currentCourse,并在用戶程序中添加代碼:
_currentCourse = value;
ind->currentCourse(_currentCourse); //ind為當前航向刻度帶類的名稱
將實時獲取的當前航向數值傳遞到當前航向刻度帶類中,之后進行編譯、調試。
4.2 按鍵的采集及各子畫面之間的顯示邏輯問題
多功能顯示器周邊存在大量控制按鍵,飛行員通過按壓這些按鍵來查看不同的子畫面。因此在建模中存在以下問題。
4.2.1 按鍵的采集問題
對于虛擬按鍵、開關及旋鈕的建模本文不做太多解釋,在采用“實裝+模擬”形式的模擬器多功能顯示器界面仿真中,各周邊鍵的脈沖觸發信號很不穩定,每按壓一次都會采集到2~4個脈沖信號,但相應的響應只允許發生一次,針對這一問題,提出以下解決方法:
在MFD主界面file *.h用戶程序中為每個周邊鍵分別添加兩個int型變量,以d1鍵為例:
int d1a;
int d1b;
之后在GL Studio軟件代碼瀏覽器類方法Class Methods的initialize()代碼輸入窗口中為變量初始化:
d1a = 1;
d1b = 0;
在類屬性Class Properties窗口創建int型成員變量d1,并在用戶程序中添加代碼:
_d1 = value;
if(_d1 != d1b)
{
d1b=_d1;
if(d1b==1)
{
d1a = d1a+1;
if(d1a % 2 == 0&&d1b==1)
{
*->Visibility(TRUE); //顯示需要的類或組
*->Visibility(FALSE); //隱藏需要的類或組
}
if(d1a % 2 > 0)
{
*->Visibility(TRUE);
*->Visibility(FALSE);
}
}
}
之后,運行調試時即可實現周邊鍵的相應功能。
4.2.2 各子畫面的顯示邏輯問題
由于多功能顯示器同一個周邊鍵在不同的畫面中作用不同,這就需要對各按鍵之間的控制邏輯進行分析并通過編程得以實現[2]。
有種方法是將所有頁面設計成獨立的組件,之后建立一個組(Group),將所有獨立組件置于其下。電源的開關屬性與組(Group)的可見屬性相一致,并且每個頁面對應一個索引號,根據索引號控制其是否可見。對于同一按鍵的不同功能響應,采用虛函數的方法,通過繼承使各按鍵具有多樣性[11]。
本文除將較為復雜的導航子界面中各元素劃分為幾個類外,直接將其余各個子畫面建立成一個組,以d1鍵為例,在MFD主界面file *.h用戶程序中添加int型變量:
int _d1button;
在代碼瀏覽器類方法Class Methods的Calculate(double time)代碼輸入窗口中輸入:
_d1button=*->Visible(); //在*畫面顯示時變量_d1button=1
之后在相應的各按鍵編程時添加條件語句,實現正確的邏輯顯示。該種方法的好處在于將編程過程變得方便、簡單、更為靈活。
4.3 各子畫面仿真中的幾點問題
多功能顯示器子畫面較多,在建模過程中遇到以下幾個問題。
4.3.1 慣導快速對準中加載矩形框的變化速度問題
起初在主界面類方法Class Methods的Calculate(double time)代碼輸入窗口中使用 rectangle1_x(RampFloat(time*0.5, 0.0f, 340.0f));語句生成隨系統時間變化的float型變量rectangle1_x,之后將其賦予矩形右側的兩個頂點,但矩形框變化時速度不穩定。
之后在主界面類方法Class Methods的Calculate(double time)代碼輸入窗口中輸入:
objects->Group::Calculate(time);
if (_l4button>0) //對準畫面顯示時的條件語句
{
if(_rectangle1_x < 最大值)
_rectangle1_x=_rectangle1_x+time*0.2;
if(_rectangle1_x> 最大值)
_rectangle1_x= 最大值;
Vertex *v ; //聲明矩形各頂點
v=rectangle1->Vertices() ; //獲取矩形頂點
v[0].x= 0 ;
v[0].y= -矩形寬度一半 ;
v[1].x= 0 ;
v[1].y= 矩形寬度一半 ;
v[2].x= _rectangle1_x;
v[2].y=矩形寬度一半;
v[3].x= _rectangle1_x;
v[3].y= -矩形寬度一半;
}
else
{
rectangle1_x( 0.0f);
Vertex *v ;
v=rectangle1->Vertices() ;
v[0].x= 0 ;
v[0].y= -矩形寬度一半;
v[1].x= 0 ;
v[1].y=矩形寬度一半;
v[2].x= 0;
v[2].y=矩形寬度一半;
v[3].x= 0;
v[3].y= -矩形寬度一半;
}
運行時,很好地解決了變化速度不一致的問題。
4.3.2 漢字的顯示問題
GL Studio軟件不支持漢字的直接輸入,要想完成漢字的顯示首先應該使用圖形編輯軟件(例如:PhotoShop),制作字庫貼圖紋理。為了保證系統的實時性和充分利用系統資源,必須合理確定紋理的格式和大小。本文采用32像素/厘米,保存為PNG格式。在界面中需要輸入漢字的位置上添加一個Polygon,每個漢字對應一個Polygon,英文和數字可以直接使用TEXT元件輸入。建模后的慣導快速對準界面如圖4所示。

圖4 建模后的慣導快速對準界面
本文對GL Studio軟件結合VC++6.0進行混合編程實現某型飛行模擬器多功能顯示器建模與仿真中的幾個難點問題進行了研究與分析。經保密處理后的“實裝+模擬”形式運行中的多功能顯示器導航仿真界面如圖5所示。

圖5 運行中的MFD導航仿真界面
仿真測試結果表明:多功能顯示器各界面清晰穩定、各畫面對周邊鍵的響應正確。飛行員實際操作后提供的反饋信息顯示多功能顯示器的仿真效果逼真,可以以此為基礎,對飛行學員開展模擬任務訓練。
[1] 高穎,邵亞楠,鄭濤,等.GL Studio在飛行座艙模擬器中的仿真研究[J].彈箭與制導學報,2008,28(1):257-260.
[2] 陳曦,李國清,宋吉江,等.某型軍機多功能顯示系統的仿真[J].系統仿真學報,2006,18(增刊2):257-260.
[3] Distributed Simulation Technology Inc. GL Studio user’s guide Ver4.0[M]. Orlando,FL:Distributed Simulation Technology Inc.,2009.
[4] 于輝,趙經成,付戰平,等.GL Studio虛擬儀表技術應用與系統開發[M].北京:國防工業出版社,2010.
[5] 李秀,宋麗梅,周興明,等.GL Studio在直升機儀表面板仿真中的應用[J].計算機技術與應用,2009,29(2):42-44.
[6] 許穎慧,楊峰.GL Studio在儀表仿真開發中的關鍵技術研究[J].自動化技術與應用,2008,27(10):76-79.
[7] 王晶.虛擬座艙人機界面仿真[D].北京:北方工業大學碩士學位論文,2013.
[8] 陸志斌,郭廣利,魏靖彪,等.GL Studio在飛機模擬器虛擬儀表仿真中的應用[J].電腦編程技術與維護,2012(12):114-116.
[9] 楊大光,常波,孫國慶,等.GL Studio在飛機儀表板仿真中的應用[J].現代電子技術,2010(24):158-160.
[10] 藍仁恩,劉志成,王志樂,等.機載慣導系統可視化仿真方法研究[J].現代電子技術,2011,34(9):203-205.
[11] 于鳳全,李保剛.GL Studio在飛機多功能顯示器仿真中的應用[J].數字技術與應用,2011(1):29-3.
Exploration on Several Key Issues in MFD Modeling and Simulation of Some Model Flight Simulator Based on GL Studio
HAN Chen1LIU Chaohui2CHEN Xueying2
(1. Department of Carrier-based Aircraft, Naval Aviation Academy, Huludao 125001)(2. Department of Operational Command, Naval Aviation Academy, Huludao 125001)
Using the design method of hybrid programming with GL Studio software and VC++6.0, the modeling and simulation in MFD of some model flight simulator is realized. But for the reason of more information to be shown, more cross linking relationship and more complicated control logic in MFD, it is more difficult in the process of modeling and simulation. This article studies and analyses several key issues in MFD modeling and simulation of some model flight simulator, and the simulation results are shown in this paper. Practice has proved that the method proposed in this paper solves several difficult problems better in modeling and simulation of MFD.
GL Studio, VC++6.0, MFD, control logic, modeling and simulation
2016年5月7日,
2016年6月19日
2015軍事訓練科研項目(**模擬訓練系統)資助。
韓晨,男,碩士,講師,研究方向:飛機結構、導航與制導系統、海軍飛行。劉超慧,男,碩士,講師,研究方向:地面領航與指揮引導。陳雪英,女,碩士,講師,研究方向:地面領航與陸空通話英語。
TP391.9
10.3969/j.issn.1672-9730.2016.11.005