曾培彬
(中國民用航空汕頭空中交通管理站 技術(shù)保障部,廣東 汕頭 515000)
航空器的航跡重繪是空中交通管制(以下簡稱“空管”)過程分析、事件復(fù)盤分析的重要工具,廣泛應(yīng)用于事件調(diào)查、不安全事件分析等空管運(yùn)行保障中[1-2]??展艿默F(xiàn)場技術(shù)維護(hù)通常也需要設(shè)計相關(guān)的航跡分析系統(tǒng)用于現(xiàn)場運(yùn)維。其中如若涉及航跡重繪,獨(dú)立的航跡分析系統(tǒng)需要設(shè)計相應(yīng)的記錄航跡數(shù)據(jù)模塊,后期分析需要重繪時則回放自定義記錄格式的數(shù)據(jù),這種方式將會占用更多系統(tǒng)處理的資源,同時也需要花費(fèi)更多的人力對相關(guān)模塊進(jìn)行開發(fā)。雖然當(dāng)前空管自動化系統(tǒng)具有相關(guān)的記錄航跡的文件,但是多數(shù)是基于設(shè)備廠家的內(nèi)部數(shù)據(jù)流文件,數(shù)據(jù)格式復(fù)雜也不開源,這使得現(xiàn)場技術(shù)保障的分析利用而言也不容易實(shí)現(xiàn)。ADS-B(Automatic Dependent Surveillance-Broadcast,廣播式自動相關(guān)監(jiān)視)則是當(dāng)前民航空管大力推進(jìn)應(yīng)用的技術(shù),可以自動從相關(guān)機(jī)載設(shè)備獲取參數(shù)并向其他飛機(jī)或地面站廣播飛機(jī)的位置、高度、速度、航向、識別號等信息,以供管制員對飛機(jī)狀態(tài)進(jìn)行監(jiān)控。目前,民航空管系統(tǒng)已基本完成ADS-B地面站和數(shù)據(jù)站的部署,可以實(shí)現(xiàn)管制區(qū)域的基本覆蓋。ADS-B地面站是接收航空器數(shù)據(jù)的第一個節(jié)點(diǎn),目前中南地區(qū)站主要采用九州公司生產(chǎn)的地面站設(shè)備并配套相應(yīng)的集中監(jiān)控軟件,該軟件可以實(shí)現(xiàn)一個月內(nèi)的區(qū)域內(nèi)多個地面站的航跡回放,記錄有本地管制區(qū)域內(nèi)的航跡數(shù)據(jù)。本文基于該地面站集中監(jiān)控的ADS-B記錄數(shù)據(jù)提出一種航跡重繪方法,為相關(guān)技術(shù)改造拋磚引玉。
九州公司生產(chǎn)的ADS-B地面站是民航中南地區(qū)的ADS-B地面接收設(shè)備,覆蓋了廣東、廣西、湖南、湖北、海南、河南六個省空域,分析其數(shù)據(jù)記錄有一定的推廣意義。九州公司ADS-B地面站的監(jiān)控終端每個小時生成一個.cat文本文件,用于記錄區(qū)域內(nèi)所有地面站監(jiān)視到的目標(biāo)的歷史報文數(shù)據(jù)。主要記錄的格式為“時間戳+地面站IP+Cat021報文”,隨著時間戳的增長,系統(tǒng)將順序記錄區(qū)域內(nèi)不同地面站所監(jiān)視到的所有目標(biāo)報文信息,因此,重繪算法只需要按順序從文件開始遍歷到文件結(jié)束即可。Cat021(Asterix Category 021)是歐洲航空安全組織一系列標(biāo)準(zhǔn)文件的一部分,主要包含數(shù)據(jù)項目錄、數(shù)據(jù)塊、數(shù)據(jù)類、數(shù)據(jù)字段、數(shù)據(jù)項、記錄和用戶應(yīng)用程序框架UAP(User Application Profile)。其中,UAP是一種數(shù)據(jù)規(guī)范,不同版本的Cat021有不同的UAP。數(shù)據(jù)項可以根據(jù)UAP分配到具體的數(shù)據(jù)字段,并且每個數(shù)據(jù)項都有相應(yīng)的字段參考號,數(shù)據(jù)項的出現(xiàn)也可以通過UAP進(jìn)行判斷[3]。Cat021明確定義了ADS-B報文數(shù)據(jù)項和其組成的序列,描述了各個數(shù)據(jù)項的內(nèi)容和適用的范圍,通常是由十六進(jìn)制數(shù)據(jù)組成,主要組成有包類型、長度、字段、描述符等數(shù)據(jù)項。九州公司的ADS-B地面站記錄數(shù)據(jù)主要采用V0.26版本報文,其UAP部分信息如表1所示。
表1 九州地面站Cat021報文UAP部分信息
ADS-B的字段描述符對后續(xù)的十六進(jìn)制字符串里的數(shù)據(jù)項做了標(biāo)明,根據(jù)字段描述符解出存在的數(shù)據(jù)項并對照UAP表里的數(shù)據(jù)項格式進(jìn)行解析可以得到數(shù)據(jù)項信息。
Cat021報文解析步驟如下:
(1)判斷原始數(shù)據(jù)是否為Cat021格式(根據(jù)報頭);
(2)從第六個字符之后開始以兩個字符的長度讀取并將十六進(jìn)制轉(zhuǎn)成二進(jìn)制,按順序從左至右記錄存在的數(shù)據(jù)項索引并判斷最末尾二進(jìn)制數(shù)是否為1,如果為1,則繼續(xù)往后讀兩個字符長度并重復(fù)上述操作,為0則終止;
(3)將步驟(2)中記錄的數(shù)據(jù)項索引對照UAP表按順序進(jìn)行數(shù)據(jù)項解析得到具體數(shù)據(jù)。
用戶對報文數(shù)據(jù)項的獲取需要查找對應(yīng)的數(shù)據(jù)項結(jié)構(gòu),例如若需要對飛行高度進(jìn)行獲取需要解析數(shù)據(jù)項I021/145,其由2個二進(jìn)制數(shù)據(jù)組成,一個二進(jìn)制數(shù)據(jù)有8位,第1位定義位LSB標(biāo)識為1/4個飛行高度層,剩余各個數(shù)據(jù)表示飛行高度,將其對應(yīng)轉(zhuǎn)化為十進(jìn)制即是以LSB為單位的所需飛行高度,其他數(shù)據(jù)項也有相應(yīng)的格式轉(zhuǎn)換,用戶只需要按照Cat021給定的規(guī)范進(jìn)行解析即可完成ADS-B各個數(shù)據(jù)項的信息獲取。
航跡重繪至少需要考慮目標(biāo)航跡的識別要素、歷史位置,通過歷史位置將航跡的軌跡重繪。用戶需要通過航跡的識別要素(例如航班號、二次代碼、24位地址碼)實(shí)現(xiàn)對具體航跡的分析,主要通過對記錄數(shù)據(jù)的相關(guān)數(shù)據(jù)項檢索。當(dāng)前主流的計算方法是通過報文數(shù)據(jù)項劃分先提取出報頭部分,獲取報頭信息(主要包括類型、長度、字段描述符等),結(jié)合字段描述符和UAP可以將報文數(shù)據(jù)報尾部分依次按照數(shù)據(jù)項組成序列依次分割,獲得各個數(shù)據(jù)項的原值[4]。對于數(shù)據(jù)記錄文件,這種方法需要對記錄文件中的Cat021報文進(jìn)行解析后再逐個與用戶提供的目標(biāo)航跡對比。
對于航跡識別要素的檢索,以航班號為例,在解析航班號數(shù)據(jù)項時,按正常的解析流程,先將表示航班號的十六進(jìn)制字符串(長度為12個字符)轉(zhuǎn)換成二進(jìn)制字符串(共48個字符),再對二進(jìn)制字符串以每六位一組進(jìn)行分割,可將其分為八組,代表航班號的八個字符,將六位一組的二進(jìn)制字符串轉(zhuǎn)換成十進(jìn)制數(shù)并對應(yīng)航班號對照表(按照文件規(guī)范,可以在程序中定義變量表chars=“ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######”)得出航班號,然后與目標(biāo)航班號進(jìn)行比較。 這個過程不可避免產(chǎn)生大量的報文文本分割計算,實(shí)踐表明字符串的分割計算對算法的執(zhí)行效率影響較大,耗時較多。ADS-B地面站記錄數(shù)據(jù)文件,除了需要重繪的目標(biāo)航跡報文還有區(qū)域內(nèi)的其他目標(biāo)信息報文,以民航汕頭空管站所在中小型機(jī)場所轄區(qū)域?yàn)槔阂粋€正常的ADS-B地面站記錄文件有500萬行至600萬行的報文數(shù)據(jù),而一個航班完整的航跡重繪需要基于1-2個文件,如若是廣州區(qū)域管制中心所轄的大型高空區(qū)域,分析的數(shù)據(jù)量更大,如若對報文數(shù)據(jù)一一分割并將航班數(shù)據(jù)項直接轉(zhuǎn)換,系統(tǒng)需要進(jìn)行航班號字符串分割、字符轉(zhuǎn)換等預(yù)處理后再針對用戶提供的航班號進(jìn)行航跡報文檢索,同時也占用大量的系統(tǒng)資源對非關(guān)注的航跡報文進(jìn)行處理,算法對于計算機(jī)的計算性能要求將更高,基于此方法的航跡分析耗時將無法估計,算法執(zhí)行效率低,用戶體驗(yàn)差。本文提出的方法是先將用戶提供的航班號轉(zhuǎn)換為報文內(nèi)部的十六進(jìn)制格式字符串(例如航班JYH1173,根據(jù)上述chars轉(zhuǎn)換表可以逆向轉(zhuǎn)換為十進(jìn)制數(shù)字符串“10 25 8 49 49 55 51” ,進(jìn)而轉(zhuǎn)換二進(jìn)制字符串為“001010 011001 001000 110001 110001 110111 110011 100000”,最終轉(zhuǎn)換為Cat021的十六進(jìn)制報文字符串格式),直接檢索相應(yīng)記錄數(shù)據(jù)Cat021報文中對應(yīng)的十六進(jìn)制字符串,并在檢索得到的報文中獲取航跡坐標(biāo)、高度和速度等數(shù)據(jù)項。此方法避免了對記錄數(shù)據(jù)的所有航班字符串?dāng)?shù)據(jù)項的分割、轉(zhuǎn)換和對比,提高算法數(shù)據(jù)處理性能。另一方面,方法按照文件名和記錄文件中的時間戳存儲報文數(shù)據(jù)當(dāng)前時間與上一次獲取到的該目標(biāo)報文數(shù)據(jù)時間戳的差,當(dāng)時間差超過20 min認(rèn)為航班數(shù)據(jù)已結(jié)束可以不繼續(xù)檢索報文數(shù)據(jù),提前結(jié)束檢索運(yùn)算。此方法完成一個航跡重繪耗時在15 s以內(nèi),符合相關(guān)技術(shù)改造的要求。
數(shù)據(jù)項獲取完畢后除了具體位置的繪制還需完成相應(yīng)信息的標(biāo)注,航跡標(biāo)牌是航跡信息標(biāo)注的主要形式,也是航跡分析的關(guān)鍵要素。當(dāng)前主要的設(shè)計方法有兩種,一種是直接通過控件加載完成繪制(如采用GMap.NET地圖的Markers層添加標(biāo)注點(diǎn),采用Marker點(diǎn)表示目標(biāo)[5]),一種是直接通過軟件編譯平臺調(diào)用畫筆繪制相應(yīng)的圖標(biāo)或文字[6]。前者實(shí)現(xiàn)簡單快捷卻占用資源較大,目標(biāo)數(shù)據(jù)量較多的情況下對硬件要求較高。后者在設(shè)計上則由于設(shè)計思路的不同,方法流程各式各樣,但多數(shù)設(shè)計需要采用較為復(fù)雜的算法。此處采用第二種方式進(jìn)行重繪,結(jié)合實(shí)際工作經(jīng)驗(yàn)實(shí)現(xiàn)簡潔的、用戶滿意度較高的航跡標(biāo)牌重繪。
航跡標(biāo)牌用于顯示飛機(jī)在途經(jīng)該航路點(diǎn)時所處的狀態(tài)信息,標(biāo)牌內(nèi)的信息可以包括航跡的航班號、二次代碼、24位地址碼、速度、高度和爬升下降率等目標(biāo)狀態(tài)信息以供用戶分析。由于形成航跡的點(diǎn)數(shù)較多,如若所有位置點(diǎn)都標(biāo)注標(biāo)牌將出現(xiàn)大量重疊顯示的標(biāo)牌,界面繪制復(fù)雜的且不符合實(shí)際需要,結(jié)合實(shí)際經(jīng)驗(yàn),此處每隔3分鐘對目標(biāo)航跡進(jìn)行標(biāo)牌標(biāo)注,并提供標(biāo)牌可隱藏功能。當(dāng)然,即便如此,標(biāo)牌在繪制過程中依舊不可避免會重疊顯示,為了用戶能夠全面、清楚獲取相應(yīng)航跡信息,標(biāo)牌的重繪需要提供航跡標(biāo)牌拖動功能,實(shí)現(xiàn)對重疊標(biāo)牌的分別顯示讀取。另一方面,為了降低操作復(fù)雜度,很多航跡重繪也同時提供了基于鼠標(biāo)動作的地圖縮放和拖動,因此實(shí)際中用戶實(shí)現(xiàn)根據(jù)自身需要進(jìn)行標(biāo)牌拖動和地圖的縮放,必須對方法的標(biāo)牌圖形化進(jìn)行進(jìn)一步的設(shè)計,主要考慮地圖縮放、拖動以及航跡標(biāo)牌自身拖動帶來的航跡標(biāo)牌坐標(biāo)繪制影響,需滿足實(shí)現(xiàn)的功能:鼠標(biāo)按下左鍵如若是在標(biāo)牌范圍內(nèi)則方法判斷為用戶需要拖動標(biāo)牌,如若在無標(biāo)牌的區(qū)域則方法判斷為用戶需要拖動地圖。
通常,航跡標(biāo)牌的圖形化構(gòu)成是由目標(biāo)位置點(diǎn)、引線(用于連接目標(biāo)位置點(diǎn)與標(biāo)牌中心點(diǎn))、標(biāo)牌外框以及內(nèi)部的文本信息組成。由于航跡重繪初始化時,航跡標(biāo)牌的位置與目標(biāo)航跡的相對位置是固定的,因此,可以基于標(biāo)牌中心點(diǎn)坐標(biāo)完成對其繪制。方法定義變量列表List
在軟件實(shí)現(xiàn)上,首先根據(jù)在ADS-B記錄文件中獲取的相關(guān)信息初始化標(biāo)牌坐標(biāo)并在地圖上繪制顯示。當(dāng)鼠標(biāo)點(diǎn)擊時,會觸發(fā)鼠標(biāo)按下事件的響應(yīng),當(dāng)鼠標(biāo)左鍵產(chǎn)生點(diǎn)擊時會進(jìn)入標(biāo)牌坐標(biāo)范圍的判斷。因?yàn)榇嬖诙鄠€標(biāo)牌重合的情況,所以在判斷存在標(biāo)牌內(nèi)部之后還需求出鼠標(biāo)與這些重合的標(biāo)牌哪個距離更近,識別對應(yīng)需要拖動的目標(biāo)標(biāo)牌。
判斷鼠標(biāo)當(dāng)前位置是否處于標(biāo)牌內(nèi)部以及獲取目標(biāo)標(biāo)牌的算法如下(以C#設(shè)計為例):
(1)獲取當(dāng)前鼠標(biāo)的所在的屏幕坐標(biāo):
Point choose = Control.MousePosition;
(2)循環(huán)遍歷屏幕中的所有標(biāo)牌并判斷鼠標(biāo)位置是否位于標(biāo)牌內(nèi),如果鼠標(biāo)位于標(biāo)牌內(nèi),則計算當(dāng)前標(biāo)牌與鼠標(biāo)坐標(biāo)位置的直線距離:
distance = (choose.X - label_center_point[j][i].X) ^ 2 + (choose.Y - label_center_point[j][i].Y) ^ 2;
(3)找出直線距離distance為最小值時的標(biāo)牌即為鼠標(biāo)選擇的標(biāo)牌。
實(shí)現(xiàn)該算法,可以定義int類型變量label_min以及l(fā)abel_index用于記錄當(dāng)前找到的最小直線距離以及對應(yīng)的標(biāo)牌索引,label_min的初始值需設(shè)的足夠大,至少應(yīng)比屏幕的對角線距離更大。循環(huán)遍歷標(biāo)牌時,如果鼠標(biāo)在標(biāo)牌范圍內(nèi),則求出直線距離distance并與label_min進(jìn)行比較,如果distance的值小,則將值賦給label_min并更新label_index標(biāo)牌索引的值,如果label_min的值小,則保持不變。在循環(huán)遍歷完所有航跡標(biāo)牌時,如果label_min的值與初始值不同,說明鼠標(biāo)在標(biāo)牌范圍內(nèi)并且拖動了該目標(biāo)標(biāo)牌,如果label_min的值與初始值一致,說明鼠標(biāo)不在所有標(biāo)牌的范圍之內(nèi),此時判斷為觸發(fā)地圖拖動操作。實(shí)現(xiàn)流程見圖1。
圖1 標(biāo)牌繪制流程圖
航跡標(biāo)牌和地圖的繪制函數(shù)置于timer()時間控制器中調(diào)用,實(shí)踐表明將timer()時間設(shè)置100毫秒(即每100毫秒進(jìn)行一次標(biāo)牌背景地圖的繪制)可以滿足實(shí)際工作需要,當(dāng)鼠標(biāo)選擇標(biāo)牌并進(jìn)行拖動時,需時刻更新被拖動標(biāo)牌的中心點(diǎn)坐標(biāo)與相對位置坐標(biāo)。所以當(dāng)觸發(fā)鼠標(biāo)移動事件時,通過變量Point label_mouselater時刻記錄鼠標(biāo)的位移量并立即更新被拖動標(biāo)牌的中心點(diǎn)坐標(biāo)label_center_point和相對位置坐標(biāo)label_temp,完成標(biāo)牌位置繪制的更新。
本文從實(shí)際出發(fā),提出一種基于ADS-B記錄數(shù)據(jù)文件的航跡重繪方法,通過改變檢索設(shè)計思路實(shí)現(xiàn)了在ADS-B記錄文件中快速獲取用戶關(guān)注航跡相關(guān)信息,并提供了在標(biāo)牌繪制等地圖處理方面的相關(guān)思路,最終通過C#設(shè)計實(shí)現(xiàn)。該方法應(yīng)用于中南空管局科技項目,完成了對航跡的歷史軌跡快速重繪,用戶體驗(yàn)較好。此處的總結(jié)和分享可以為相關(guān)航跡重現(xiàn)分析方面的技術(shù)改造提供一種參考。
桂林航天工業(yè)學(xué)院學(xué)報2020年3期