覃石昌
(中國直升機設計研究所無人機事業部,江西景德鎮,333001)
對于無人直升機來說,其在飛行過程中,需要接收地面控制站對其發送飛行控制指令進行姿態調控;需要接收任務控制指令執行相應任務;需要向地面站回傳遙測數據顯示飛行狀態,操作人員根據遙測數據判斷飛機飛行姿態,向無人機發送相應的遙控指令。因此,在無人直升機飛行過程中,地面控制站內部之間、內部與外部都會會有大量的數據交互,因而需要穩定可靠的數據傳送通道。DDS 是分布式系統實時應用程序的通訊中間件,DDS 能夠滿足非常復雜、非常靈活的數據流要求。本文利用QT 搭建無人直升機地面站[1-2]綜合處理軟件運行框架,基于DDS 實現軟件對外數據通信。
無人直升機綜合處理軟件采用C++編程語言進行設計與開發。軟件采用模塊化設計,具有良好的擴展性。軟件架構如圖1 所示。軟件包含通信、復合指令解析、綜合管理、遙測數據解析、席位管理、協議處理、日志管理等七個主要功能模塊。

圖1 無人直升機綜合處理軟件架構圖
其中基于DDS 的通信模塊是其他功能模塊的基礎,其他功能模塊依賴于通信處理模塊提供數據接收和數據發送通道。
DDS 是由RTI 公司研發的通信中間件,其廣泛應用于復雜的分布式應用、系統工程集成、控制自動化等領域。DDS 是一個可以解決時間苛刻和數據苛刻難題的通信中間件。DDS 獨立于操作系統和編程語言,可以實現不同系統之間的通信。其傳輸方式包括以太網、共享內存或其他連接方式。另外DDS 具有多種服務質量策略(QoS)參數可供調整,方便用戶調整使應用程序達到性能和資源利用的最佳組合。
無人機地面站內部數據交互具有數據量大、異構系統多、編程語言多樣化、對數據傳輸質量要求多樣化等特點,因而綜合處理軟件通信模塊需要選擇一個與系統、編程語言無關,調試方便靈活,容易解耦的通信中間件,所以本模塊基于DDS 進行開發,以生成源文件形式供主程序調用。
DDS 主要有兩種數據傳輸模式:主題模式和回調模式。
(1)主題模式原理如圖2 所示:通信端點之間創建域來進行資源集中配置,每個域中有若干主題,注冊在同一個主題內的訂閱者可以獲得發布者發布的信息。

圖2 DDS 主題模式原理圖
(2)回調模式原理如圖3 所示:調用端和服務端也需要處于相同的域和主題之下,它們之間的通信交互和普通函數回調一樣,調用端發送請求,服務端反饋請求結果。

圖3 DDS 回調模式原理圖
DDS 兩種傳輸模式下每個主題都有獨立的服務質量策略(QoS)文件,從而針對不同的應用場景對傳輸質量和傳輸速率之間進行優化配置。
DDS 開發分為以下幾個步驟,流程圖如圖4 所示:

圖4 基于DDS 通信模塊開發步驟圖
(1)編寫IDL(interface description language)文件;
(2)在服務端和客戶端編譯IDL 文件,生成獨立C++頭文件、源文件;
(3)在項目中引入生成的源文件,配置DDS 服務策略(QoS),編寫通信處理函數;
(4)代碼編譯;
(5)測試與集成。
根據軟件的應用場景,軟件的DDS 通信需求分為主題模式與回調模式,席位管理指令采用回調模式,其他指令數據采用主題模式。
(1)采用回調模式的用戶登陸指令調用數據格式如下:

數據內容為用戶名、密碼、用戶角色,密碼采用哈希加密保證數據安全,角色代表當前登陸用戶的角色。
服務端反饋指令數據格式如下:

數據內容為操作結果標志,失敗原因(如果操作結果失敗,此項填寫原因,成功則置空)。
(2)采用主題模式的遙控指令數據格式如下:


其中struct_header 是統一的數據包頭,里面包含信源、信宿、指令長度等常規信息,fmCode 為指令碼,fmData為指令內容。
通過類似上述的數據結構的定義,創建了具有12 個席位管理指令數據結構與32 個飛行指令數據結構的IDL 文件。
打開DDS 客戶端Launcher 界面,在code Generator子界面打開創建的IDL 文件,選擇源文件輸出文件夾,編程語言選擇Modern c++11,運行庫平臺選擇X64Vs2017,點擊運行,可以在源文件輸出文件夾得到如圖5 所示生成的四個c++文件。

