皮祖成,陳 文,馬 龍,魏 瀚
?
面向?qū)ο蟮臒o人機任務(wù)設(shè)備通信接收軟件設(shè)計
皮祖成,陳 文,馬 龍,魏 瀚
(彩虹無人機科技有限公司,北京 100074)
無人機在執(zhí)行任務(wù)過程中,任務(wù)管理計算機需要接收地面控制站發(fā)送的遙控指令,同時也將遙測信息發(fā)回地面控制站。遙測信息來源于無人機上各種任務(wù)載荷的狀態(tài)遙測和偵察數(shù)據(jù)遙測信息。任務(wù)載荷遙控和遙測的通信處理過程是由任務(wù)管理軟件來實現(xiàn)的。本文所述的任務(wù)設(shè)備通信接收軟件是任務(wù)管理軟件的底層通信模塊。任務(wù)設(shè)備通信幀模型采用了數(shù)據(jù)結(jié)構(gòu)化定義的方式,其基本模塊包含通信幀的幀頭、幀長和幀校驗等區(qū)段。為了統(tǒng)一接收所有任務(wù)設(shè)備的通信數(shù)據(jù),本文設(shè)計了基于面向?qū)ο蠓椒ǖ耐ㄐ艓邮哲浖?。通過試驗測試,本文所述程序能高效的完成通信幀的接收工作,并具備一定的擴展靈活性,并成功應(yīng)用于某型無人機任務(wù)管理處理中。
無人機;狀態(tài)機;通信幀;面向?qū)ο?/p>
無人機廣泛應(yīng)用于偵察監(jiān)視等領(lǐng)域[1],隨著無人機技術(shù)的發(fā)展,無人機的載重能力也得到了很大的進步,同時能掛載多型任務(wù)載荷。無人機可通過換裝搭配不同的任務(wù)載荷以實現(xiàn)不同的作業(yè)任務(wù)需求。為了適應(yīng)多任務(wù)載荷掛載的需求,無人機中通常配備有任務(wù)管理計算機[2],任務(wù)管理計算機的軟件模塊如圖1所示。任務(wù)管理軟件實現(xiàn)對任務(wù)載荷的控制、狀態(tài)監(jiān)控、任務(wù)載荷協(xié)同控制和數(shù)據(jù)存儲等功能。所有功能通過接口單元向任務(wù)載荷和外部系統(tǒng)獲取數(shù)據(jù),基于獲取到的數(shù)據(jù)來實現(xiàn)特定的功能。
圖1 任務(wù)管理系統(tǒng)
無人機機載端通常采用RS422、CAN總線、ARINC-429等面向字節(jié)數(shù)據(jù)流的接口進行通信[3-4],為了從數(shù)據(jù)流中提取出通信幀,解決類似TCP網(wǎng)絡(luò)通信“粘包”問題[5],一般采用了結(jié)構(gòu)化的方法對數(shù)據(jù)進行封裝。結(jié)構(gòu)化后的通信幀一般包含幀頭、幀長、幀識別ID、數(shù)據(jù)和幀校驗等區(qū)段。本文通過面向?qū)ο蟮脑O(shè)計方法對通信幀接收過程的軟件進行建模[6-7],并設(shè)計了通信接收算法[8]。通過C++語言在嵌入式VxWorks操作系統(tǒng)中實現(xiàn)了任務(wù)設(shè)備通信接收算法[9-10]。
任務(wù)載荷設(shè)備的通信數(shù)據(jù)一般被設(shè)計為結(jié)構(gòu)化的通信幀。針對不同的任務(wù)載荷設(shè)備采用不同的幀頭,如0xEB90、0x597E、0xEE16、0x597E0BAA51B0等幀頭?!皫L”為連續(xù)多個字節(jié)所表達的長度信息,一個通信幀的總字節(jié)數(shù)需要從“幀長”區(qū)段中獲取。通常在任務(wù)載荷中采用1個或2個字節(jié)的無符號整數(shù)直接表達通信幀的長度,而在一些特殊情況下需要將多個字節(jié)的“幀長”信息進行復雜的運算后才能獲得通信幀的長度?!皫R別ID”區(qū)段用于進一步識別通信幀的類型?!皵?shù)據(jù)”段則存放了有效數(shù)據(jù)。“幀校驗”則為多個字節(jié)的幀校驗信息。
本文將通信幀抽象為具有幀頭、幀長和幀附加特征這3種元素的模型。通信幀的“幀頭”位于通信幀的開始部分,具有一定長度的連續(xù)字節(jié)序列?!皫L”表達了一幀數(shù)據(jù)所有字節(jié)的數(shù)量,其值為單個字節(jié)的整數(shù)倍。幀長信息可以從一幀數(shù)據(jù)的幀頭之后的數(shù)據(jù)中獲取,但獲取的方式因幀類型而異?!皫郊犹卣鳌笔且欢巫止?jié)序列,該序列用于進一步識別該通信幀的類型。在此模型的基礎(chǔ)上,判斷所接收到的數(shù)據(jù)是否為某一種特定通信幀時,需要具備以下兩個條件:①幀頭匹配;②附加特征匹配。
為了標識通信幀的所有類型,設(shè)計了圖2所示的FrameID枚舉來表示通信幀類型,其中僅示例了一部分通信幀類型,可根據(jù)軟件的需求進行增減。設(shè)計如圖3所示的ComFrame類用于存儲一個完整的通信幀數(shù)據(jù),其中content用于存放幀的所有內(nèi)容,id則為該通信幀的類型。
圖2 通信幀ID枚舉
圖3 通信幀類
設(shè)計圖4所示的FrameTrait通信幀特征類,該類作為一個抽象類描述了通信幀的特征:幀頭(header)、幀長(length)、幀附加特征(trait)。通過幀識別符(id)標識了通信幀對象所對應(yīng)的通信幀類型。因幀接收算法的需要,提供了識別該類通信幀所需要的最少原始字節(jié)數(shù)(bestPartialSize)信息。從“幀長”的類型來看存在定幀長和可變幀長兩種類型,其中定幀長的幀長值為一固定值,用一個大于零的值來代表;當length為零時代表了可變幀長,此時的幀長度需要從幀頭之后的數(shù)據(jù)中計算得出。幀長的計算方法包含于FrameTrait提供的Length方法中。Length方法調(diào)用了getVarLength虛方法,F(xiàn)rameTrait抽象類的實現(xiàn)類可根據(jù)具體通信幀類型的幀長計算方法來實現(xiàn)該算法。幀頭匹配和附加特征匹配算法通過isHeaderOk方法和isTraitOk方法來實現(xiàn)。所有通信幀類型的幀頭均為固定值,在FrameTrait中實現(xiàn)了統(tǒng)一的isHeaderOk算法,用于在數(shù)據(jù)流中檢查幀頭是否匹配。由于通信幀的附加特征存在各種變化,為了提供算法的可擴展性,將isTraitOk設(shè)計為虛函數(shù),以便派生類重寫特征匹配算法。通信幀類ComFrame與通信幀特征類Fra-meTrait之間通過FrameID進行關(guān)聯(lián),如圖5所示。
圖4 通信幀特征類
圖5 通信幀類與通信幀特征類的關(guān)聯(lián)
為了統(tǒng)一配置和獲取通信幀的類型定義,設(shè)計了FrameTraitFactory工廠類,如圖 6所示。通過該類提供的insertTrait方法可添加通信幀的類型。通信幀的類型定義包含幀識別符、幀頭、幀長和幀附加特征這4個屬性。在需要使用通信幀特征對象的地方,可提供通信幀ID并使用GetFrameTrait方法獲取到所需的通信幀特征對象。
圖6 通信幀特征工廠類
通過FrameTrait抽象類派生并實現(xiàn)了3種通信幀特征類型:StandardFrameTrait、DGPSFrameTrait、SpecialFrameTrait類,如圖7所示。其中Standard-FrameTrait用于處理固定幀長通信幀和常規(guī)的變幀長通信幀。常規(guī)變幀長通信幀的結(jié)構(gòu)如圖8所示,其中幀長用幀頭之后的1個字節(jié)表示;固定幀長通信幀則不具有“幀長”區(qū)段。特殊可變幀長的通信幀如DGPS(Differential GPS)的某類通信幀,其幀長信息的解析需要使用幀頭之后的數(shù)據(jù),并采用特定的CalcLength算法進行解算,如圖9所示。
圖7 通信幀特征類關(guān)系圖
圖8 常規(guī)變幀長通信幀
圖9 DGPS通信幀
如圖10所示的通信幀既需要識別通信幀頭,同時還要識別子幀ID才能確定通信幀所屬類型。在這種情況下需要用到附加特征匹配功能,此時需要提供附加特征信息和實現(xiàn)isTraitOk方法,該方法在識別到幀頭之后進一步判斷子幀ID是否與給定的值相同,如圖10中當子幀ID位置為“01”則代表了ID_FCC_FrA幀,當幀ID位置為“02”則代表了ID_FCC_FrB幀。附加特征存儲在FrameTrait派生對象的trait字段中。isTraitOk算法決定了如何利用附加特征對通信幀類型進行判斷。
圖10 需要進行附加信息判斷的通信幀
通信幀接收算法封裝于FrameFinder類中,如圖11所示,每個通信端口綁定一個FrameFinder對象,用于接收該端口的數(shù)據(jù)。FrameFinder對象必須知道需要從該端口接的通信幀類型,這些信息通過其的構(gòu)造函數(shù)的參數(shù)提供。FrameFinder將通信幀類型信息存放于frameTraits變量中。buffer用于緩存來自于通信端口的字節(jié)數(shù)據(jù)流,當端口有數(shù)據(jù)到來時調(diào)用InBuffer方法將數(shù)據(jù)追加到緩存中。GetFrames方法用于從緩存中獲取指定通信幀類型的數(shù)據(jù)。
圖11 通信幀識別算法類
FrameFinder中包含多個FrameTrait對象,并為每各FrameTrait對象提供一個接收算法所需的狀態(tài)機,如圖12所示,該狀態(tài)機用于查找、識別和接收該類型的通信幀,各狀態(tài)機的狀態(tài)存儲于states變量當中。WorkingStage描述了狀態(tài)機的3種狀態(tài),不同狀態(tài)下均需要使用到WorkingState狀態(tài)變量,其結(jié)構(gòu)如圖13所示。NextStage記錄了狀態(tài)機的下一個狀態(tài),即在接下來的狀態(tài)切換時切入該狀態(tài)。
圖12 通信幀接收狀態(tài)機
圖13 狀態(tài)機狀態(tài)參數(shù)
圖14 從buffer中接收一幀數(shù)據(jù)示意圖
圖15 緩存buffer的定義及使用
通信幀接收的序列圖如圖16所示,App作為主程序首先獲取通信端口的配置信息。通過端口的配置信息可以得知需要從該端口中接收的通信幀類型(FrameID枚舉)的集合。將該集合提供給Frame-TraitFactory對象,并調(diào)用GetFrameTrait方法獲取通信幀類型所對應(yīng)的FrameTrait。FrameTraitFactory是通過找到對應(yīng)FrameID的FrameTrait,然后調(diào)用FrameTrait的Clone方法完成的對象復制。由Frame-TraitFactory將所復制的對象返回給App。App根據(jù)所獲取的FrameTrait集合創(chuàng)建FrameFinder對象,然后App進入一個循環(huán)讀取通信端口數(shù)據(jù)的過程中。在App的循環(huán)過程中,App首先獲取設(shè)備通信端口的新數(shù)據(jù),然后調(diào)用FrameFinder對象的InBuffer方法將端口數(shù)據(jù)追加到緩存的尾部。然后,針對每一個狀態(tài)機的狀態(tài),執(zhí)行相應(yīng)的幀頭查找、特征判斷、幀長提取和通信幀數(shù)據(jù)接收等操作。最后更新數(shù)據(jù)緩存和各狀態(tài)機對應(yīng)的VirtualCutPos位置。狀態(tài)機的狀態(tài)轉(zhuǎn)換如圖12所示,狀態(tài)機起始狀態(tài)為查找?guī)^狀態(tài)(Finding),在查找到幀頭(Condition A)時進入特征匹配狀態(tài)(TraitTest)。如果特征匹配失敗(Condition C)則退回到查找?guī)^狀態(tài),如果特征匹配成功(Condition B)則進入到數(shù)據(jù)接收等待狀態(tài)(WaittingData)。在數(shù)據(jù)接收等待狀態(tài)時,待接收完一幀通信數(shù)據(jù)(Condition D)后再次進入查找?guī)^狀態(tài)。
圖16 通信幀接收序列圖
無人機任務(wù)管理機載軟件運行于PowerPC系列處理器上,軟件的底層采用了VxWorks操作系統(tǒng),并使用面向?qū)ο蟮腃++語言編程實現(xiàn)?;就ㄐ艓怌omFrame的content和FrameTrait的header、trait等成員由于變長度的存儲需求,采用STL標準容器vector來存儲,并實例化為BYTE(即C++中的基本類型unsigned char)的容器。FrameTrait類作為一個通信幀特征描述類,需要具備較靈活的擴展性,并且不同的FrameTrait實例需要給通信幀接收算法提供統(tǒng)一的接口。所以將FrameTrait實現(xiàn)為一個抽象類,將算法變化最多的幾個功能實現(xiàn)為其虛函數(shù)成員,其中包含了isTraitOk成員、getVarLength成員。同時,因為在應(yīng)用程序中需要傳遞FrameTrait子類的對象,但由于其多態(tài)性,在FrameTrait中設(shè)計了虛的Clone方法,通過該方法可使用其抽象類的指針克隆該指針所指對象。FrameTrait的各派生類的對象可從兩種方式獲取,第一種方式采用FrameTra-itFactory工廠類的GetFrameTait方法獲取,另一種方式采用其派生類對象的Clone方法獲取。通過這兩種方式獲取的對象都必須由使用方進行析構(gòu)。FrameFinder作為算法運行的主體,通過vector容器實現(xiàn)了通信數(shù)據(jù)的緩沖區(qū),并在每次接收到新的通信數(shù)據(jù)時進行一次通信幀接收過程。Frame-Finder中通過STL標準容器map實現(xiàn)了FrameTrait子對象和幀接收狀態(tài)機的關(guān)聯(lián),每一個通信幀接收過程即是對該map的一個遍歷過程,完成每個FrameTrait子對象特征的判斷、數(shù)據(jù)的接收過程。
本文通過面向?qū)ο蟮姆椒▽o人機機載通信幀接收軟件進行了建模設(shè)計。利用面向?qū)ο蟮睦^承、多態(tài)等特性給通信幀接收算法創(chuàng)造了較靈活的可擴展機制,為不同的通信幀格式的統(tǒng)一接收設(shè)計了一套基本的算法。通過在VxWorks嵌入式操作系統(tǒng)中采用面向?qū)ο蟮腃++編程,提高了嵌入式軟件的抽象能力。本文所設(shè)計的通信幀接收算法為無人機任務(wù)管理的各項應(yīng)用層功能提供了標準的接口,使得上層應(yīng)用軟件的設(shè)計得以標準化,降低了對底層處理的依賴。通過項目實踐證明本軟件能高效的運行于無人機任務(wù)管理計算機中,并能滿足性能和實時性的需求。
[1] 劉長清, 潘舟浩, 唐曉斌. 國外無人偵察監(jiān)視飛機發(fā)展分析[J]. 中國電子科學研究院學報, 2015, 10(6): 657-661.
[2] 皮祖成, 王誠, 陳文. 某型無人機機載任務(wù)管理計算機設(shè)計[J]. 航空工程進展, 2016, 7(4): 464-470.
[3] 支超有. 機載數(shù)據(jù)總線技術(shù)及其應(yīng)用[M]. 北京: 國防工業(yè)出版社, 2009.
[4] 劉凱, 何君燕. CAN總線廣播系統(tǒng)設(shè)計[J]. 軟件, 2012, 33(1): 109-111.
[5] 王紅霞. 一個內(nèi)網(wǎng)通信系統(tǒng)的設(shè)計與實現(xiàn)[D]. 吉林: 吉林大學, 2014.
[6] 盧超, 黃蔚, 胡國超. 基于圖形數(shù)據(jù)結(jié)構(gòu)的復雜對象建模設(shè)計[J]. 軟件, 2015, 36(12): 220-223.
[7] 蘇薈. 一種新的面向?qū)ο筌浖蓽y試序列生成方法[J]. 軟件, 2012, 33(3): 75-76.
[8] 張合, 劉小紅. 面向?qū)ο蟮膶ο蠼<夹g(shù)及其應(yīng)用研究[J]. 軟件, 2011, 3: 66-68.
[9] 王學龍. 嵌入式VxWorks系統(tǒng)開發(fā)與應(yīng)用[M]. 北京: 人民郵電出版社, 2003.
[10] 段德功, 丁瑩亮. 基于嵌入式技術(shù)的工業(yè)通信管理機的開發(fā)及應(yīng)用[J]. 軟件, 2012, 33(6): 83-84.
Object-oriented Design of Communication Receiving Software for UAV Mission Payloads
PI Zu-cheng, CHEN Wen, MA Long, WEI Han
(Cai Hong UAV Technology Co. Ltd., Beijing 100074, China)
The mission management computer needs to receive the remote control commands sent by the ground control station (GCS) during the execution of the mission of UAV. At the same time, mission management computer also needs to send telemetry information to GCS. Telemetry information is derived from telemetry and reconnaissance data for various mission payloads on UAV. The communication procedure of telemetry and remote control is achieved by mission management software. The communication receiving software discussed in this paper is the underlying module of the mission management software. The mission payload communication frame model adopts the structured data definition way, its basic module includes the frame header, the frame length and the frame check sum section and so on. In order to uniformly receive the communication data of all mission payload, this paper designed a communication frame receiving software based on object-oriented method. Throught experiments, the program described in this paper can efficiently complete the reception of communication frames and have a certain degree of expansion flexibility. It is successfully applied to the mission management computer of a certain type of UAV.
UAV; State machine; Datagram; Object-oriented
V247.1
A
10.3969/j.issn.1003-6970.2018.07.013
皮祖成(1985-),男,工程師,主要研究方向:無人機任務(wù)載荷應(yīng)用;陳文(1986-),男,工程師,主要研究方向:無人機任務(wù)載荷應(yīng)用;馬龍(1987-),男,工程師,主要研究方向:無人機任務(wù)載荷應(yīng)用;魏瀚(1990-),男,助理工程師,主要研究方向:無人機任務(wù)規(guī)劃。
本文著錄格式:皮祖成,陳文,馬龍,等. 面向?qū)ο蟮臒o人機任務(wù)設(shè)備通信接收軟件設(shè)計[J]. 軟件,2018,39(7):63-67