覃楊森 聶 睿 范彥勤 喬?hào)|峰
試飛實(shí)時(shí)數(shù)據(jù)可視化方法研究
覃楊森 聶 睿 范彥勤 喬?hào)|峰
依靠單一的數(shù)值分析及數(shù)據(jù)演算判斷很難提高對實(shí)時(shí)試飛科目的評判效率,并嚴(yán)重影響了險(xiǎn)情處置時(shí)的快速?zèng)Q策。將實(shí)時(shí)試飛數(shù)據(jù)分析結(jié)果進(jìn)行結(jié)構(gòu)化存儲(chǔ),采用列模式內(nèi)存對齊方法,提高單個(gè)參數(shù)的檢索查詢及圖形輸出操作效率;對C++builder標(biāo)準(zhǔn)組件類屬性及方法進(jìn)行擴(kuò)充,實(shí)現(xiàn)對常規(guī)和特殊飛行科目定制結(jié)果曲線圖的繪制輸出;嵌入VC++動(dòng)態(tài)計(jì)算庫,利用進(jìn)程調(diào)用方式,融合Matlab平臺(tái)GUI應(yīng)用程序,共享試飛科目數(shù)據(jù)分析常用算法庫,擴(kuò)展軟件綜合輸出功能。實(shí)現(xiàn)了對試飛實(shí)時(shí)數(shù)據(jù)分析結(jié)果的可視化輸出,為飛行決策提供了更直觀的數(shù)據(jù)參考。
在國內(nèi)的飛行試驗(yàn)過程中,通過采集飛機(jī)姿態(tài)及狀態(tài)參數(shù),利用遙測鏈路將飛行數(shù)據(jù)實(shí)時(shí)傳回地面,經(jīng)解算后顯示輸出到監(jiān)控畫面中,以幫助試飛工程師及地面指揮員及時(shí)判斷飛行狀態(tài)是否達(dá)到飛機(jī)設(shè)計(jì)指標(biāo)要求,整個(gè)監(jiān)控系統(tǒng)架構(gòu)如圖1所示。同時(shí)在飛機(jī)遇到險(xiǎn)情時(shí),數(shù)據(jù)的實(shí)時(shí)監(jiān)控輸出能夠?yàn)闇?zhǔn)確決策出恰當(dāng)?shù)奶幹梅桨柑峁┳钪庇^最可靠的判斷分析依據(jù)。因此,在試飛實(shí)時(shí)監(jiān)控環(huán)境下,需要及時(shí)對試飛數(shù)據(jù)分析結(jié)果做出評判。而如何對分析結(jié)果的可視化輸出,以全面準(zhǔn)確反映出飛機(jī)各個(gè)系統(tǒng)交聯(lián)狀態(tài)的參數(shù)信息,突出飛行試驗(yàn)中特定時(shí)刻下的關(guān)鍵數(shù)據(jù),是完成評判決策環(huán)節(jié)的重要步驟。
目前,在數(shù)據(jù)結(jié)果可視化輸出中常用的origin軟件生成方法雖然形式豐富,但由于其著重于軟件通用性設(shè)計(jì),反而使得針對性功能薄弱,無法針對試飛科目評判圖將數(shù)據(jù)輸出。因此,在實(shí)時(shí)的分析結(jié)果處理中,較簡便針對性強(qiáng)的可視化輸出方法就更有利于數(shù)據(jù)分析的完成。除了具備使用便捷、平臺(tái)可擴(kuò)展及能夠完成特殊飛行科目曲線繪制等特性外,同時(shí)應(yīng)可對常用的Matlab GUI應(yīng)用程序提供必要的方法接口,充分具備平臺(tái)融合的綜合輸出特點(diǎn)。基于C++builder環(huán)境下試飛數(shù)據(jù)分析結(jié)果的可視化輸出方法,擴(kuò)展了標(biāo)準(zhǔn)繪圖構(gòu)件類屬性及方法,結(jié)合結(jié)構(gòu)體的內(nèi)存存儲(chǔ)特點(diǎn),解決與Matlab平臺(tái)的調(diào)用及進(jìn)程管理問題,有針對性完成了相應(yīng)的數(shù)據(jù)可視化綜合輸出功能的設(shè)計(jì)與實(shí)現(xiàn)。
試飛數(shù)據(jù)分析結(jié)果的可視化輸出方法分為數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)、數(shù)據(jù)時(shí)間段選取、參數(shù)數(shù)據(jù)導(dǎo)出、特殊曲線繪制和擴(kuò)展平臺(tái)綜合輸出五個(gè)階段步驟。步驟間通過進(jìn)程控制信號(hào)或者數(shù)據(jù)流指針等接口實(shí)現(xiàn)內(nèi)存數(shù)據(jù)區(qū)的交互和共享,總體架構(gòu)如圖2所示。
步驟一:數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)通過輸入進(jìn)程事件觸發(fā)。選擇需要進(jìn)行分析的文件路徑,由此獲得文件句柄,依次完成對文件內(nèi)部數(shù)據(jù)的內(nèi)存導(dǎo)入,進(jìn)行文件元素的遍歷,完成對文件存儲(chǔ)結(jié)構(gòu)體的構(gòu)造,同時(shí)根據(jù)文件的信息,初始化下一階段內(nèi)存區(qū)域及進(jìn)程控制信號(hào)。
步驟二:在數(shù)據(jù)時(shí)間段選取階段中,對需要畫圖的參數(shù)進(jìn)行標(biāo)記,觸發(fā)相應(yīng)圖形區(qū)域的繪制信號(hào)量。創(chuàng)建數(shù)據(jù)檢索進(jìn)程,查找出參數(shù)的最大最小值,自主完成畫圖區(qū)域的上下限設(shè)定,并根據(jù)相應(yīng)的操作控制事件進(jìn)行手動(dòng)調(diào)節(jié),通過不同區(qū)域的圖形繪制進(jìn)程的同步控制,使得需要導(dǎo)出的參數(shù)進(jìn)行時(shí)間點(diǎn)和選取時(shí)間段的同步。
步驟三:將選定的參數(shù)時(shí)間段數(shù)據(jù)進(jìn)行另存操作。以選取好的時(shí)間段為基準(zhǔn),對全部或者部分參數(shù)數(shù)據(jù)以文本格式導(dǎo)出分析平臺(tái),進(jìn)而可以將數(shù)據(jù)在其他平臺(tái)中進(jìn)一步分析。對于導(dǎo)出的分析結(jié)果,可以創(chuàng)建新的內(nèi)存緩沖區(qū)塊,構(gòu)造生成圖片格式的保存或者打印,以運(yùn)用于分析報(bào)告的編寫。
步驟四:繪制指定科目特殊曲線。根據(jù)飛行實(shí)時(shí)繪圖評判需求,完成例如參數(shù)對曲線圖、1對1曲線圖、1對N曲線圖及散點(diǎn)評判圖等圖形顯示,由定制曲線繪制進(jìn)程單獨(dú)完成,并利用進(jìn)程的內(nèi)存空間,獲取數(shù)據(jù)指針信息,完成相應(yīng)的圖片格式儲(chǔ)存及打印輸出。
步驟五:通過平臺(tái)擴(kuò)展接口,結(jié)合科目分析中常用的DLL算法動(dòng)態(tài)庫,操作數(shù)據(jù)指針及內(nèi)存模塊,進(jìn)行一些頻譜分析或伯特圖輸出。同時(shí),利用進(jìn)程控制信號(hào)與Matlab平臺(tái)應(yīng)用程序進(jìn)行內(nèi)存數(shù)據(jù)交互調(diào)用,將數(shù)據(jù)與狀態(tài)參數(shù)綜合顯示到指定繪圖區(qū)域中,以實(shí)現(xiàn)對結(jié)果的綜合輸出。
圖1 試飛數(shù)據(jù)實(shí)時(shí)監(jiān)控系統(tǒng)架構(gòu)圖
圖2 方法步驟流程圖
根據(jù)可視化方法過程,基于C++builder開發(fā)平臺(tái)進(jìn)行可視化輸出軟件設(shè)計(jì)與實(shí)現(xiàn)。C++builder平臺(tái)有著豐富的圖形繪制功能,以控件模塊的實(shí)現(xiàn)方式更容易對操作事件及控制信號(hào)進(jìn)行管理和響應(yīng)。在對數(shù)據(jù)進(jìn)行處理過程中,可以利用列對齊管理方式,通過系統(tǒng)本身的信號(hào)收發(fā)機(jī)制響應(yīng)動(dòng)作句柄,并建立共享緩存區(qū)域,發(fā)揮C++builder與VC++平臺(tái)的兼容性及結(jié)合Matlab的工具箱,獲得圖形結(jié)果的綜合顯示輸出。整體實(shí)現(xiàn)方案如圖3所示。
數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)
由于編譯器在對內(nèi)存進(jìn)行分配管理時(shí),對于結(jié)構(gòu)體的存放遵循列對齊管理模式,有別于數(shù)組內(nèi)存管理的順序存放模式,所以在考慮到數(shù)據(jù)量大小的前提下,采用結(jié)構(gòu)化存儲(chǔ)方式。獲取數(shù)據(jù)在內(nèi)存中的文件句柄之后,對文件元素進(jìn)行遍歷,依次完成結(jié)構(gòu)體的構(gòu)造。根據(jù)實(shí)際使用需求,大部分操作都是由參數(shù)列為引導(dǎo),以完成各功能之間的關(guān)聯(lián)與融合。因此,采用列模式元素遍歷方式,即將數(shù)據(jù)與其參數(shù)名稱關(guān)聯(lián),存放入同一個(gè)結(jié)構(gòu)體中。在節(jié)省了內(nèi)存開銷的同時(shí),也可以提高對各個(gè)參數(shù)的操作效率。由于時(shí)間信息不是特定的數(shù)據(jù)類型,因而采用了包含String數(shù)組的結(jié)構(gòu)體存放,并與數(shù)據(jù)點(diǎn)數(shù)一一對應(yīng),方便了時(shí)間段的檢索和起始點(diǎn)的選擇。
圖3 軟件整體框架圖
數(shù)據(jù)時(shí)間段截取
對于某一飛行科目而言,所涉及的參數(shù)之間,都存在著某種必然的關(guān)系。因此,在進(jìn)行數(shù)據(jù)時(shí)間段截取的過程中,就必須充分了解各個(gè)參數(shù)在同一時(shí)間點(diǎn)的數(shù)據(jù)狀態(tài)。根據(jù)參數(shù)間的相互應(yīng)證關(guān)系,去分析和判斷飛機(jī)的飛行狀態(tài)。為此,可視化輸出軟件提供了四種參數(shù)顯示頁面模式,分別可以同時(shí)在同一頁面顯示兩個(gè)、四個(gè)、六個(gè)及九個(gè)參數(shù)之間的曲線關(guān)系。同時(shí),也可以將所有的圖形操作同步到總體控制滑塊上,以完成不同顯示畫面上參數(shù)的操作關(guān)聯(lián)。
在進(jìn)行參數(shù)曲線顯示時(shí),使用C++builder環(huán)境下的標(biāo)準(zhǔn)TChart控件,因而對于單個(gè)的控件而言,所包含的屬性值及方法都是私有的,要完成它們相互之間的同步顯示,必須在窗體類TFrom下定義公共的類,其中的屬性和方法能夠被外部控件所獲取和修改。另外,在窗體類下嵌套定義的曲線顯示公用類,還可以避免標(biāo)準(zhǔn)控件TChart使用析構(gòu)函數(shù)釋放資源時(shí)引起的溢出異常。由于C++builder環(huán)境下的標(biāo)準(zhǔn)組件內(nèi)都封裝了與之相匹配的析構(gòu)函數(shù),用于被調(diào)用結(jié)束后會(huì)釋放系統(tǒng)資源,而析構(gòu)函數(shù)本身是不可以被重載和覆蓋的。因此,如果對標(biāo)準(zhǔn)組件的內(nèi)部屬性或者方法進(jìn)行修改后,必然會(huì)引起系統(tǒng)資源使用的變化,使得析構(gòu)函數(shù)不能完整釋放資源空間,導(dǎo)致容器構(gòu)件的運(yùn)行異常,出現(xiàn)不確定性的錯(cuò)誤。在軟件中,自定義的公共類及方法接口類的UML類圖如圖4表示。
基于以上的類關(guān)聯(lián)設(shè)計(jì),可以完成參數(shù)之間X軸方向上的上下限同步操作。同時(shí),還可以根據(jù)參數(shù)Y軸方向上的數(shù)值變化范圍,分別調(diào)整相應(yīng)的上下限,將不需要的變化范圍進(jìn)行過濾。在對某一參數(shù)完成起始點(diǎn)的確定后,其他參數(shù)自動(dòng)顯示對應(yīng)的起始標(biāo)記線,與之同步操作。
數(shù)據(jù)導(dǎo)出
將參數(shù)數(shù)據(jù)導(dǎo)出到外部文件中,使得可以借助其他軟件對相關(guān)參數(shù)完成進(jìn)一步的分析??梢暬敵鲕浖O(shè)計(jì)了按照時(shí)間段截取方式對所有參數(shù)或者部分參數(shù)導(dǎo)出到數(shù)據(jù)文本的操作。當(dāng)確定好數(shù)據(jù)時(shí)間段的起始標(biāo)記線以后,可以通過鼠標(biāo)操作,在參數(shù)名稱列表中進(jìn)行導(dǎo)出標(biāo)記。如果沒有標(biāo)記其中某一參數(shù)時(shí),軟件默認(rèn)將所有參數(shù)導(dǎo)出,否則,只導(dǎo)出已被標(biāo)記選中的參數(shù)。導(dǎo)出的參數(shù)以文本格式進(jìn)行存儲(chǔ),可以使用Origin、Matlab或其他數(shù)據(jù)分析軟件直接讀取。另外,對于某些特殊的參數(shù),需要通過圖片或者打印將曲線圖輸出。軟件平臺(tái)對每一個(gè)圖形曲線都綁定提供了這兩種操作。軟件將需要保存圖片或打印的曲線圖加載到內(nèi)存緩沖區(qū)中,實(shí)例化為圖片或者打印的對象。如果是保存圖片操作,則根據(jù)選取的圖片格式進(jìn)行壓縮輸出;如果是打印操作,則啟動(dòng)打印機(jī),根據(jù)畫面大小,調(diào)整分辨率后,打印輸出文件,可以選擇PDF打印格式或者是系統(tǒng)默認(rèn)的MDI格式。
圖4 自定義UML類圖
特定曲線繪制
在某些飛行科目的數(shù)據(jù)分析中,經(jīng)常利用橫縱軸去分別表示不同的參數(shù),以得到更準(zhǔn)確的評判結(jié)果。類似于這樣的曲線圖,在軟件中作為特殊構(gòu)圖處理。根據(jù)目前的分析需要,分為三種特殊圖形類:(1)在同一個(gè)曲線圖中同時(shí)繪制多條曲線,即1對N模式;(2)在等級(jí)評判分析圖中顯示數(shù)據(jù)點(diǎn)分布狀態(tài),即散點(diǎn)分布圖模式;(3)可以同時(shí)設(shè)定橫縱軸所表示的參數(shù),即參數(shù)對曲線模式。
對于第(1)種特殊曲線圖,需要用不同的曲線標(biāo)記區(qū)別不同的參數(shù)曲線,以使得圖形能夠清晰表示出參數(shù)的變化情況,并在圖形右上方顯示不同標(biāo)記與參數(shù)的對應(yīng)關(guān)系。在該種曲線圖中,也融合了右鍵快捷菜單的“關(guān)聯(lián)”、“圖片導(dǎo)出”及“打印”操作,以方便與其他頁面模式下的參數(shù)進(jìn)行關(guān)聯(lián)分析,并能夠便捷的將曲線結(jié)果保存和輸出。
等級(jí)評判分析主要針對類似姿態(tài)敏捷、動(dòng)力升限和振動(dòng)狀態(tài)評估等需求應(yīng)用。在此類圖形的構(gòu)建中,首先需要明確各等級(jí)的坐標(biāo)關(guān)系,繪制出等級(jí)判別曲線。通過右鍵快捷菜單,以描點(diǎn)曲線類型的顯示方式,導(dǎo)入需要繪制的結(jié)果數(shù)據(jù)。同樣的,可以對曲線進(jìn)行圖片保存及打印操作,如圖5所示。
在雙軸曲線繪圖中,需要對橫軸和縱軸分別設(shè)定相對應(yīng)的參數(shù)。曲線圖將會(huì)根據(jù)實(shí)際的數(shù)據(jù),分別設(shè)定出圖形的上下限。在分析過程中,可根據(jù)需要更改各個(gè)軸方向上所表示的參數(shù),并且可以使用上下限設(shè)置按鈕,合理設(shè)置圖形所顯示的放大或縮小倍數(shù)。最終,可以以圖片格式對結(jié)果進(jìn)行保存。
擴(kuò)展接口實(shí)現(xiàn)
由于各個(gè)飛行科目參數(shù)的計(jì)算分析方法不盡一致,因此,需要根據(jù)每個(gè)科目的具體要求,設(shè)計(jì)相關(guān)的算法。這些算法可以直接嵌套到軟件平臺(tái)的控件操作中,也可以外部程序調(diào)用的方式實(shí)現(xiàn)。對于嵌套式的算法調(diào)用,最便捷的方式是通過按鈕控件進(jìn)行觸發(fā)加載VC++平臺(tái)的DLL動(dòng)態(tài)計(jì)算庫,并可以利用指針地址傳遞操作程序體內(nèi)存中的相關(guān)變量。同時(shí),嵌套式動(dòng)態(tài)庫調(diào)用與軟件平臺(tái)使用同樣的進(jìn)程資源,在交互計(jì)算操作上更有效率,也不需要對同樣的數(shù)據(jù)進(jìn)行多次內(nèi)存分配。
圖5 散點(diǎn)分布圖
對于一些較復(fù)雜的算法,在構(gòu)件的方法下實(shí)現(xiàn)起來比較困難,因而可以借助Matlab計(jì)算平臺(tái),將這些算法結(jié)合到計(jì)算分析過程中。可視化輸出軟件中設(shè)計(jì)的與Matlab平臺(tái)接口,主要是通過可執(zhí)行程序的交互調(diào)用來實(shí)現(xiàn)。在Matlab平臺(tái)下,將需要使用的算法庫寫成函數(shù)形式的M文件,可以在函數(shù)體中對算法庫直接調(diào)用,也可以是嵌套調(diào)用。在函數(shù)形式的M文件中定義需要使用到的參數(shù)接口,這將影響到用戶界面GUI的輸入組件設(shè)計(jì)。完成函數(shù)的參數(shù)接口定義之后,創(chuàng)建Matlab圖形用戶界面工程,根據(jù)參數(shù)接口定義的情況,對應(yīng)分布輸入組件,針對組件綁定的callback屬性,與函數(shù)建立起對應(yīng)關(guān)系,并由此獲取到算法中需要的計(jì)算參數(shù)。如果是文件,則需要啟用文件選擇對話框交互,獲取到文件句柄,形成傳遞參數(shù),完成算法參數(shù)的響應(yīng)。接著,針對GUI工程中的M文件,啟用Matlab命令Deploytool,以exe工程方式新建項(xiàng)目,將GUI工程編譯形成可執(zhí)行exe文件,并生成對應(yīng)的說明文本。在此,便可以在C++builder環(huán)境下,以進(jìn)程應(yīng)用程序的調(diào)用語句,即可將在軟件界面上添加入Matlab的交互執(zhí)行觸發(fā)動(dòng)作,方法如圖6所示。
對于此方式的調(diào)用,需要通過單獨(dú)的共享數(shù)據(jù)區(qū)實(shí)現(xiàn)兩個(gè)平臺(tái)的數(shù)據(jù)操作,不可以通過全局變量定義或變量外部調(diào)用。另外,命令Deploytool在Matlab2012b版本下使用更為方便,對于早期的版本,可以借鑒使用Comtool命令。如果需要在沒有Matlab軟件環(huán)境下使用exe程序,則需要在對M文件打包過程中,在文件包中包含入MCR(Matlab Compiler Runtime)安裝包,用于在無Matlab安裝的環(huán)境下解析形成的exe程序,以實(shí)現(xiàn)跨平臺(tái)的應(yīng)用。
將可視化輸出軟件運(yùn)行于實(shí)時(shí)遙測數(shù)據(jù)監(jiān)控平臺(tái)系統(tǒng)客戶端中,接收實(shí)際飛行數(shù)據(jù),根據(jù)試驗(yàn)任務(wù)書的需要進(jìn)行了多種圖形的輸出,給飛行指揮員及試飛工程師提供了多種飛行姿態(tài)的評判參考。經(jīng)對比驗(yàn)證表明,可視化輸出方法的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ),以列模式內(nèi)存對齊檢索,方便了功能實(shí)現(xiàn)。由于計(jì)算機(jī)運(yùn)行時(shí),對于內(nèi)存塊的利用并不是連續(xù)的,因此如果定義了較大的數(shù)組存儲(chǔ)空間時(shí),會(huì)因?yàn)樵趦?nèi)存中無法找到同樣大小的連續(xù)內(nèi)存塊而溢出。但如果以結(jié)構(gòu)體存放,則可以使用動(dòng)態(tài)內(nèi)存空間申請的方式,因而避免了溢出的發(fā)生。
同時(shí),軟件實(shí)現(xiàn)中對C++builder標(biāo)準(zhǔn)構(gòu)件類進(jìn)行屬性及方法的擴(kuò)展,為構(gòu)件間的關(guān)聯(lián)操作提供了更便捷的途徑。將標(biāo)準(zhǔn)構(gòu)件的關(guān)聯(lián)屬性及方法定義到容器構(gòu)件類的公用定義范圍內(nèi),有效避免了標(biāo)準(zhǔn)構(gòu)件類內(nèi)部的析構(gòu)函數(shù)運(yùn)行時(shí)產(chǎn)生內(nèi)存泄露的異常。
另外,軟件提供了與Matlab計(jì)算平臺(tái)融合應(yīng)用的接口管理。除了有DLL算法庫的調(diào)用關(guān)系以外,兼容了GUI界面與用戶進(jìn)行交互。由于帶有GUI組件的Matlab程序,不是單一的函數(shù)M文件,因此編譯生成的可執(zhí)行文件在C++builder主程序中以進(jìn)程應(yīng)用程序方式調(diào)用,合理分配了計(jì)算資源。
圖6 綜合輸出平臺(tái)結(jié)構(gòu)圖
試飛數(shù)據(jù)分析結(jié)果的可視化輸出方法及軟件實(shí)現(xiàn)以參數(shù)時(shí)間段同步選取導(dǎo)出為基本功能,結(jié)合并擴(kuò)展了開發(fā)平臺(tái)下各個(gè)標(biāo)準(zhǔn)構(gòu)件之間的關(guān)聯(lián)屬性及方法,提供了便于曲線結(jié)果導(dǎo)出的圖形保存及打印輸出功能。同時(shí),根據(jù)實(shí)際科目分析需求,實(shí)現(xiàn)了特殊曲線圖形的繪制。在與Matlab平臺(tái)結(jié)合應(yīng)用的過程中,考慮了兩個(gè)平臺(tái)之間的進(jìn)程調(diào)用及任務(wù)資源的管理關(guān)系,以提高參數(shù)操作效率。可視化輸出方法將以現(xiàn)階段的功能應(yīng)用為基礎(chǔ),繼續(xù)深入探索兩個(gè)平臺(tái)之間在程序編譯過程中的差異,為提高平臺(tái)函數(shù)庫互用的計(jì)算效率做更多工作。
10.3969/j.issn.1001-8972.2015.21.009