圖5 生成的源文件
在QT 創建的項目工程中導入生成的四個c++文件,并在環境變量配置DDS 頭文件目錄與lib 目錄。
席位管理指令要求傳輸可靠,響應速度快,請求和接收同步處理,因而采用 DDS的 RELIABILITY(可靠性)Qos策略,可以保障發布的數據內容能夠可靠的傳輸。
其他一般的指令數據特點是數據傳輸不可靠,數據量較大,且傳輸頻率高,因而采用DDS 的 BEST_EFFORT(高效)Qos 策略,可以保障數據寫入者能夠以最高效的方式將數據發送出去,不會阻塞在函數調用上,提升發送者者的數據處理和發送能力。
為保證綜合處理軟件的并發處理能力,通信線程由數據接收線程(RecvThread)、數據處理線程(DealThread),數據發送線程(SendThread),回調處理線程(RRThread)四個子線程組成。
(1)為了實現主題模式下數據接收、發送與數據處理之間的同步,并提高數據交互效率,在RecvThread 與DealThread 之間和SendThread 與DealThread 之間均采用了采用無鎖緩沖區交換信息。
主題模式下通信處理流程如圖6 所示。

圖6 主題模式數據處理流程
(a)數據接收子線程(RecvThread)、數據處理子線程(DealThread)、數據發送子線程(SendThread)初始化完畢;
(b)RecvThread 通過類WaitSet 的wait()方法阻塞線程,直到接口接收到新數據,通過DDSReader 對象接收新數據;
(c)RecvThread 接收到新數據后,解析數據幀,從幀頭讀取數據信源、信宿等屬性,根據信宿分發到不同的接收緩沖區;
(d)DealThread 循環處理接收緩沖區的數據,分發到對應的處理數據緩沖區;
(e)SendThread 從處理緩沖區取出數據,通過DDS發送出去。
(2)回調處理線程(RRThread)負責處理回調模式的數據請求,如圖7 所示,針對每一種類型回調指令,通過實例化一個監聽器(ReplierListener 類對象)來監聽數據接收接口,并最終在ReplierListener 類內的on_request_available()方法內實現數據處理邏輯,最后返回處理結果。

圖7 回調模式處理流程
在通信模塊設計實現完成后,使用QT Creator 進行軟件其他功能模塊開發,其他的功能模塊有:
(1)席位管理模塊:管理各個控制臺席位的登陸、注銷、狀態管理,權限管理;
(2)日志管理模塊:記錄軟件運行期間的運行狀態數據,記錄上行的遙控指令幀,下行的遙測數據幀;
(3)協議處理模塊:讀取協議文件,對上行遙控指令、下行遙測數據進行協議解析;
(4)復合指令解析模塊:解析上行飛行遙控指令、上行遙調指令、連續量指令等,組成復合幀,發送到無人機;
(5)遙測數據解析模塊:解析下行遙測數據,轉發到地面控制站各個設備;
(6)綜合管理模塊:完成系統初始化配置,運行狀態自檢,各個通信通道冗余切換等功能。
以上功能模塊與通信模塊通過內部接口進行數據交互、相互調用,共同實現了綜合處理軟件的主體功能。
在U-Y 型無人直升機地面站服務器內部署該綜合處理軟件。在軟件正常啟動后:
(1)控制臺席位均可以正常登陸,注銷,超時下線,站內各個設備可以定時接收到綜合處理軟件發送的控制站自檢狀態數據;
(2)只有具有權限的計算機才可以發送遙控,遙調指令;
(3)U-Y 無人直升機 接收到的遙控復合指令幀數據校驗合格,指令幀傳輸時延符合設計要求;
(4)站內設備均可接收到綜合處理軟件轉發的U-Y 無人直升機發送的遙測數據;數據校驗和時延均符合設計要求;
(5)查看日志文件,完整記錄了系統運行期間的狀態與各種上行、下行數據。
綜上所述,在U-Y 無人直升機地面試驗或飛行操作中,綜合處理軟件運行穩定,完全符合設計要求。
本文詳細介紹了基于DDS 的無人直升機綜合處理軟件的設計實現過程。用本文方法編制的綜合處理軟件,經過在U-Y 無人直升機地面站實際運行驗證,該綜合處理軟件能夠完成控制臺管理、指令發送、遙測數據轉發等功能,具有運行穩定,運行效率高等特點,為U-Y 無人直升機的飛行提供了必要的幫助。日后從提高軟件通用性的角度出發,將大功能部件模塊化,生成庫文件,達到其他軟件可以迅速復用的效果。