覃楊森 聶 睿 范彥勤 喬東峰
試飛實時數據可視化方法研究
覃楊森 聶 睿 范彥勤 喬東峰
依靠單一的數值分析及數據演算判斷很難提高對實時試飛科目的評判效率,并嚴重影響了險情處置時的快速決策。將實時試飛數據分析結果進行結構化存儲,采用列模式內存對齊方法,提高單個參數的檢索查詢及圖形輸出操作效率;對C++builder標準組件類屬性及方法進行擴充,實現對常規和特殊飛行科目定制結果曲線圖的繪制輸出;嵌入VC++動態計算庫,利用進程調用方式,融合Matlab平臺GUI應用程序,共享試飛科目數據分析常用算法庫,擴展軟件綜合輸出功能。實現了對試飛實時數據分析結果的可視化輸出,為飛行決策提供了更直觀的數據參考。
在國內的飛行試驗過程中,通過采集飛機姿態及狀態參數,利用遙測鏈路將飛行數據實時傳回地面,經解算后顯示輸出到監控畫面中,以幫助試飛工程師及地面指揮員及時判斷飛行狀態是否達到飛機設計指標要求,整個監控系統架構如圖1所示。同時在飛機遇到險情時,數據的實時監控輸出能夠為準確決策出恰當的處置方案提供最直觀最可靠的判斷分析依據。因此,在試飛實時監控環境下,需要及時對試飛數據分析結果做出評判。而如何對分析結果的可視化輸出,以全面準確反映出飛機各個系統交聯狀態的參數信息,突出飛行試驗中特定時刻下的關鍵數據,是完成評判決策環節的重要步驟。
目前,在數據結果可視化輸出中常用的origin軟件生成方法雖然形式豐富,但由于其著重于軟件通用性設計,反而使得針對性功能薄弱,無法針對試飛科目評判圖將數據輸出。因此,在實時的分析結果處理中,較簡便針對性強的可視化輸出方法就更有利于數據分析的完成。除了具備使用便捷、平臺可擴展及能夠完成特殊飛行科目曲線繪制等特性外,同時應可對常用的Matlab GUI應用程序提供必要的方法接口,充分具備平臺融合的綜合輸出特點?;贑++builder環境下試飛數據分析結果的可視化輸出方法,擴展了標準繪圖構件類屬性及方法,結合結構體的內存存儲特點,解決與Matlab平臺的調用及進程管理問題,有針對性完成了相應的數據可視化綜合輸出功能的設計與實現。
試飛數據分析結果的可視化輸出方法分為數據結構化存儲、數據時間段選取、參數數據導出、特殊曲線繪制和擴展平臺綜合輸出五個階段步驟。步驟間通過進程控制信號或者數據流指針等接口實現內存數據區的交互和共享,總體架構如圖2所示。
步驟一:數據結構化存儲通過輸入進程事件觸發。選擇需要進行分析的文件路徑,由此獲得文件句柄,依次完成對文件內部數據的內存導入,進行文件元素的遍歷,完成對文件存儲結構體的構造,同時根據文件的信息,初始化下一階段內存區域及進程控制信號。
步驟二:在數據時間段選取階段中,對需要畫圖的參數進行標記,觸發相應圖形區域的繪制信號量。創建數據檢索進程,查找出參數的最大最小值,自主完成畫圖區域的上下限設定,并根據相應的操作控制事件進行手動調節,通過不同區域的圖形繪制進程的同步控制,使得需要導出的參數進行時間點和選取時間段的同步。
步驟三:將選定的參數時間段數據進行另存操作。以選取好的時間段為基準,對全部或者部分參數數據以文本格式導出分析平臺,進而可以將數據在其他平臺中進一步分析。對于導出的分析結果,可以創建新的內存緩沖區塊,構造生成圖片格式的保存或者打印,以運用于分析報告的編寫。
步驟四:繪制指定科目特殊曲線。根據飛行實時繪圖評判需求,完成例如參數對曲線圖、1對1曲線圖、1對N曲線圖及散點評判圖等圖形顯示,由定制曲線繪制進程單獨完成,并利用進程的內存空間,獲取數據指針信息,完成相應的圖片格式儲存及打印輸出。
步驟五:通過平臺擴展接口,結合科目分析中常用的DLL算法動態庫,操作數據指針及內存模塊,進行一些頻譜分析或伯特圖輸出。同時,利用進程控制信號與Matlab平臺應用程序進行內存數據交互調用,將數據與狀態參數綜合顯示到指定繪圖區域中,以實現對結果的綜合輸出。

圖1 試飛數據實時監控系統架構圖

