代江濤,高 博,萬嘉駿
(戰(zhàn)略支援部隊(duì)信息工程大學(xué) 信息系統(tǒng)工程學(xué)院,河南 鄭州 450000)
在工業(yè)4.0的大背景下,物聯(lián)網(wǎng)、車聯(lián)網(wǎng)和邊緣計(jì)算等技術(shù)迅速發(fā)展。隨著應(yīng)用場景的多元化,單一的設(shè)備或者系統(tǒng)已經(jīng)不能夠滿足生產(chǎn)生活的需求,各個(gè)分布式的功能單元之間需要協(xié)同合作來完成復(fù)雜的任務(wù)[1]。在開發(fā)分布式應(yīng)用的過程中,由于設(shè)備平臺軟硬件環(huán)境的差異,用戶需要根據(jù)平臺特性通過平臺相關(guān)的專有化編程接口進(jìn)行應(yīng)用開發(fā)。應(yīng)用與底層運(yùn)行環(huán)境緊密耦合,導(dǎo)致分布式系統(tǒng)整體開發(fā)難度增加,應(yīng)用可移植性較差[2-3]。
通信中間件屏蔽了底層復(fù)雜的網(wǎng)絡(luò)編程操作和平臺相關(guān)的應(yīng)用編程接口,使用標(biāo)準(zhǔn)的編程接口為應(yīng)用提供統(tǒng)一的編程模型,降低了分布式應(yīng)用的開發(fā)難度[4]。數(shù)據(jù)分發(fā)服務(wù)(Data Distribution Service,DDS)是由對象管理組織(Object Management Group,OMG)提出的一種以數(shù)據(jù)為中心的發(fā)布-訂閱式實(shí)時(shí)通信中間件規(guī)范,定義了分布式應(yīng)用之間數(shù)據(jù)交換、行為交互和服務(wù)質(zhì)量要求的標(biāo)準(zhǔn),被稱為新一代的系統(tǒng)集成中間件標(biāo)準(zhǔn)[5]。DDS以數(shù)據(jù)為中心的思想,適用于對數(shù)據(jù)處理能力要求較高的物聯(lián)網(wǎng)場景,同時(shí)其擁有較高的實(shí)時(shí)性和靈活性,能夠按照實(shí)際需求自定義用戶數(shù)據(jù)格式或消息、擴(kuò)展或刪減功能。當(dāng)前市場中大部分的DDS通信中間件專門為互聯(lián)網(wǎng)業(yè)務(wù)設(shè)計(jì)[6],系統(tǒng)較為龐大,而針對資源有限的嵌入式場景方面的研究較少。
eProsima公司遵循OMG組織的XRCE-DDS(eXtremely Resource Constrained Environments DDS)規(guī)范[7],面向資源有限的設(shè)備提出了Micro XRCE-DDS解決方案。該方案采用客戶端/服務(wù)端的通信模型,在資源有限的設(shè)備上運(yùn)行定制的輕量級Micro XRCE-DDS客戶端應(yīng)用,在資源比較充足的設(shè)備上運(yùn)行Micro XRCE-DDS代理應(yīng)用,客戶端和代理之間通過XRCE協(xié)議進(jìn)行通信。Micro XRCE-DDS代理接收到客戶端的數(shù)據(jù)后,將其轉(zhuǎn)換為標(biāo)準(zhǔn)的RTPS協(xié)議,從而實(shí)現(xiàn)與標(biāo)準(zhǔn)的DDS應(yīng)用的交互。各個(gè)客戶端之間的發(fā)現(xiàn)、連接、通信均由代理應(yīng)用完成。該方案通過將DDS的部分功能遷移到代理端,降低了客戶端的資源需求,實(shí)現(xiàn)了DDS應(yīng)用在嵌入式設(shè)備上的部署。但是代理的引入增加了額外的通信時(shí)間開銷,降低了應(yīng)用的實(shí)時(shí)性。此外,隨著接入設(shè)備的增加,代理節(jié)點(diǎn)的負(fù)載也會(huì)不斷增加,增加了數(shù)據(jù)傳輸?shù)牟淮_定性。
TinyDDS是專為無線傳感器和執(zhí)行器網(wǎng)絡(luò)(Wireless Sensor and Actor Network,WSAN)設(shè)計(jì)的輕量化DDS通信中間件,符合OMG DDS的標(biāo)準(zhǔn)。面向MCU設(shè)備的TinyDDS依賴于TinyOS,使用nesC語言作為實(shí)現(xiàn)語言,能夠?yàn)橛脩籼峁┛膳渲玫?、基于任?wù)和硬件事件的并發(fā)處理模型,適用于多節(jié)點(diǎn)的嵌入式傳感器網(wǎng)絡(luò)[8]。TinyDDS采用中心化的通信模型,各客戶端的發(fā)現(xiàn)、通信必須經(jīng)由代理進(jìn)行中轉(zhuǎn),易造成代理節(jié)點(diǎn)繁忙,增加了丟包的可能性。此外,其與TinyOS深度耦合,可移植性較差。針對TinyDDS中心化的通信模型產(chǎn)生的問題,文獻(xiàn)[9]基于TinyDDS設(shè)計(jì)了一種去中心化的DDS中間件,該中間件被稱為Bloker-Less TinyDDS(BLTDSS)中間件。在數(shù)據(jù)傳輸過程中,不再經(jīng)由代理,直接在本地獲取路由信息,增加了通信的響應(yīng)速度,同時(shí)去中心化的通信模型也將網(wǎng)絡(luò)負(fù)載分散到各個(gè)節(jié)點(diǎn),增加了網(wǎng)絡(luò)的健壯性。但是由于采用了泛洪式的發(fā)現(xiàn)機(jī)制,導(dǎo)致在發(fā)現(xiàn)節(jié)點(diǎn)過程中,整個(gè)網(wǎng)絡(luò)的負(fù)載較高,導(dǎo)致各個(gè)節(jié)點(diǎn)間建立連接的過程較為緩慢。因此,文獻(xiàn)[10]提出了Hybrid TinyDDS(HyTDDS)中間件。該中間件采用混合式的通信模型。在節(jié)點(diǎn)發(fā)現(xiàn)過程中,使用中心化的通信模型,降低了網(wǎng)絡(luò)負(fù)載,各個(gè)客戶端通過代理獲取與本節(jié)點(diǎn)有通信需求的其它客戶端的訂閱信息和網(wǎng)絡(luò)位置信息,并保存到本地路由表中。在數(shù)據(jù)傳輸過程中,采用去中心化的通信模型,各個(gè)發(fā)布/訂閱節(jié)點(diǎn)使用本地路由信息與遠(yuǎn)端節(jié)點(diǎn)通信。BLTDDS和HyTDDS均是基于TinyDDS改良后的中間件。雖然兩者都解決了TinyDDS的通信模型引入的部分問題,但是無法解決其跨平臺能力不足的問題。
為了能夠在嵌入式設(shè)備上部署DDS通信中間件,文獻(xiàn)[11]提出了一種基于節(jié)點(diǎn)功能的DDS裁剪策略。當(dāng)節(jié)點(diǎn)為發(fā)布者時(shí),DDS中間件僅包含發(fā)布相關(guān)功能,當(dāng)節(jié)點(diǎn)為訂閱者時(shí),DDS中間件僅包含訂閱相關(guān)功能,從而降低了DDS中間件對資源的需求量,并提升了系統(tǒng)的響應(yīng)速度。但是,這也造成了節(jié)點(diǎn)之間的不對稱性,導(dǎo)致節(jié)點(diǎn)后期升級比較復(fù)雜。
從上文的分析中可以看出,當(dāng)前針對嵌入式場景中的DDS通信中間件的研究主要從通信模型、功能裁剪等方面入手,有效解決了嵌入式設(shè)備計(jì)算、存儲資源不足的問題,提升了系統(tǒng)的響應(yīng)速度。但目前針對通信資源方面的研究較少,而其也是嵌入式設(shè)備受限資源之一。因此,本文基于DDS規(guī)范,結(jié)合嵌入式設(shè)備資源受限的特點(diǎn),對其功能和傳輸協(xié)議進(jìn)行精簡化,并特別針對通信資源有限的問題,提出了一種基于卡爾曼濾波模型的對稱式發(fā)布訂閱通信機(jī)制,有效降低了通信資源的消耗。本文設(shè)計(jì)的DDS通信中間件使用C語言進(jìn)行開發(fā),具有良好的可移植性,并已經(jīng)在STM32 + RT-Thread平臺和X86 + Linux平臺進(jìn)行了測試驗(yàn)證。測試結(jié)果證明,本通信中間件能夠在按照DDS規(guī)范為分布式應(yīng)用提供基本交互服務(wù)的同時(shí),提升系統(tǒng)的響應(yīng)速度,減少通信帶寬的占用。
OMG制定的DDS規(guī)范詳細(xì)描述了底層數(shù)據(jù)交互細(xì)節(jié)和應(yīng)用編程接口(Application Programming Interface,API)信息[12],并將其分為了如圖1所示的兩個(gè)層次:(1) 以數(shù)據(jù)為中心的發(fā)布訂閱層(Data-Centric Publish-Subscribe,DCPS)。該層是DDS實(shí)現(xiàn)數(shù)據(jù)交互的基礎(chǔ)層,負(fù)責(zé)完成數(shù)據(jù)的訂閱、發(fā)布,按照約定的協(xié)議格式對數(shù)據(jù)進(jìn)行構(gòu)建或解析;(2) 本地?cái)?shù)據(jù)重構(gòu)層(Data Local Reconstruction Layer,DLRL)。該層是可選層,用于將DCPS層提交的字節(jié)型數(shù)據(jù)轉(zhuǎn)換為特定格式的數(shù)據(jù),方便用戶訪問。同時(shí),對DCPS層的部分功能進(jìn)行了封裝,為用戶提供了更加簡易的操作接口。
圖1 DDS分層架構(gòu)Figure 1. DDS layered architecture
DDS規(guī)范描述的各種成員對象被稱為實(shí)體(Entity)。DDS以數(shù)據(jù)為中心的訂閱-發(fā)布模型為分布式的應(yīng)用節(jié)點(diǎn)引入了全局?jǐn)?shù)據(jù)空間(Global Data Space,GDS)的概念。系統(tǒng)中對該空間中數(shù)據(jù)感興趣的應(yīng)用都可以接入其中。
DDS使用域(Domain)將網(wǎng)絡(luò)劃分為不同的邏輯分組,同一個(gè)域內(nèi)的實(shí)體對象可以相互通信,不同域之間相互獨(dú)立。DDS參與者(Participant)是承載其它實(shí)體對象的容器。每個(gè)參與者由發(fā)布者(Publisher)、訂閱者(Subscriber)和主題(Topic)組成,并負(fù)責(zé)對這些實(shí)體的創(chuàng)建、刪除和管理[13]。每個(gè)發(fā)布者至少與一個(gè)數(shù)據(jù)寫入者(Data Writer)相關(guān)聯(lián),并負(fù)責(zé)創(chuàng)建、刪除和管理數(shù)據(jù)寫入者。相應(yīng)地,每個(gè)訂閱者至少與一個(gè)數(shù)據(jù)讀取者(Data Reader)相關(guān)聯(lián),并負(fù)責(zé)創(chuàng)建、刪除和管理數(shù)據(jù)讀取者。數(shù)據(jù)寫入者是數(shù)據(jù)發(fā)送的直接交互實(shí)體,負(fù)責(zé)將數(shù)據(jù)發(fā)送到全局?jǐn)?shù)據(jù)空間中,供其它實(shí)體使用。數(shù)據(jù)讀取者是數(shù)據(jù)接收的直接交互實(shí)體,負(fù)責(zé)在全局?jǐn)?shù)據(jù)空間中獲取所需數(shù)據(jù)。為了區(qū)分系統(tǒng)內(nèi)的實(shí)體對象,使用全局唯一標(biāo)識(Globally Unique Indentifier,GUID)對各個(gè)實(shí)體對象進(jìn)行標(biāo)記,該標(biāo)識格式為{前綴,實(shí)體ID},同一個(gè)參與者內(nèi)部的各個(gè)實(shí)體擁有相同的前綴。DDS 中各個(gè)實(shí)體之間的關(guān)系及數(shù)據(jù)收發(fā)過程如圖2所示。
圖2 DDS數(shù)據(jù)分發(fā)模型Figure 2. DDS data distribution model
分層式軟件架構(gòu)設(shè)計(jì)方式能夠保證各層次內(nèi)部高度耦合,層與層之間實(shí)現(xiàn)解耦[14]。軟件在迭代過程中,只需要替換相應(yīng)層級內(nèi)容即可,無需對其它層級內(nèi)容更改,與嵌入式場景中應(yīng)用需求多變的特點(diǎn)較為匹配。
如圖3所示,在實(shí)際應(yīng)用場景中,可以將引入本通信中間件的系統(tǒng)自下而上劃分為4個(gè)層次:硬件層、支撐軟件層、通信中間件層、應(yīng)用層。硬件層包括處理器、通信總線、存儲設(shè)備和其它片上控制器外設(shè)。支撐軟件是系統(tǒng)運(yùn)行的基礎(chǔ),包括設(shè)備驅(qū)動(dòng)、操作系統(tǒng)和軟件包等與設(shè)備密切相關(guān)的軟件環(huán)境。通信中間件層是本文設(shè)計(jì)的核心,基于DDS規(guī)范的通信中間件,簡化了通信細(xì)節(jié),解耦了應(yīng)用與底層軟件環(huán)境的同時(shí),向應(yīng)用提供了統(tǒng)一的編程接口,方便應(yīng)用的開發(fā)和遷移。應(yīng)用層是用戶需求功能的具體實(shí)現(xiàn)。
圖3 系統(tǒng)分層架構(gòu)Figure 3. Hierarchical system architecture
通信中間件層是本文設(shè)計(jì)的核心,其按功能可化分為5個(gè)主要模塊:
(1)消息報(bào)文管理模塊。負(fù)責(zé)將用戶數(shù)據(jù)封裝為UDP-RTPS協(xié)議類型的消息包,并解析接收到的UDP-RTPS消息包;
(2)動(dòng)態(tài)發(fā)現(xiàn)模塊。在節(jié)點(diǎn)應(yīng)用運(yùn)行過程中,周期性地發(fā)送動(dòng)態(tài)加入報(bào)文,將本節(jié)點(diǎn)的位置信息和實(shí)體信息告知其它節(jié)點(diǎn);
(3)節(jié)點(diǎn)信息管理模塊。維護(hù)本節(jié)點(diǎn)訂閱者、發(fā)布者信息和位置相關(guān)信息等;維護(hù)與本節(jié)點(diǎn)有通信需求的訂閱者及其位置信息等;
(4)事件處理模塊。解耦各個(gè)功能模塊,處理各個(gè)模塊產(chǎn)生的事件,并協(xié)調(diào)各模塊之間的交互;
(5)數(shù)據(jù)模型庫模塊。用戶根據(jù)實(shí)際場景,對數(shù)據(jù)建模后的模型庫,通過模型預(yù)測更新數(shù)據(jù),減少發(fā)送設(shè)備和接收設(shè)備之間的通信數(shù)據(jù)量。
完整的DDS規(guī)范對通信協(xié)議和API接口進(jìn)行了標(biāo)準(zhǔn)化,從通信層面的發(fā)現(xiàn)、連接、QoS、交互等到軟件層面的實(shí)體對象、消息構(gòu)建和接口定義等,均有較為詳細(xì)地說明。因此完整的DDS通信中間件對資源有較高的要求。
為了能夠在資源有限的設(shè)備上實(shí)現(xiàn)DDS中間件的部署,必須對其功能和協(xié)議進(jìn)行裁剪。在深入研究DDS規(guī)范和物聯(lián)網(wǎng)網(wǎng)絡(luò)模型后,將QoS策略和RTPS協(xié)議作為主要優(yōu)化對象。
DDS支持多達(dá)22種QoS策略,除了基于傳輸可靠性的策略,還有基于優(yōu)先級、傳輸時(shí)間和資源限制等高級策略。多樣化的QoS支持提高了應(yīng)用的靈活性[15],但同時(shí)也增加了應(yīng)用程序?qū)τ?jì)算、存儲資源的需求。在一般的中小型區(qū)域化網(wǎng)絡(luò)環(huán)境中,嵌入式設(shè)備是主要的組成節(jié)點(diǎn),基于可靠性的QoS策略可以滿足大部分的應(yīng)用需求。因此,本文針對嵌入式設(shè)備設(shè)計(jì)的DDS通信中間件僅實(shí)現(xiàn)基于可靠性的QoS策略。
DDS使用RTPS協(xié)議進(jìn)行通信的數(shù)據(jù)報(bào)文被稱為消息。消息由各種子消息組成,包括數(shù)據(jù)子消息、心跳子消息、時(shí)間戳子消息和數(shù)據(jù)分段子消息等。在嵌入式場景中,大部分節(jié)點(diǎn)發(fā)送的是通過傳感器獲取的短數(shù)據(jù),僅需一個(gè)消息就可以完成傳輸,對于少量較長的數(shù)據(jù),用戶可以通過簡單的分段機(jī)制,實(shí)現(xiàn)數(shù)據(jù)的傳輸。因此,將RTPS中與數(shù)據(jù)分段相關(guān)的數(shù)據(jù)段子消息、數(shù)據(jù)段NACK子消息和數(shù)據(jù)段心跳子消息略去,可減少協(xié)議棧處理過程中的分支判斷次數(shù),同時(shí)也減少了代碼體積。
2.3.1 數(shù)據(jù)分類
在嵌入式系統(tǒng)中,節(jié)點(diǎn)間進(jìn)行通信的數(shù)據(jù)類型可以簡單分為3類:傳感器數(shù)據(jù)、控制命令數(shù)據(jù)和流數(shù)據(jù)。各種數(shù)據(jù)特性如下:
(1)傳感器數(shù)據(jù)。該數(shù)據(jù)是現(xiàn)實(shí)環(huán)境中的某些物理量(溫度、濕度等)經(jīng)由專門的轉(zhuǎn)換芯片處理后得到的數(shù)值表示,與現(xiàn)實(shí)環(huán)境有較強(qiáng)的相關(guān)性。該類數(shù)據(jù)一般為周期性數(shù)據(jù),且相鄰數(shù)據(jù)間存在聯(lián)系,具有可預(yù)測性;
(2)控制命令數(shù)據(jù)。由于某些事件或中斷的發(fā)生,應(yīng)用產(chǎn)生的控制指令信息的數(shù)值表示,例如燈開關(guān)、舵機(jī)轉(zhuǎn)速等。該類數(shù)據(jù)需要較強(qiáng)的可靠性,以保證控制命令及時(shí)、準(zhǔn)確地到達(dá)目標(biāo)節(jié)點(diǎn),調(diào)整目標(biāo)節(jié)點(diǎn)工作狀態(tài),確保整個(gè)系統(tǒng)正常穩(wěn)定運(yùn)行;
(3)流數(shù)據(jù)。需要順序、連續(xù)到達(dá)的大批量數(shù)據(jù)序列,例如視頻、音頻等。該類數(shù)據(jù)的傳輸要求盡快到達(dá),并且允許一定的丟包率。
通過對嵌入式系統(tǒng)中3類數(shù)據(jù)特征的分析,可以看出3類數(shù)據(jù)在QoS要求、可預(yù)測性和連續(xù)性方面存在差異。對于控制命令數(shù)據(jù)和流數(shù)據(jù),其不存在可預(yù)測性,僅對QoS具有特定要求,因此使用一般的發(fā)布/訂閱方式即能夠滿足需求。對于傳感器數(shù)據(jù),由于其存在可預(yù)測性,因此可以使用某種模型來描述數(shù)據(jù),這也是本設(shè)計(jì)的重點(diǎn)。
2.3.2 卡爾曼濾波
現(xiàn)實(shí)環(huán)境中的物理量一般為隨時(shí)間變化的連續(xù)值。在實(shí)際環(huán)境中,傳感器由于其自身的測量誤差,測量得到的環(huán)境數(shù)據(jù)與真實(shí)的數(shù)據(jù)存在偏差,因此通常需要額外的數(shù)據(jù)處理算法對數(shù)據(jù)進(jìn)行處理,得到較為準(zhǔn)確的最優(yōu)估計(jì)值??柭鼮V波算法由于實(shí)現(xiàn)簡單和良好的估計(jì)性能,被廣泛用作嵌入式系統(tǒng)中的數(shù)據(jù)修正算法[16]。
卡爾曼濾波算法適合用于對線性系統(tǒng)的估計(jì),其狀態(tài)空間模型可由預(yù)測方程和觀測方程進(jìn)行描述。對于離散數(shù)據(jù),一般表示形式如式(1)和式(2)所示。
x(k)=F(k,k-1)x(k-1)+
B(k,k-1)u(k-1)+q(k)
(1)
z(k)=H(k)x(k)+r(k)
(2)
其中,x(k)表示第k個(gè)樣本的狀態(tài);F(k,k-1)為從k-1到k時(shí)刻的狀態(tài)轉(zhuǎn)移矩陣;x(k-1)為第k-1個(gè)樣本的狀態(tài);B(k,k-1)為k-1到k時(shí)刻的輸入增益矩陣;u(k-1)為k-1時(shí)刻的輸入向量;q(k)為k時(shí)刻的系統(tǒng)過程噪聲;z(k)為k時(shí)刻的觀測狀態(tài);H(k)為k時(shí)刻的轉(zhuǎn)換矩陣;r(k)為k時(shí)刻的觀測噪聲。
在嵌入式系統(tǒng)中,傳感器數(shù)據(jù)一般為周期性的離散數(shù)據(jù),且具有較好的線性,適合由卡爾曼算法進(jìn)行處理。同時(shí),為了進(jìn)一步簡化模型,可以將式(1)中的輸入相關(guān)項(xiàng)略去,之后由卡爾曼濾波算法相關(guān)理論[17]可得到如下方程:
(1)預(yù)測方程為
x(k|k-1)=F(k,k-1)x(k-1|k-1)
(3)
P(k|k-1)=F(k,k-1)P(k-1|k-1)FT(k,k-1)+Q(k)
(4)
(2)更新方程
(5)
x(k|k)=x(k|k-1)+K(k)(z(k)-H(k)·
x(k|k-1))
(6)
P(k|k)=(I-K(k)H(k))P(k|k-1)
(7)
其中,x(k|k-1)為根據(jù)k-1時(shí)刻的狀態(tài)得到的k時(shí)刻的先驗(yàn)估計(jì);x(k|k)為k時(shí)刻的最優(yōu)狀態(tài)估計(jì);P(k|k-1)為k-1時(shí)刻到k時(shí)刻的預(yù)測誤差協(xié)方差矩陣;Q(k)為過程誤差協(xié)方差矩陣;P(k|k)為k時(shí)刻的濾波預(yù)測誤差協(xié)方差矩陣;R(k)為觀測誤差協(xié)方差矩陣;I為單位矩陣。上述方程在卡爾曼濾波算法的執(zhí)行過程中不斷迭代,每次迭代后獲得當(dāng)前樣本的最優(yōu)估計(jì)值并更新模型。
2.3.3 基于卡爾曼濾波模型的發(fā)布/訂閱
由式(3)可知,卡爾曼算法可以根據(jù)上一時(shí)刻樣本狀態(tài)的最優(yōu)估計(jì)x(k-1|k-1)獲得當(dāng)前時(shí)刻樣本的先驗(yàn)估計(jì)x(k|k-1)。若某傳感器數(shù)據(jù)允許δ的誤差,即k時(shí)刻樣本的最優(yōu)估計(jì)x(k|k)與當(dāng)前時(shí)刻樣本的先驗(yàn)估計(jì)x(k|k-1)存在如下關(guān)系
|x(k|k)-x(k|k-1)|≤δ
(8)
此時(shí),可以將當(dāng)前樣本的最優(yōu)估計(jì)值近似等價(jià)于當(dāng)前時(shí)刻樣本的先驗(yàn)估計(jì),即
x(k|k)=x(k|k-1)=
F(k,k-1)x(k-1|k-1)
(9)
由式(9)可以看出,當(dāng)允許存在δ的誤差時(shí),當(dāng)前時(shí)刻的狀態(tài)僅與上一時(shí)刻的狀態(tài)和狀態(tài)轉(zhuǎn)移矩陣有關(guān),不再與觀測值相關(guān)。
在基于DDS的通信系統(tǒng)中,發(fā)布者負(fù)責(zé)觀測傳感器數(shù)據(jù),并將觀測數(shù)據(jù)發(fā)送至訂閱者。結(jié)合上文的分析,若某時(shí)刻訂閱者本地存儲有上一時(shí)刻的最優(yōu)估計(jì)數(shù)據(jù),且數(shù)據(jù)允許一定的偏差,則當(dāng)前時(shí)刻的最優(yōu)估計(jì)可直接由上一時(shí)刻的最優(yōu)估計(jì)數(shù)據(jù)得出,無需觀測數(shù)據(jù)信息,即當(dāng)前時(shí)刻,節(jié)點(diǎn)間可以不進(jìn)行數(shù)據(jù)的傳輸。這樣操作不僅節(jié)約了通信帶寬,還降低了設(shè)備的能耗。
基于以上推論,本文在DDS中間件中,引入了一種基于卡爾曼濾波模型的發(fā)布訂閱機(jī)制,在保證數(shù)據(jù)更新率的同時(shí),降低了數(shù)據(jù)的傳輸量。
為了保證訂閱者和發(fā)布者數(shù)據(jù)的同步更新,需要在兩端部署相同的卡爾曼模型。發(fā)布者每次獲得觀測數(shù)據(jù)后,通過檢驗(yàn)當(dāng)前模型預(yù)測誤差是否在允許范圍內(nèi),決定是否向訂閱者傳送數(shù)據(jù),算法偽代碼如下所示:
Input:x:當(dāng)前時(shí)刻傳感器觀測值
Input:δ:傳感器數(shù)據(jù)容錯(cuò)門限
1:x′=由模型估計(jì)得到的傳感器預(yù)測值;
2: if |x-x′| ≤δthen
3: 丟棄當(dāng)前時(shí)刻傳感器觀測值x;
4: else
5: 根據(jù)當(dāng)前時(shí)刻傳感器觀測值x更新模型;
6: 將當(dāng)前傳感器觀測值x傳送至訂閱端;
7: end if
訂閱者一般通過預(yù)測模型得到的預(yù)測值更新傳感器數(shù)據(jù)。如果接收到發(fā)布者發(fā)送的新數(shù)據(jù),代表當(dāng)前模型預(yù)測精度不夠,需要使用新數(shù)據(jù)更新模型,偽代碼如下所示:
Input: flag:發(fā)布端數(shù)據(jù)到達(dá)標(biāo)志
Input:x:訂閱端收到的當(dāng)前時(shí)刻傳感器觀測值
1: if flag == true then
2: 根據(jù)當(dāng)前時(shí)刻傳感器觀測值x更新模型;
3: else
4: 由模型估計(jì)得到的傳感器預(yù)測值x′;
5: 將傳感器當(dāng)前值更新為x′;
6: end if
在通信網(wǎng)絡(luò)中,為了保證發(fā)送方和接收方數(shù)據(jù)的正常交互,通常需要在雙方引入緩存隊(duì)列。常見的緩存隊(duì)列模型有多對列和單隊(duì)列模型。從文獻(xiàn)[18~19]中對多隊(duì)列調(diào)度算法的分析可以看出,多隊(duì)列模型需要較多的存儲資源,而且調(diào)度算法的實(shí)現(xiàn)也較為復(fù)雜,不適合在計(jì)算能力較差的設(shè)備上部署。因此,本文基于精簡后的兩種DDS QoS策略,提出了一種基于QoS策略的單隊(duì)列模型。該模型能夠在占用較少內(nèi)存資源和計(jì)算資源的情況下,最大程度地保證可靠類消息的傳輸,該算法的詳細(xì)偽代碼如下所示:
Input: msg:用戶消息
Input:msgLen: 用戶消息
Input:msgQoS: 用戶消息QoS
1: Queue =發(fā)送隊(duì)列;
2: ReplacedNode = 隊(duì)列中被新消息替換的非可靠消息節(jié)點(diǎn);
3: if msgQoS == Reliable then
4: if Queue已滿 then
5: repeat
6: 從隊(duì)列頭部遍歷非可靠消息節(jié)點(diǎn)ReplacedNode;
7: until ReplacedNode能夠容納msg;
8: 將ReplacedNode替換為msg;
9: else
10: 將msg插入Queue尾部;
11: end if
12: else
13: if Queue已滿 then
14: 丟棄當(dāng)前消息;
15: else
16: 將msg插入Queue尾部;
17: end if
18: end if
在基于QoS策略的單隊(duì)列模型中,當(dāng)發(fā)送緩沖空間充足時(shí),新產(chǎn)生的所有用戶消息按照順序插入隊(duì)列。一旦發(fā)送緩沖空間不足時(shí),該算法將隊(duì)列中的非可靠消息替換為新的可靠類消息,并將新的非可靠消息直接丟棄,避免因隊(duì)列空間不足而導(dǎo)致可靠類消息丟失的情況發(fā)生。
為了測試本文設(shè)計(jì)的輕量級DDS通信中間件的基本功能,搭建了由一臺PC和一塊STM32組成的硬件平臺,兩者之間通過網(wǎng)線直接連接。由于STM32使用百兆網(wǎng)連接PC,因此兩者之間的最大數(shù)據(jù)傳輸速率為100 Mbit·s-1。其具體軟硬件環(huán)境信息如表1所示。
表1 測試平臺環(huán)境
本文在PC上運(yùn)行Ubuntu18.04操作系統(tǒng),其上部署了一個(gè)發(fā)布者應(yīng)用A和一個(gè)訂閱者應(yīng)用B。此外,本文在STM32開發(fā)板上運(yùn)行RT-Thread微內(nèi)核操作系統(tǒng),其上部署了一個(gè)發(fā)布者應(yīng)用C和一個(gè)訂閱者應(yīng)用D。所有應(yīng)用均使用本文設(shè)計(jì)的通信中間件進(jìn)行交互,應(yīng)用部署情況如圖4所示。
圖4 測試應(yīng)用部署Figure 4. Test application deployment
3.2.1 發(fā)布訂閱功能測試
應(yīng)用A發(fā)布“ubuntu_topic”主題,應(yīng)用C發(fā)布“stm32_topic”主題,應(yīng)用B同時(shí)訂閱“ubuntu_topic”和“stm32_topic”主題,應(yīng)用D訂閱“ubuntu_topic”主題。該測試能夠驗(yàn)證節(jié)點(diǎn)內(nèi)部和節(jié)點(diǎn)間的基本收發(fā)功能是否正常。測試步驟如下:
步驟1啟動(dòng)應(yīng)用B,訂閱 “ubuntu_topic”和“stm32_topic”主題;
步驟2啟動(dòng)應(yīng)用D,訂閱“ubuntu_topic”主題;
步驟3應(yīng)用C,發(fā)布主題“stm32_topic”主題;
步驟4最后啟動(dòng)應(yīng)用B,發(fā)布“ubuntu_topic”主題;
步驟5觀察應(yīng)用B和應(yīng)用D窗口輸出信息,確認(rèn)應(yīng)用之間是否正確建立連接并通信。
由表2可以看出,本文提出的輕量級DDS通信中間件能夠?yàn)橥O(shè)備節(jié)點(diǎn)和不同設(shè)備節(jié)點(diǎn)間的分布式應(yīng)用提供自動(dòng)發(fā)現(xiàn)、自動(dòng)連接和正常通信服務(wù)。
表2 節(jié)點(diǎn)通信測試結(jié)果
3.2.2 WireShark抓包分析
在Ubuntu18.04中運(yùn)行WireShark網(wǎng)絡(luò)抓包工具,獲取應(yīng)用運(yùn)行過程中產(chǎn)生的數(shù)據(jù)包,驗(yàn)證 RTPS 消息格式是否滿足規(guī)范要求。本通信中間件對RTPS協(xié)議進(jìn)行了裁剪,主要支持4種類型子消息的編解碼,分別是數(shù)據(jù)子消息、心跳包子消息、AckNack 子消息和時(shí)間戳子消息。實(shí)際應(yīng)用中通過4種子消息的組合,可以實(shí)現(xiàn)SPDP消息包、SEDP消息包、數(shù)據(jù)確認(rèn)數(shù)據(jù)包和用戶消息數(shù)據(jù)包等,能夠滿足嵌入式領(lǐng)域中的基本通信需求。
表3 WireShark抓包解析結(jié)果
從表3結(jié)果可知,WireShark能夠正確識別出RTPS協(xié)議類型,表明RTPS消息報(bào)文頭構(gòu)建正常,同時(shí)可以看到各消息內(nèi)部子消息均正常列出,說明子消息構(gòu)建符合RTPS規(guī)范,本通信中間件能夠與標(biāo)準(zhǔn)的DDS通信中間件進(jìn)行交互。
3.3.1 資源占用情況
圖5展示了在STM32+RT-Thread微內(nèi)核操作系統(tǒng)的軟件環(huán)境下,內(nèi)存占用和發(fā)布/訂閱實(shí)體數(shù)量之間的關(guān)系。當(dāng)發(fā)布/訂閱實(shí)體數(shù)量為0時(shí),代表RT-Thread及基礎(chǔ)支持軟件占用的內(nèi)存量。從圖5可以看出,當(dāng)引入通信中間件后,內(nèi)存占用增加了約50 kB。之后隨著通信實(shí)體數(shù)目的不斷增加,內(nèi)存占用呈線性增加,且可估算出每增加一個(gè)通信實(shí)體,內(nèi)存占用增加約5 kB,表明該中間件具有較好的內(nèi)存可預(yù)測性,能夠根據(jù)實(shí)際設(shè)備的資源情況指定通信實(shí)體數(shù)目,充分利用內(nèi)存資源。
圖5 內(nèi)存占用與發(fā)布/訂閱實(shí)體數(shù)量關(guān)系Figure 5. Relationship between memory consumption and the number of publish/subscribe entities
3.3.2 額外通信開銷
為了評估本文設(shè)計(jì)的DDS中間件引入的額外通信開銷,以傳統(tǒng)的UDP作為比較項(xiàng)。實(shí)驗(yàn)中PC端發(fā)布者A發(fā)送2 000次固定長度的消息,STM32端訂閱者D接收到每接收一次完整消息后,由STM32端發(fā)布者C將接收到的消息回傳到PC端的訂閱者B,并記錄其回環(huán)時(shí)間。之后將消息長度變?yōu)樵瓉淼?倍,并重復(fù)上述步驟。本系列實(shí)驗(yàn)的消息長度范圍為 2 ~ 32 768 Byte,QoS配置為盡力而為策略。
圖6 UDP 和 DDS 不同長度消息回環(huán)測試Figure 6. Different length message loopback test of UDP and DDS
由圖6可以看出,使用本文設(shè)計(jì)的輕量級DDS中間件的在各種長度數(shù)據(jù)包下的回環(huán)時(shí)間和使用傳統(tǒng)的UDP方式的回環(huán)時(shí)間差距相近,具有較低的額外時(shí)間開銷,能夠滿足上層應(yīng)用的實(shí)時(shí)性需求。
為了更加全面的分析本文設(shè)計(jì)的輕量級DDS通信中間件的優(yōu)缺點(diǎn),并為后續(xù)研究提供指導(dǎo),實(shí)驗(yàn)中將Micro XRCE-DDS和Cyclone DDS作為比較對象,兩者均為開源輕量級DDS項(xiàng)目。
3.4.1 端到端延遲
端到端延時(shí)是評估系統(tǒng)響應(yīng)速度的重要依據(jù)。在本實(shí)驗(yàn)中采用測量延時(shí)的經(jīng)典方法。
E2E_delay=RTT/2
(10)
其中,RTT為從本節(jié)點(diǎn)發(fā)布者將數(shù)據(jù)提交到中間件開始,到本節(jié)點(diǎn)訂閱者接收到遠(yuǎn)端發(fā)布者回傳的數(shù)據(jù)為止所經(jīng)過的時(shí)間。
在本實(shí)驗(yàn)中,所有的DDS測試流程如下:PC端發(fā)布者發(fā)送2 000次固定長度的消息。STM32端訂閱者接收到每接收一次完整消息后,由STM32端發(fā)布者將接收到的消息回傳到PC端的訂閱者,并記錄其回環(huán)時(shí)間。之后將消息長度變?yōu)樵瓉淼?倍,并重復(fù)上述步驟。本系列實(shí)驗(yàn)的消息長度范圍為 2 ~ 16 384 Byte,QoS配置為盡力而為策略。
圖7 不同DDS端到端延時(shí)對比Figure 7. End to end delay comparison of different DDS
由圖7可以看出,Micro XRCE-DDS的端到端延時(shí)較高,主要原因是其基于代理的通信方式,使得所有數(shù)據(jù)的傳輸均需經(jīng)過額外的數(shù)據(jù)通路和處理,增加了整體延時(shí)。Cyclone和本文設(shè)計(jì)的DDS均采用去中心化的設(shè)計(jì)方法,在短消息傳輸階段,延時(shí)相近。此時(shí)的延時(shí)主要為系統(tǒng)任務(wù)調(diào)度和處理器開銷帶來的延時(shí)。隨著數(shù)據(jù)量的不斷增加,由于本文設(shè)計(jì)的DDS經(jīng)過了功能裁剪,在協(xié)議解析過程中更加快捷,因此擁有更低的延時(shí)。
3.4.2 可建模數(shù)據(jù)傳輸
為了測試本文提出的基于卡爾曼濾波模型的對稱式發(fā)布訂閱機(jī)制對通信數(shù)據(jù)量的影響,設(shè)定如下場景及模型:
(1)場景為溫度采集系統(tǒng)。溫度保持在約25 ℃,發(fā)布端作為數(shù)據(jù)的采集和發(fā)送,以1 Hz的頻率更新本地?cái)?shù)據(jù);訂閱端負(fù)責(zé)對數(shù)據(jù)的收集和檢測,數(shù)據(jù)更新率也為1 Hz,系統(tǒng)允許的最大數(shù)據(jù)誤差為0.3 ℃,測試時(shí)間120 s;
(2)模型為卡爾曼模型,即F(k,k-1) = 1,H(k)= 1,Q(k) = 0.01,R(k) = 0.36,z(0)=
x(0|0) = 22.5。
測試結(jié)果如圖8所示,X軸代表時(shí)間,Y主坐標(biāo)軸代表當(dāng)前溫度的最優(yōu)估計(jì)值,次坐標(biāo)軸表代表通信信事件是否發(fā)生。在Y=1上的標(biāo)記,代表發(fā)生了通信事件。由圖8中可以看出,訂閱者和發(fā)布者的最優(yōu)估計(jì)值具有相同的變化趨勢,且訂閱端的誤差在允許范圍內(nèi),滿足用戶的數(shù)據(jù)精度需求。同時(shí)也可以看到,在120 s的測試時(shí)間內(nèi),共發(fā)生了56次的通信事件,降低了對通信帶寬的需求。
圖8 可建模數(shù)據(jù)更新及通信Figure 8. Updating and communication of modelable data
在該場景中,對于Micro XRCE-DDS和Cyclone DDS通信中間件,訂閱者的數(shù)據(jù)更新均依賴于發(fā)布者發(fā)送的數(shù)據(jù),因此在120 s的測試時(shí)間內(nèi)共需觸發(fā)120次通信事件。
綜上所述,在該測試場景下,本文提出的基于模型的數(shù)據(jù)傳輸方式能夠在保證數(shù)據(jù)精度的情況下,降低約50%的數(shù)據(jù)傳輸量。
本文在深入分析了DDS通信中間件的通信模型和交互消息格式后,結(jié)合嵌入式設(shè)備特點(diǎn),對標(biāo)準(zhǔn)DDS功能進(jìn)行了裁剪優(yōu)化,使用C語言實(shí)現(xiàn)了一種可移植的、輕量化DDS通信中間件。該通信中間件引入了一種基于卡爾曼濾波模型的發(fā)布訂閱機(jī)制,有效降低了通信中的冗余數(shù)據(jù),節(jié)約了通信帶寬資源。此外,使用基于QoS的單隊(duì)列發(fā)送模型,降低了因?yàn)榫彺婵臻g不足導(dǎo)致可靠消息丟失的概率。經(jīng)過在ARM和X86組成的異構(gòu)平臺上的部署測試,結(jié)構(gòu)表明該通信中間件能夠?yàn)榉植际綉?yīng)用提供基本的DDS服務(wù),支持自動(dòng)組網(wǎng)、發(fā)布/訂閱式數(shù)據(jù)傳輸、心跳檢測和數(shù)據(jù)包確認(rèn)機(jī)制,具有良好的響應(yīng)速度且可以降低網(wǎng)絡(luò)中的數(shù)據(jù)量,滿足嵌入式應(yīng)用通信的基本需求,為跨平臺實(shí)時(shí)通信中間件的研究提供參考。在后續(xù)的研究中,將繼續(xù)完善該通信中間件的功能,引入更加準(zhǔn)確、高效的數(shù)據(jù)建模算法,并逐步擴(kuò)展QoS策略,以滿足嵌入式環(huán)境中對通信質(zhì)量的多樣化需求。