• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      DDS分布式系統(tǒng)快速開發(fā)

      2022-12-30 07:51:36唐江文
      計算機工程與設(shè)計 2022年12期
      關(guān)鍵詞:代碼生成開發(fā)者代碼

      唐江文

      (中國電子科技集團公司 電子科學(xué)研究院,北京 100041)

      0 引 言

      數(shù)據(jù)分發(fā)服務(wù)(data-distribution service,DDS)是一種發(fā)布訂閱式的通信中間件,它由OMG組織于2004年發(fā)布為國際開放標準,并不斷擴充發(fā)展至今。DDS引入了虛擬全局數(shù)據(jù)空間的概念,在全局數(shù)據(jù)空間中,應(yīng)用可以通過讀寫帶有主題的數(shù)據(jù)對象的方式進行通信。同時,DDS提供了QoS參數(shù)配置功能,可以實現(xiàn)對可靠性、帶寬、通信截止時間以及資源上限的靈活控制。DDS可以實現(xiàn)分布式通信實體間的解耦,發(fā)布者和訂閱者可以動態(tài)加入和退出,使系統(tǒng)具有高擴展性;另外,DDS采用組播自動發(fā)現(xiàn)的機制,DDS應(yīng)用可以靈活部署在網(wǎng)絡(luò)中的任一計算機設(shè)備上。

      目前,DDS廣泛應(yīng)用于各種需要實時數(shù)據(jù)交換的場景和領(lǐng)域。文獻[1]在EXata仿真器構(gòu)建的子系統(tǒng)間,使用DDS實現(xiàn)數(shù)據(jù)交互和時間同步,提高了大規(guī)模電力通信網(wǎng)的仿真效率;文獻[2]基于DDS實現(xiàn)了組織靈活、支持實時狀態(tài)監(jiān)控與用戶管理的語音通信系統(tǒng);文獻[3]基于DDS實現(xiàn)了一種分布式的熱處理集散控制監(jiān)控系統(tǒng),用于航天火箭發(fā)動機制造領(lǐng)域;文獻[4]中的ROS2,是基于DDS開發(fā)的多Agent機器人系統(tǒng)開發(fā)框架,廣泛應(yīng)用于機器人研究和仿真;文獻[5]基于DDS實現(xiàn)了航天器軟件通信框架,可以實現(xiàn)靈活便捷的通信過程。

      通過前面各領(lǐng)域的工程實踐,已經(jīng)充分證明了DDS作為分布式系統(tǒng)的通信中間件,具有的高擴展性和高靈活性。但在開發(fā)基于DDS的大規(guī)模分布式系統(tǒng)時暴露了一項不足之處:缺乏分布式系統(tǒng)建模的能力。這是因為用于DDS開發(fā)的IDL語言,只描述接口的數(shù)據(jù)類型,而沒有描述主題、消息域,更沒有描述應(yīng)用。這些信息的缺失造成DDS無法像常見的建模語言(例如UML和SysML)那樣方便地進行代碼自動生成[6,7],進而限制了DDS應(yīng)用的開發(fā)效率,不得不使用文檔以文字的形式來描述系統(tǒng)模型,并且編寫大量重復(fù)冗余的代碼,易錯難查。

      本文擴展了IDL語法,添加了topic和domain關(guān)鍵字,從而可以從IDL文件中同時解析出來接口數(shù)據(jù)類型信息和主題、消息域信息;另外又為應(yīng)用設(shè)計了應(yīng)用描述XML文件,用于獲取應(yīng)用對主題的發(fā)布訂閱相關(guān)信息。實現(xiàn)了編譯器dseappgen,直接為應(yīng)用生成面向主題發(fā)布訂閱的C++代碼文件,并自動編譯成動態(tài)庫,去除了重復(fù)冗余代碼,大大簡化了開發(fā)者的開發(fā)工作,并降低了出錯風(fēng)險。另外,本文還在自動生成的代碼中植入了一些增強功能,比如植入了Lua語言解釋器[8,9],讓開發(fā)者可以進行快速仿真;又如Json字符串與DDS消息之間的相互轉(zhuǎn)換,增強了DDS原有的序列化能力;并且植入了輕量級的Http Server,支持用戶為應(yīng)用進行B/S架構(gòu)開發(fā)。

      1 DDS通信原理簡介

      DDS是通過自動發(fā)現(xiàn)協(xié)議實現(xiàn)與網(wǎng)絡(luò)IP的解耦[10]。只要應(yīng)用位于同一個支持組播的二層網(wǎng)絡(luò)中,就可以自動匹配具有相同主題的發(fā)布者和訂閱者,所以應(yīng)用可以部署運行在網(wǎng)絡(luò)中的任何一臺計算機設(shè)備上,這讓開發(fā)者無需關(guān)注網(wǎng)絡(luò)具體的組網(wǎng)結(jié)構(gòu)。

      DDS的發(fā)布者和訂閱者的自動匹配能力,源自于DDS的自動發(fā)現(xiàn)協(xié)議,協(xié)議涉及的主要概念和基本過程如圖1所示。DDS中的通信實體稱作“參與者(Participant)”,參與者記錄了當前計算機設(shè)備所有的IP地址和端口,以及共享內(nèi)存的“端口”。當應(yīng)用中實例化一個參與者時,它會執(zhí)行參與者發(fā)現(xiàn)協(xié)議(PDP),用PDP寫者(PDPWriter)通過組播的方式將自己的IP地址以及EDP的發(fā)布(Pub)/訂閱(Sub)的讀者(Reader)/寫者(Writer)等信息發(fā)送給其它參與者,其它參與者會記錄下這位新參與者的信息,并把自己的相應(yīng)信息發(fā)送回來,從而保證每個參與者都能感知到網(wǎng)絡(luò)中其它參與者的存在,并且知曉與其它參與者的通信方法。

      圖1 DDS通信原理:自動發(fā)現(xiàn)協(xié)議支撐發(fā)布訂閱通信方式

      當用戶使用DDS進行業(yè)務(wù)數(shù)據(jù)通信時,首先會定義某個主題的發(fā)布者(Publisher)/訂閱者(Subscriber),然后關(guān)聯(lián)到用戶寫者(UserWriter)/用戶讀者(UserReader)。此時,參與者會執(zhí)行終端發(fā)現(xiàn)協(xié)議(EDP),將用戶寫者/用戶讀者的相關(guān)信息,比如主題、消息類型等,發(fā)送給網(wǎng)絡(luò)中需要這些信息的其它參與者,進行用戶讀/寫者的匹配,這樣發(fā)布者就知道了其發(fā)布的消息應(yīng)該發(fā)送給哪些訂閱者,從而實現(xiàn)了發(fā)布訂閱的通信方式。

      圖2簡單展示了DDS底層數(shù)據(jù)緩存及收發(fā)模型,DDS在發(fā)送消息時,從更改池(CacheChange Pool)中取出一個更改(CacheChange,“更改”可以簡單理解為一個消息),從負載池(Payload Pool)中取出一個負載(Payload),將需要發(fā)送的數(shù)據(jù)序列化后填入負載,然后掛載到更改中。隨后,更改會被添加到寫者歷史(Writer History,可以理解為一個消息隊列)里,發(fā)送線程會將寫者歷史中的更改通過指定的傳輸方式(UDP、TCP、共享內(nèi)存)發(fā)送到相應(yīng)接收方。發(fā)送結(jié)束后,該更改會從寫者歷史中移除,其負載會在釋放數(shù)據(jù)后重新放到負載池中,而該更改也會被回收到更改池中。接收消息的一方,其內(nèi)存也會進行類似的鏈式循環(huán)操作??梢?,DDS充分利用了內(nèi)存池技術(shù),最大程度地提高了內(nèi)存效率。

      圖2 DDS底層數(shù)據(jù)緩存及收發(fā)模型

      2 DDS分布式系統(tǒng)開發(fā)流程的改進

      傳統(tǒng)DDS分布式系統(tǒng)的開發(fā)流程如圖3所示,設(shè)計人員一側(cè),首先撰寫系統(tǒng)軟件設(shè)計文檔,然后手動編寫IDL文件,由ddsgen生成各接口正反序列化代碼。開發(fā)人員一側(cè),手動編寫主題、消息域、主題與接口相關(guān)、主題與發(fā)布訂閱相關(guān)以及大量業(yè)務(wù)代碼,最后和ddsgen自動生成的代碼完成編譯鏈接生成DDS應(yīng)用。

      圖3 傳統(tǒng)DDS分布式系統(tǒng)的開發(fā)流程

      其中存在的問題是,設(shè)計文檔是一種供人閱讀的、格式相對自由的文本,無法為開發(fā)提供強制約束。設(shè)計人員根據(jù)設(shè)計文檔編寫IDL文件,容易出現(xiàn)謄抄錯誤,后期一旦文檔發(fā)生更改需要手動進行同步,費時費力。而且,主題、消息域、主題與接口的關(guān)聯(lián)、主題與發(fā)布訂閱的關(guān)聯(lián)是設(shè)計內(nèi)容,卻侵入到了開發(fā)人員的代碼中,設(shè)計和開發(fā)出現(xiàn)交叉,導(dǎo)致設(shè)計和開發(fā)邊界不清,既加大了開發(fā)者工作量,也讓代碼容易出錯。事實上,設(shè)計一旦固定下來,業(yè)務(wù)之外的其它代碼基本是固定不變的,完全可以自動生成,避免不必要的出錯風(fēng)險。

      改進后的DDS應(yīng)用開發(fā)流程如圖4所示,由格式化、結(jié)構(gòu)化較強的類代碼文件(IDL文件、應(yīng)用描述XML文件)替代系統(tǒng)軟件設(shè)計文檔作為原始設(shè)計輸入,后期系統(tǒng)軟件設(shè)計文檔可以由這些文件自動生成,這就解決了文檔和工程實現(xiàn)之間難以同步的問題,而且這些類代碼文件還可以通過一些版本管理工具(如Git)進行歷史版本管理。之前業(yè)務(wù)代碼之外需要手動編寫的代碼也可以通過語法解析和模板生成的方式,進行自動生成。這樣一來,設(shè)計和開發(fā)實現(xiàn)完全解耦,業(yè)務(wù)開發(fā)人員只需要關(guān)心業(yè)務(wù)內(nèi)容,編寫業(yè)務(wù)代碼即可,大大減少了開發(fā)人員的工作量,同時也避免了出錯風(fēng)險。最后將這些代碼自動編譯鏈接,生成DDS應(yīng)用。

      圖4 DDS分布式系統(tǒng)的快速開發(fā)流程

      自動生成代碼的另一個優(yōu)勢是,還可以根據(jù)解析出來的接口、主題、消息域等元信息,自動生成各種增強性功能代碼,這里主要添加了Lua解釋器、Json與接口消息的轉(zhuǎn)換、Http Server、消息記錄、消息統(tǒng)計等功能,進一步增強DDS應(yīng)用的基礎(chǔ)能力。

      3 改進的IDL編譯器dseappgen關(guān)鍵技術(shù)

      前面介紹了DDS分布式系統(tǒng)開發(fā)流程的改進,而支撐改進的核心是dseappgen這個改進的IDL編譯器的實現(xiàn)。本部分主要介紹dseappgen的關(guān)鍵技術(shù)途徑,分為5個方面:①新的設(shè)計輸入;②語法解析;③代碼生成;④Lua解釋器;⑤其它增強功能。

      3.1 新的設(shè)計輸入

      前面提到,在新的開發(fā)流程中使用格式化、結(jié)構(gòu)化較強的類代碼文件(IDL文件、應(yīng)用描述XML文件)替代系統(tǒng)軟件設(shè)計文檔作為原始設(shè)計輸入。

      在包含傳統(tǒng)的IDL文件內(nèi)容,諸如模塊(module)、結(jié)構(gòu)體(struct)、枚舉類型(enum)等等之外,dseappgen又添加了兩個新的語法關(guān)鍵字——主題(topic)和消息域(domain),具體語法可以見表1。這兩個關(guān)鍵字描述了系統(tǒng)中有哪些主題和消息域,以及主題與哪個結(jié)構(gòu)體進行關(guān)聯(lián)。從而把主題和消息域的定義,從代碼轉(zhuǎn)移到了IDL文件。IDL文件還加入了@description的注解語法,可以為各種語法元素添加注解,這些注解經(jīng)過dseappgen處理后,可以生成為代碼注釋,以及軟件設(shè)計文檔,方便閱讀。

      表1 topic和domain關(guān)鍵字的基本語法

      應(yīng)用描述XML文件,該文件指明了引用哪個IDL文件,并且描述了該應(yīng)用具體用到了哪些主題,這些主題在哪些消息域中進行發(fā)布或是訂閱。dseappgen在獲取這些信息后,一方面可以從IDL中裁減出該應(yīng)用引用到的主題、消息域和接口,屏蔽掉未引用到的,從而加快代碼生成和編譯鏈接效率;另一方面,可以避免未引用主題和接口的干擾,防止應(yīng)用開發(fā)者錯誤使用非設(shè)計的主題和接口。應(yīng)用描述XML文件的基本格式見表2。其中,本文將主題的發(fā)布訂閱方式具體劃分為4種,即INPUT(只訂閱該主題),OUTPUT(只發(fā)布該主題),LOOPBACK(在同一消息域中既發(fā)布也訂閱該主題),CONVERT(在一個消息域中訂閱該主題,在另一消息域中發(fā)布該主題),方便設(shè)計者靈活運用。

      表2 應(yīng)用描述XML文件的基本格式

      這兩類設(shè)計輸入文件,IDL文件是面向系統(tǒng)全局,其內(nèi)容由系統(tǒng)內(nèi)所有應(yīng)用共享,而應(yīng)用描述XML文件是面向具體應(yīng)用,每個應(yīng)用有一份自己的應(yīng)用描述XML文件,這兩種文件實現(xiàn)了對DDS分布式系統(tǒng)的建模。

      3.2 語法解析

      語法解析是實現(xiàn)代碼自動生成的前提,是實現(xiàn)用IDL和應(yīng)用描述XML文件替代設(shè)計文檔的關(guān)鍵技術(shù)。需要用語法解析技術(shù)解析出的元信息包括模塊(module)、結(jié)構(gòu)體(struct)、結(jié)構(gòu)體元素(struct element)、枚舉(enum)、枚舉元素(enum element)、內(nèi)置類型(如short、long等)、主題(topic)、消息域(domain)、應(yīng)用名等,并且要解析出這些元信息之間的關(guān)聯(lián)關(guān)系。

      其中,應(yīng)用、應(yīng)用和主題之間的關(guān)聯(lián)關(guān)系可以使用XML解析工具進行解析。而描述其它元信息及關(guān)聯(lián)關(guān)系的IDL文件,使用的是經(jīng)過關(guān)鍵字擴展后的IDL語法,這里采用ANTLR4進行語法分析,該工具在語法分析領(lǐng)域應(yīng)用廣泛[11,12]。核心的語法結(jié)構(gòu)使用廣泛應(yīng)用的巴科斯范式(Backus-Naur form[13],BNF)表示見表3。

      表3 語法結(jié)構(gòu)核心部分的巴科斯范式

      ANTLR4可以對語法元素進行分析和提取,但語法樹的數(shù)據(jù)結(jié)構(gòu)需要自行設(shè)計。dseappgen的語法樹主要包括語法元素哈希表,以及表征語法元素關(guān)聯(lián)關(guān)系的樹形鏈表。語法樹構(gòu)建成功之后,就可以支撐后續(xù)步驟——代碼生成——進行語法元素查找和遍歷。

      3.3 代碼生成

      在獲取了各種必要的語法元信息之后,就需要對具體的DDS應(yīng)用進行代碼生成。代碼生成從技術(shù)上來說,是通過一種模板引擎,將代碼模板中待替換的內(nèi)容,替換為相應(yīng)的信息,在本文所研究的場景中,即替換為各種由語法解析分析出來的語法元信息。這里選用的模板引擎是StringTemplate,該引擎靈活高效,簡單易用,而且能夠滿足代碼遞歸生成的需求,該引擎經(jīng)常和ANTLR4配合使用。

      在選定代碼生成引擎之后,需要對代碼模板的結(jié)構(gòu)進行設(shè)計。需要考慮的問題有目標生成的代碼結(jié)構(gòu),以及暴露給用戶的C++API。圖5展示了代碼模板的基本結(jié)構(gòu)。在代碼模板中,自動生成了與應(yīng)用描述XML文件內(nèi)容相對應(yīng)的參與者、主題、發(fā)布者、訂閱者等各種DDS的通信概念實體,從而免去了開發(fā)者手動編寫的工作量,而且讓開發(fā)者完全不需要了解這些具體概念。并且這些API將主題名具化到函數(shù)名里(圖5中“xxx”表示的是某個主題的名字),從而可以讓C++編譯器協(xié)助檢查,尤其是在使用IDE開發(fā)過程中,會有函數(shù)名自動提示,大大降低了開發(fā)者出錯風(fēng)險。與該應(yīng)用無關(guān)的主題不會出現(xiàn)在生成的API中,也防止了開發(fā)者錯誤發(fā)布或訂閱與其無關(guān)的主題。

      圖5 代碼模板的基本結(jié)構(gòu)

      對于消息結(jié)構(gòu)體的正反序列化代碼,依然調(diào)用DDS自帶的生成工具(ddsgen)進行生成。不過由于每個應(yīng)用只引用了IDL文件中的部分結(jié)構(gòu)體,所以為了避免生成冗余的正反序列化代碼,這里通過對語法樹中語法元素的依賴關(guān)系進行分析,只提取引用到的必要的語法信息,生成新的精簡過的IDL文件,然后再交給ddsgen處理。其中,語法元素的依賴關(guān)系分析用到了DAG(有向無環(huán)圖)的拓撲排序算法[14]。

      代碼生成還包括各種增強功能,以及CMake編譯文件和配置文件的生成等等。

      3.4 Lua解釋器

      Lua是一種可以動態(tài)解釋執(zhí)行的腳本語言,它具有輕量、方便嵌入集成、執(zhí)行速度快等優(yōu)點,在許多大型軟件中作為嵌入式腳本語言存在。這里,引入Lua腳本語言,進一步提高DDS分布式系統(tǒng)的開發(fā)效率,并賦予DDS應(yīng)用隨時編寫隨時運行的動態(tài)執(zhí)行能力,方便分布式系統(tǒng)的功能調(diào)試和仿真,尤其適用于功能原型的快速搭建,以及消息激勵器、算法仿真器等模擬器的開發(fā)。

      Lua腳本由Lua解釋器加載執(zhí)行,本文將Lua解釋器內(nèi)嵌到DDS應(yīng)用中,并將DDS消息發(fā)布訂閱相關(guān)API以Lua語言的形式暴露給用戶。這里需要解決的主要問題是Lua對DDS C++接口的封裝,Lua數(shù)據(jù)結(jié)構(gòu)與DDS消息結(jié)構(gòu)體的轉(zhuǎn)換,暴露給用戶的Lua API的設(shè)計。圖5也展示了DDS應(yīng)用中Lua相關(guān)部分的代碼模板結(jié)構(gòu)。代碼模板將發(fā)布者和訂閱者封裝成Lua對象,并通過Lua Table和C++結(jié)構(gòu)的轉(zhuǎn)換實現(xiàn)消息在Lua API和DDS C++API之間的傳遞,用戶只需要獲取Lua封裝的相應(yīng)主題的發(fā)布者和訂閱者對象,即可實現(xiàn)消息的發(fā)布訂閱操作。

      3.5 其它增強功能

      考慮到DDS應(yīng)用開發(fā)者在日常開發(fā)過程中的一些常用需求,又在生成的代碼中加入了一些增強功能。

      3.5.1 Json字符串與DDS消息的轉(zhuǎn)換

      開發(fā)者經(jīng)常需要通過打印消息內(nèi)容進行功能調(diào)試,然而實際系統(tǒng)中用到的DDS消息往往字段較多,逐字段打印會加大開發(fā)者工作量。前面通過語法解析,已經(jīng)獲取了DDS消息每個字段的名稱和類型,因此可以通過代碼生成的方法自動生成DDS消息與Json字符串之間的互相轉(zhuǎn)換代碼(這里用到了C++Json庫nlohmann)。這樣,需要打印消息內(nèi)容時就可以將DDS消息以格式化良好的Json字符串形式打印,大大減輕了開發(fā)者的工作負擔(dān)。另外,開發(fā)者也可以在代碼中使用Json字符串作為DDS消息的字面值,然后轉(zhuǎn)換為DDS消息結(jié)構(gòu)體,進而進行消息發(fā)布,這樣具有更好的可讀性。

      3.5.2 Http Server的嵌入

      DDS應(yīng)用多是運行在服務(wù)器的后臺程序,若想與DDS應(yīng)用在運行時進行交互,會比較困難,因此在DDS應(yīng)用中嵌入了輕量級的Http Server——Boost Beast[15],它允許用戶通過瀏覽器加載Web頁面,執(zhí)行Javascript代碼,可以進行HTTP請求應(yīng)答通信,支持WebSocket,當用戶有運行時交互或者圖形化交互需求時,可以開啟該輕量級Http Server。

      3.5.3 消息記錄和統(tǒng)計

      DDS分布式系統(tǒng)中往往記錄DDS消息,以方便對系統(tǒng)進行數(shù)據(jù)分析或故障排查。由于在代碼生成中已經(jīng)掌控了DDS消息的發(fā)布和訂閱,因此在發(fā)布和訂閱過程中加入對消息的記錄和統(tǒng)計。消息記錄的內(nèi)容包括消息Json字符串、應(yīng)用名稱、發(fā)布訂閱時間等,使用Elasticsearch作為記錄存儲數(shù)據(jù)庫,以支持快速高效的記錄查詢。消息統(tǒng)計主要統(tǒng)計的是消息的發(fā)布訂閱次數(shù)、頻率,通過Http Server開放了相應(yīng)Restful Api,支持當前流行的數(shù)據(jù)采集平臺Prometheus進行訪問采集。

      圖6給出了dseappgen編譯生成的可執(zhí)行文件內(nèi)部各功能的組成、協(xié)作以及與外部的交互。

      圖6 編譯生成的可執(zhí)行文件內(nèi)部功能結(jié)構(gòu)

      4 簡單實例

      這里以一個簡單的發(fā)布訂閱實例說明使用dseappgen編譯器后給DDS分布式系統(tǒng)開發(fā)帶來的便利。

      為了實現(xiàn)如圖7所示的發(fā)布訂閱通信功能,表4是該DDS分布式系統(tǒng)的IDL文件,表5是應(yīng)用pubtest的應(yīng)用描述XML文件,表6是應(yīng)用subtest的應(yīng)用描述XML文件,這3個文件由設(shè)計者編寫。

      圖7 一個簡單的發(fā)布訂閱通信實例

      表4 示例IDL文件test.idl

      表5 示例應(yīng)用pubtest的應(yīng)用描述XML文件pubtest.xml

      表6 示例應(yīng)用subtest的應(yīng)用描述XML文件subtest.xml

      然后設(shè)計者使用表7中命令調(diào)用dseappgen生成兩個可執(zhí)行程序pubtest和subtest(dseappgen也可以生成供C++開發(fā)者使用的動態(tài)庫,這里以生成Lua解釋器為例)。

      表7 使用dseappgen編譯生成可執(zhí)行程序

      接下來,開發(fā)者可以為pubtest和subtest撰寫Lua腳本實現(xiàn)消息的發(fā)布訂閱。發(fā)布Lua腳本見表8,訂閱Lua腳本見表9。

      表8 示例應(yīng)用pubtest的腳本pubtest.lua

      表9 示例應(yīng)用subtest的腳本subtest.lua

      分別啟動pubtest和subtest,將會看到subtest打印出pubtest發(fā)布的消息。從該示例可以直觀看出,設(shè)計者和開發(fā)者的工作是解耦的。設(shè)計者使用IDL和應(yīng)用描述XML文件就完成了整個分布式系統(tǒng)的應(yīng)用組成和消息互聯(lián)的設(shè)計,也就是完成了系統(tǒng)建模。通過dseappgen自動生成可執(zhí)行文件后,即可將工作轉(zhuǎn)移到開發(fā)者進行業(yè)務(wù)開發(fā)。dseappgen的代碼生成隱藏了DDS諸多概念,使得發(fā)布訂閱API變得非常簡單,即使并不了解DDS的各種概念,也可以簡單幾行代碼輕松實現(xiàn)發(fā)布訂閱通信。

      5 優(yōu)勢分析

      本文在實現(xiàn)改進的IDL編譯器dseappgen的基礎(chǔ)上,提出了新的DDS分布式系統(tǒng)快速開發(fā)流程,主要的優(yōu)勢有以下幾點:

      (1)賦予IDL語言進行分布式系統(tǒng)建模的能力,貫徹了基于模型的系統(tǒng)工程化(MBSE)思想,IDL文件和應(yīng)用描述XML文件完全建模了整個分布式系統(tǒng)的框架和通信結(jié)構(gòu),方便項目管理者從全局掌握項目拓撲情況。

      (2)傳統(tǒng)DDS分布式系統(tǒng)開發(fā)方式,主題和消息域的定義是侵入到代碼中的,無法實現(xiàn)設(shè)計和開發(fā)的解耦,而新的開發(fā)流程中,主題和消息域定義在IDL文件中,應(yīng)用的主題和消息域使用情況定義在應(yīng)用描述XML文件中,從而使得設(shè)計者和開發(fā)者完全解耦。

      (3)dseappgen生成的動態(tài)庫或Lua解釋器,只包含應(yīng)用描述XML文件中涉及到的主題的API,避免了開發(fā)者發(fā)布訂閱無關(guān)主題,方便項目管理者對主題訪問權(quán)限進行管理;而且API是具化到函數(shù)名中的,C++編譯器和Lua解釋器會協(xié)助檢查,防止開發(fā)者錯誤使用。

      (4)自動生成的動態(tài)庫和Lua解釋器,隱藏了DDS內(nèi)部復(fù)雜概念,使得發(fā)布訂閱API更加簡化,一行代碼實現(xiàn)通信,大大減少了開發(fā)者的代碼量,尤其是在動輒幾百個主題的大型項目中,大大提高了開發(fā)效率,降低了項目風(fēng)險。

      (5)Lua語言的嵌入,以及各種增強功能的加入,讓DDS應(yīng)用更適合快速開發(fā)、快速測試、快速仿真。

      (6)與當前熱門的機器人操作系統(tǒng)ROS2[16]相比,ROS2同樣使用DDS進行各應(yīng)用節(jié)點之間的通信,并且定義了參數(shù)、服務(wù)等概念,并提供了基于Python的腳本開發(fā)方式,加上開源社區(qū)為ROS2提供了豐富的自動化控制領(lǐng)域的第三方庫,是目前自動化領(lǐng)域設(shè)計仿真的首選框架。而本文更關(guān)注的是,為大型DDS分布式系統(tǒng)開發(fā),提供一種開發(fā)模式,讓設(shè)計者和開發(fā)者為完成項目更好更高效地進行合作,而ROS2并沒有在這方面提供相應(yīng)的解決方案,而且本文也提供了基于Lua的腳本開發(fā)方式。

      6 結(jié)束語

      本文結(jié)合當前DDS分布式系統(tǒng)工程開發(fā)現(xiàn)狀,對工程開發(fā)實踐中遇到的問題進行了分析,設(shè)計實現(xiàn)了改進的IDL編譯器dseappgen,并基于此工具提出DDS分布式系統(tǒng)開發(fā)流程,其中涉及到的技術(shù)手段包括語法解析、代碼生成、Lua解釋器等等。新方法貫徹了MBSE的思想,將工程實踐中設(shè)計和開發(fā)進行解耦合,一方面讓設(shè)計獨立于開發(fā),不需要將設(shè)計侵入代碼,另一方面也節(jié)省了開發(fā)者的很多工作量,尤其是Lua解釋器的引入,讓DDS應(yīng)用擁有了隨時修改隨時運行的能力,非常適用于算法驗證、消息激勵等模擬器的開發(fā)。

      目前dseappgen及其帶來的新開發(fā)模式在很多項目中開始了實踐和應(yīng)用,很大程度加快了項目的設(shè)計、開發(fā)、測試進度。

      為了繼續(xù)推進DDS分布式系統(tǒng)開發(fā)的工程化,未來還將基于本文提出的開發(fā)流程,構(gòu)建具有圖形界面的“低代碼[17]”開發(fā)平臺,可以用于工程的系統(tǒng)原型快速搭建,提升工程開發(fā)的自動化,降低工程開發(fā)的復(fù)雜性。

      猜你喜歡
      代碼生成開發(fā)者代碼
      Lustre語言可信代碼生成器研究進展
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      代碼生成技術(shù)在軟件開發(fā)中的應(yīng)用
      電子世界(2016年15期)2016-08-29 02:14:28
      16%游戲開發(fā)者看好VR
      CHIP新電腦(2016年3期)2016-03-10 13:06:42
      基于XML的代碼自動生成工具
      電子科技(2015年2期)2015-12-20 01:09:20
      iOS開發(fā)者調(diào)查
      電腦迷(2015年8期)2015-05-30 12:27:10
      iOS開發(fā)者調(diào)查
      電腦迷(2015年4期)2015-05-30 05:24:09
      安溪县| 新绛县| 正阳县| 昌宁县| 张掖市| 彭阳县| 昌图县| 如皋市| 岳池县| 嘉义市| 巍山| 融水| 西吉县| 普定县| 定结县| 遵义县| 白水县| 花莲市| 左云县| 桦川县| 土默特左旗| 怀仁县| 石家庄市| 新乐市| 吉木乃县| 会宁县| 中宁县| 淄博市| 准格尔旗| 隆林| 洮南市| 昌都县| 郸城县| 乌拉特前旗| 手游| 珠海市| 忻州市| 新兴县| 通榆县| 博乐市| 宁阳县|