圖2 方法步驟流程圖
根據可視化方法過程,基于C++builder開發平臺進行可視化輸出軟件設計與實現。C++builder平臺有著豐富的圖形繪制功能,以控件模塊的實現方式更容易對操作事件及控制信號進行管理和響應。在對數據進行處理過程中,可以利用列對齊管理方式,通過系統本身的信號收發機制響應動作句柄,并建立共享緩存區域,發揮C++builder與VC++平臺的兼容性及結合Matlab的工具箱,獲得圖形結果的綜合顯示輸出。整體實現方案如圖3所示。
數據結構化存儲
由于編譯器在對內存進行分配管理時,對于結構體的存放遵循列對齊管理模式,有別于數組內存管理的順序存放模式,所以在考慮到數據量大小的前提下,采用結構化存儲方式。獲取數據在內存中的文件句柄之后,對文件元素進行遍歷,依次完成結構體的構造。根據實際使用需求,大部分操作都是由參數列為引導,以完成各功能之間的關聯與融合。因此,采用列模式元素遍歷方式,即將數據與其參數名稱關聯,存放入同一個結構體中。在節省了內存開銷的同時,也可以提高對各個參數的操作效率。由于時間信息不是特定的數據類型,因而采用了包含String數組的結構體存放,并與數據點數一一對應,方便了時間段的檢索和起始點的選擇。

圖3 軟件整體框架圖
數據時間段截取
對于某一飛行科目而言,所涉及的參數之間,都存在著某種必然的關系。因此,在進行數據時間段截取的過程中,就必須充分了解各個參數在同一時間點的數據狀態。根據參數間的相互應證關系,去分析和判斷飛機的飛行狀態。為此,可視化輸出軟件提供了四種參數顯示頁面模式,分別可以同時在同一頁面顯示兩個、四個、六個及九個參數之間的曲線關系。同時,也可以將所有的圖形操作同步到總體控制滑塊上,以完成不同顯示畫面上參數的操作關聯。
在進行參數曲線顯示時,使用C++builder環境下的標準TChart控件,因而對于單個的控件而言,所包含的屬性值及方法都是私有的,要完成它們相互之間的同步顯示,必須在窗體類TFrom下定義公共的類,其中的屬性和方法能夠被外部控件所獲取和修改。另外,在窗體類下嵌套定義的曲線顯示公用類,還可以避免標準控件TChart使用析構函數釋放資源時引起的溢出異常。由于C++builder環境下的標準組件內都封裝了與之相匹配的析構函數,用于被調用結束后會釋放系統資源,而析構函數本身是不可以被重載和覆蓋的。因此,如果對標準組件的內部屬性或者方法進行修改后,必然會引起系統資源使用的變化,使得析構函數不能完整釋放資源空間,導致容器構件的運行異常,出現不確定性的錯誤。在軟件中,自定義的公共類及方法接口類的UML類圖如圖4表示。
基于以上的類關聯設計,可以完成參數之間X軸方向上的上下限同步操作。同時,還可以根據參數Y軸方向上的數值變化范圍,分別調整相應的上下限,將不需要的變化范圍進行過濾。在對某一參數完成起始點的確定后,其他參數自動顯示對應的起始標記線,與之同步操作。
數據導出
將參數數據導出到外部文件中,使得可以借助其他軟件對相關參數完成進一步的分析。可視化輸出軟件設計了按照時間段截取方式對所有參數或者部分參數導出到數據文本的操作。當確定好數據時間段的起始標記線以后,可以通過鼠標操作,在參數名稱列表中進行導出標記。如果沒有標記其中某一參數時,軟件默認將所有參數導出,否則,只導出已被標記選中的參數。導出的參數以文本格式進行存儲,可以使用Origin、Matlab或其他數據分析軟件直接讀取。另外,對于某些特殊的參數,需要通過圖片或者打印將曲線圖輸出。軟件平臺對每一個圖形曲線都綁定提供了這兩種操作。軟件將需要保存圖片或打印的曲線圖加載到內存緩沖區中,實例化為圖片或者打印的對象。如果是保存圖片操作,則根據選取的圖片格式進行壓縮輸出;如果是打印操作,則啟動打印機,根據畫面大小,調整分辨率后,打印輸出文件,可以選擇PDF打印格式或者是系統默認的MDI格式。

圖4 自定義UML類圖
特定曲線繪制
在某些飛行科目的數據分析中,經常利用橫縱軸去分別表示不同的參數,以得到更準確的評判結果。類似于這樣的曲線圖,在軟件中作為特殊構圖處理。根據目前的分析需要,分為三種特殊圖形類:(1)在同一個曲線圖中同時繪制多條曲線,即1對N模式;(2)在等級評判分析圖中顯示數據點分布狀態,即散點分布圖模式;(3)可以同時設定橫縱軸所表示的參數,即參數對曲線模式。
對于第(1)種特殊曲線圖,需要用不同的曲線標記區別不同的參數曲線,以使得圖形能夠清晰表示出參數的變化情況,并在圖形右上方顯示不同標記與參數的對應關系。在該種曲線圖中,也融合了右鍵快捷菜單的“關聯”、“圖片導出”及“打印”操作,以方便與其他頁面模式下的參數進行關聯分析,并能夠便捷的將曲線結果保存和輸出。
等級評判分析主要針對類似姿態敏捷、動力升限和振動狀態評估等需求應用。在此類圖形的構建中,首先需要明確各等級的坐標關系,繪制出等級判別曲線。通過右鍵快捷菜單,以描點曲線類型的顯示方式,導入需要繪制的結果數據。同樣的,可以對曲線進行圖片保存及打印操作,如圖5所示。
在雙軸曲線繪圖中,需要對橫軸和縱軸分別設定相對應的參數。曲線圖將會根據實際的數據,分別設定出圖形的上下限。在分析過程中,可根據需要更改各個軸方向上所表示的參數,并且可以使用上下限設置按鈕,合理設置圖形所顯示的放大或縮小倍數。最終,可以以圖片格式對結果進行保存。
擴展接口實現
由于各個飛行科目參數的計算分析方法不盡一致,因此,需要根據每個科目的具體要求,設計相關的算法。這些算法可以直接嵌套到軟件平臺的控件操作中,也可以外部程序調用的方式實現。對于嵌套式的算法調用,最便捷的方式是通過按鈕控件進行觸發加載VC++平臺的DLL動態計算庫,并可以利用指針地址傳遞操作程序體內存中的相關變量。同時,嵌套式動態庫調用與軟件平臺使用同樣的進程資源,在交互計算操作上更有效率,也不需要對同樣的數據進行多次內存分配。

圖5 散點分布圖
對于一些較復雜的算法,在構件的方法下實現起來比較困難,因而可以借助Matlab計算平臺,將這些算法結合到計算分析過程中??梢暬敵鲕浖性O計的與Matlab平臺接口,主要是通過可執行程序的交互調用來實現。在Matlab平臺下,將需要使用的算法庫寫成函數形式的M文件,可以在函數體中對算法庫直接調用,也可以是嵌套調用。在函數形式的M文件中定義需要使用到的參數接口,這將影響到用戶界面GUI的輸入組件設計。完成函數的參數接口定義之后,創建Matlab圖形用戶界面工程,根據參數接口定義的情況,對應分布輸入組件,針對組件綁定的callback屬性,與函數建立起對應關系,并由此獲取到算法中需要的計算參數。如果是文件,則需要啟用文件選擇對話框交互,獲取到文件句柄,形成傳遞參數,完成算法參數的響應。接著,針對GUI工程中的M文件,啟用Matlab命令Deploytool,以exe工程方式新建項目,將GUI工程編譯形成可執行exe文件,并生成對應的說明文本。在此,便可以在C++builder環境下,以進程應用程序的調用語句,即可將在軟件界面上添加入Matlab的交互執行觸發動作,方法如圖6所示。
對于此方式的調用,需要通過單獨的共享數據區實現兩個平臺的數據操作,不可以通過全局變量定義或變量外部調用。另外,命令Deploytool在Matlab2012b版本下使用更為方便,對于早期的版本,可以借鑒使用Comtool命令。如果需要在沒有Matlab軟件環境下使用exe程序,則需要在對M文件打包過程中,在文件包中包含入MCR(Matlab Compiler Runtime)安裝包,用于在無Matlab安裝的環境下解析形成的exe程序,以實現跨平臺的應用。
將可視化輸出軟件運行于實時遙測數據監控平臺系統客戶端中,接收實際飛行數據,根據試驗任務書的需要進行了多種圖形的輸出,給飛行指揮員及試飛工程師提供了多種飛行姿態的評判參考。經對比驗證表明,可視化輸出方法的結構化數據存儲,以列模式內存對齊檢索,方便了功能實現。由于計算機運行時,對于內存塊的利用并不是連續的,因此如果定義了較大的數組存儲空間時,會因為在內存中無法找到同樣大小的連續內存塊而溢出。但如果以結構體存放,則可以使用動態內存空間申請的方式,因而避免了溢出的發生。
同時,軟件實現中對C++builder標準構件類進行屬性及方法的擴展,為構件間的關聯操作提供了更便捷的途徑。將標準構件的關聯屬性及方法定義到容器構件類的公用定義范圍內,有效避免了標準構件類內部的析構函數運行時產生內存泄露的異常。
另外,軟件提供了與Matlab計算平臺融合應用的接口管理。除了有DLL算法庫的調用關系以外,兼容了GUI界面與用戶進行交互。由于帶有GUI組件的Matlab程序,不是單一的函數M文件,因此編譯生成的可執行文件在C++builder主程序中以進程應用程序方式調用,合理分配了計算資源。

圖6 綜合輸出平臺結構圖
試飛數據分析結果的可視化輸出方法及軟件實現以參數時間段同步選取導出為基本功能,結合并擴展了開發平臺下各個標準構件之間的關聯屬性及方法,提供了便于曲線結果導出的圖形保存及打印輸出功能。同時,根據實際科目分析需求,實現了特殊曲線圖形的繪制。在與Matlab平臺結合應用的過程中,考慮了兩個平臺之間的進程調用及任務資源的管理關系,以提高參數操作效率??梢暬敵龇椒▽⒁袁F階段的功能應用為基礎,繼續深入探索兩個平臺之間在程序編譯過程中的差異,為提高平臺函數庫互用的計算效率做更多工作。
10.3969/j.issn.1001-8972.2015.21.009