夏盛明
福州理工學(xué)院計算與信息科學(xué)學(xué)院,福建福州 350000
智能機器人的普及應(yīng)用加速了智能機器人相關(guān)技術(shù)行業(yè)的快速發(fā)展。在智能家居應(yīng)用領(lǐng)域,市場上比較普遍的諸如教育類型機器人、清潔機器人、巡邏機器人等。隨著應(yīng)用的普及,生活中使用智能機器人工作的場景越來越多,智能機器人控制系統(tǒng)的應(yīng)用更加廣泛。機器人操作系統(tǒng)(robot operation system,ROS)[1-3]是一個機器人系統(tǒng)開發(fā)與研究平臺,大多數(shù)的開源機器人控制系統(tǒng)都使用ROS系統(tǒng)作為機器人高層控制算法的運行平臺。ROS系統(tǒng)是一個具有松耦合消息服務(wù)的分布式系統(tǒng),系統(tǒng)內(nèi)部各節(jié)點之間采用異步消息機制進(jìn)行相互間通信,部署新的機器人功能節(jié)點時,只需要功能節(jié)點與系統(tǒng)內(nèi)其他節(jié)點通過消息進(jìn)行數(shù)據(jù)交互,簡化了軟件系統(tǒng)的集成工作。ROS系統(tǒng)主要基于Linux系統(tǒng)運行。在一些移動機器人的嵌入式系統(tǒng)平臺中實現(xiàn)了通過message pipe[4]與ROS系統(tǒng)通信??蛻舳艘部赏ㄟ^網(wǎng)絡(luò)服務(wù)訪問ROS系統(tǒng)中的各項功能節(jié)點服務(wù),例如直接采用ROS Message[5]訪問ROS系統(tǒng)資源。但是,采用這種方式將使得智能機器人系統(tǒng)網(wǎng)絡(luò)服務(wù)處于一個開放訪問的狀態(tài),系統(tǒng)的安全性將無法得到保障,缺乏對客戶端有效的組織和管理,因此需要開發(fā)一個智能機器人遠(yuǎn)程協(xié)作系統(tǒng),協(xié)助客戶端對智能機器人的遠(yuǎn)程管理、參數(shù)設(shè)置、命令發(fā)布等。為了簡化討論,本文只涉及了智能機器人運動最基礎(chǔ)的功能,包括建圖、導(dǎo)航、定位、物體識別等。智能機器人系統(tǒng)的整體架構(gòu)如圖1所示。
智能機器人系統(tǒng)底層是硬件層,包含了機器人硬件所集成的各類傳感器,例如慣性導(dǎo)航單元、超聲波測距儀、光學(xué)攝像頭、激光掃描儀、電驅(qū)、運動部件等等。在硬件層之上是實時操作系統(tǒng)層(real time operating system,RTOS),通常使用uC/OS-II[6-9],RT-Thread[10-12]開源嵌入式實時系統(tǒng)去驅(qū)動底層硬件,獲取傳感器數(shù)據(jù)等。在RTOS系統(tǒng)層之上是Linux系統(tǒng)層,Linux系統(tǒng)層運行著基本的系統(tǒng)服務(wù),諸如網(wǎng)絡(luò)服務(wù)、消息中間件服務(wù)、驅(qū)動管理等。在Linux系統(tǒng)層之上是ROS系統(tǒng),ROS系統(tǒng)運行著智能機器人各類算法應(yīng)用,例如建圖、定位、導(dǎo)航以及智能機器人的遠(yuǎn)程協(xié)作系統(tǒng)。ROS系統(tǒng)是一個開放的機器人系統(tǒng)開發(fā)平臺,擁有豐富的機器人控制算法應(yīng)用,ROS系統(tǒng)中各模塊通過發(fā)布/訂閱機制,使用異步消息進(jìn)行相互通信。遠(yuǎn)程協(xié)作系統(tǒng)位于ROS系統(tǒng)中,通過消息與其他智能機器人算法模塊進(jìn)行通信,通過互聯(lián)網(wǎng)絡(luò)與客戶端進(jìn)行通信,進(jìn)而實現(xiàn)客戶端遠(yuǎn)程控制機器人運動。具體實現(xiàn)為遠(yuǎn)程協(xié)作系統(tǒng)使用基于ROS服務(wù),與ROS系統(tǒng)中各個智能機器人算法應(yīng)用模塊通信,同時使用google的遠(yuǎn)程方法調(diào)用框架(google remote procedure calls, gRPC)[13-14]實現(xiàn)網(wǎng)絡(luò)服務(wù)通信,為客戶端提供智能機器人遠(yuǎn)程網(wǎng)絡(luò)訪問支持。
gRPC是一個現(xiàn)代開源高性能遠(yuǎn)程程序調(diào)用框架,是google公司開發(fā)的用于網(wǎng)絡(luò)節(jié)點間開發(fā)數(shù)據(jù)傳輸服務(wù)的網(wǎng)絡(luò)框架,支持多種不同類型語言開發(fā),支持雙向通信,可以在分布式網(wǎng)絡(luò)環(huán)境中運行,可以有效地連接網(wǎng)絡(luò)服務(wù),適用于分布式計算場景,將設(shè)備、移動應(yīng)用程序和瀏覽器與后端服務(wù)連接起來,例如金融系統(tǒng)運用[15]、呼叫平臺[14]系統(tǒng)等。通過使用gRPC可以實現(xiàn)支持不同語言編寫的客戶端通信,實現(xiàn)松耦合的系統(tǒng)架構(gòu),在分布式系統(tǒng)中應(yīng)用[16-17]越來越廣泛。
遠(yuǎn)程協(xié)作系統(tǒng)可實現(xiàn)用戶通過客戶端管理智能機器人的運動。遠(yuǎn)程協(xié)作系統(tǒng)與智能機器人算法模塊通過ROS Message消息框架進(jìn)行通信。ROS Message消息框架是一種異步消息傳輸框架。ROS系統(tǒng)平臺內(nèi)的節(jié)點通過發(fā)布一個消息主題,用于固定頻率發(fā)布消息,其他節(jié)點則通過訂閱這個消息主題接收消息;同時,ROS系統(tǒng)平臺內(nèi)的節(jié)點也可訂閱消息主題,用于接收其他節(jié)點發(fā)布的命令消息、控制參數(shù)等。消息的發(fā)布和接收可以是一對多的關(guān)系,即單個消息發(fā)布節(jié)點對應(yīng)多個消息接收節(jié)點。對ROS系統(tǒng)中的建圖、定位、導(dǎo)航等機器人運動相關(guān)算法模塊,遠(yuǎn)程協(xié)作系統(tǒng)需要訪問這些模塊服務(wù),需要訂閱這些模塊發(fā)布的消息主題,也需要能夠向這些模塊的控制消息主題發(fā)布命令消息,進(jìn)而控制機器人運動。遠(yuǎn)程協(xié)作系統(tǒng)與ROS系統(tǒng)模塊、客戶端的消息服務(wù)架構(gòu)如圖2所示。每個模塊可能發(fā)布不止一個消息主題,圖2簡化了ROS系統(tǒng)模塊使用的消息主題,使用一個消息主題代表模塊發(fā)布的消息主題集合,使用一個控制主題代表模塊接收命令的消息主題集合。
遠(yuǎn)程協(xié)作系統(tǒng)可對接收到的消息進(jìn)行數(shù)據(jù)緩存。通過異步方式的消息傳遞,遠(yuǎn)程協(xié)作系統(tǒng)與ROS系統(tǒng)中模塊維持著松耦合的關(guān)系。通過此消息架構(gòu),遠(yuǎn)程協(xié)作系統(tǒng)可以獲得來自模塊發(fā)布的攝像頭圖像、地圖圖像、定位位置、運動姿態(tài)、障礙物信息等。
遠(yuǎn)程協(xié)作系統(tǒng)需要提供支持客戶端網(wǎng)絡(luò)訪問的功能。遠(yuǎn)程協(xié)作系統(tǒng)與客戶端可通過網(wǎng)絡(luò)進(jìn)行通信,網(wǎng)絡(luò)可以是無線局域網(wǎng)(Wi-Fi)。客戶端與遠(yuǎn)程協(xié)作系統(tǒng)數(shù)據(jù)通信的方式為雙向通信,遠(yuǎn)程協(xié)作系統(tǒng)可以將智能機器人的狀態(tài)數(shù)據(jù)發(fā)送給客戶端,客戶端將命令發(fā)送給遠(yuǎn)程協(xié)作系統(tǒng)。對于管理ROS系統(tǒng)模塊命令數(shù)據(jù)消息,遠(yuǎn)程協(xié)作系統(tǒng)將進(jìn)行消息數(shù)據(jù)結(jié)構(gòu)封裝,進(jìn)而發(fā)送給ROS系統(tǒng)中模塊進(jìn)行處理。
一些智能機器人系統(tǒng)的控制協(xié)議棧自身支持網(wǎng)絡(luò)通信,例如Ardupilot[18-20]飛控系統(tǒng)協(xié)議棧,可通過Mavlink[21-22]消息協(xié)議與遠(yuǎn)程地面控制系統(tǒng)進(jìn)行通信。在Ardupilot中,控制協(xié)議棧系統(tǒng)將對Mavlink消息進(jìn)行解析,獲得遠(yuǎn)程控制命令,控制參數(shù),進(jìn)行相應(yīng)的智能無人系統(tǒng)控制。在這一過程中,Ardupilot 飛控系統(tǒng)協(xié)議棧運行在實時系統(tǒng)環(huán)境下,對遠(yuǎn)程地面控制系統(tǒng)發(fā)出的命令可以很快做出響應(yīng)。由于需要對無人系統(tǒng)進(jìn)行實時控制,主要用于底層姿態(tài)控制、速度控制、位置控制等,并不支持人工智能高層應(yīng)用,通常工作在智能機器人控制系統(tǒng)的底層,在其上可以添加智能應(yīng)用層用于高層控制,而遠(yuǎn)程協(xié)作系統(tǒng)基于ROS 系統(tǒng)服務(wù),主要為ROS系統(tǒng)中各個模塊提供可遠(yuǎn)程訪問的功能,由于ROS系統(tǒng)模塊可提供較為復(fù)雜的計算機視覺應(yīng)用,例如SLAM[23](同步定位與建圖)、3D重建、物體識別、物體追蹤等,遠(yuǎn)程協(xié)作系統(tǒng)處于智能機器人系統(tǒng)的高層控制中,通常用于人工智能領(lǐng)域相關(guān)應(yīng)用的通信服務(wù)。
遠(yuǎn)程協(xié)作系統(tǒng)與客戶端通過設(shè)計網(wǎng)絡(luò)協(xié)議實現(xiàn)網(wǎng)絡(luò)通信。網(wǎng)絡(luò)協(xié)議包括了客戶端對智能機器人發(fā)出的各類控制命令和設(shè)置的系統(tǒng)參數(shù),獲取智能機器人運行狀態(tài)數(shù)據(jù)、攝像頭圖像、姿態(tài)數(shù)據(jù)、位移數(shù)據(jù)、地圖數(shù)據(jù)、電池數(shù)據(jù)等。存在多種方式實現(xiàn)網(wǎng)絡(luò)上不同系統(tǒng)間的數(shù)據(jù)交互,例如可使用TCP/IP網(wǎng)絡(luò)、Web服務(wù)、HTTP REST服務(wù)等。使用TCP/IP網(wǎng)絡(luò),需要智能機器人控制系統(tǒng)實現(xiàn)消息數(shù)據(jù)格式封裝、加密傳輸數(shù)據(jù)、解析傳輸數(shù)據(jù)、緩存?zhèn)鬏敂?shù)據(jù)等功能,工作量較大。Web服務(wù)基于XML格式數(shù)據(jù)傳輸,傳輸數(shù)據(jù)效率不高,對二進(jìn)制數(shù)據(jù)支持不夠友好。HTTP REST服務(wù)傳輸需要定義服務(wù)標(biāo)識、數(shù)據(jù)格式、數(shù)據(jù)封裝與解析,對雙向數(shù)據(jù)通信的傳輸支持有限。本文選擇基于gRPC網(wǎng)絡(luò)框架服務(wù)實現(xiàn)遠(yuǎn)程協(xié)作系統(tǒng)的網(wǎng)絡(luò)通信功能,可使用Protobuf 定義協(xié)議消息所需數(shù)據(jù)結(jié)構(gòu)以及服務(wù)接口,對于C++語言,通過Protoc可自動生成協(xié)議定義的方法與消息數(shù)據(jù)結(jié)構(gòu)代碼,提升了系統(tǒng)開發(fā)工作效率,對協(xié)議的修改只需修改Protobuf定義的文件內(nèi)容,并不需要修改生成代碼,Protobuf主要用在分布式系統(tǒng)節(jié)點間網(wǎng)絡(luò)服務(wù)交互的數(shù)據(jù)與服務(wù)的定義用途上[24]。
遠(yuǎn)程協(xié)作系統(tǒng)使用了網(wǎng)絡(luò)gRPC數(shù)據(jù)傳輸框架與ROS消息服務(wù),將ROS系統(tǒng)中智能機器人控制模塊狀態(tài)數(shù)據(jù)傳輸給客戶端,同時也將客戶端發(fā)送的命令與設(shè)置參數(shù)發(fā)送給ROS系統(tǒng)。遠(yuǎn)程協(xié)作系統(tǒng)通過使用gRPC框架與ROS系統(tǒng)消息服務(wù),為客戶端實現(xiàn)遠(yuǎn)程控制智能機器人運動提供了網(wǎng)絡(luò)服務(wù)支持。遠(yuǎn)程協(xié)作系統(tǒng)具體架構(gòu)如圖3所示。
遠(yuǎn)程協(xié)作系統(tǒng)消息服務(wù)架構(gòu)分為3層,從下至上分別是系統(tǒng)框架服務(wù)層、傳輸服務(wù)層、算法應(yīng)用層。
系統(tǒng)框架服務(wù)層包括了gRPC框架與ROS消息服務(wù)。遠(yuǎn)程協(xié)作系統(tǒng)使用gRPC框架開發(fā)訪問協(xié)議與客戶端通信,使用ROS消息服務(wù)與視覺算法應(yīng)用層節(jié)點之間傳輸數(shù)據(jù)。
傳輸服務(wù)層為視覺算法應(yīng)用層提供網(wǎng)絡(luò)數(shù)據(jù)傳輸服務(wù)與ROS系統(tǒng)消息服務(wù)。傳輸服務(wù)層包括了網(wǎng)絡(luò)服務(wù)節(jié)點與ROS消息服務(wù)節(jié)點。網(wǎng)絡(luò)服務(wù)節(jié)點管理與客戶端的通信,對網(wǎng)絡(luò)傳輸數(shù)據(jù)進(jìn)行封裝與解析。ROS消息服務(wù)節(jié)點用于監(jiān)聽ROS系統(tǒng)消息服務(wù)發(fā)布的消息數(shù)據(jù),并傳遞給視覺算法應(yīng)用層,或?qū)囊曈X算法應(yīng)用層獲得的數(shù)據(jù)發(fā)布到ROS消息服務(wù)系統(tǒng)中。
算法應(yīng)用層對從ROS消息服務(wù)節(jié)點獲得的ROS系統(tǒng)發(fā)布的服務(wù)消息進(jìn)行解析、格式轉(zhuǎn)換、數(shù)據(jù)封裝,通過傳輸服務(wù)層的網(wǎng)絡(luò)服務(wù)節(jié)點發(fā)送給客戶端。算法應(yīng)用層對從網(wǎng)絡(luò)服務(wù)節(jié)點獲得的遠(yuǎn)程客戶端發(fā)送的命令參數(shù)進(jìn)行解析、格式轉(zhuǎn)換、數(shù)據(jù)封裝,通過ROS消息服務(wù)節(jié)點發(fā)布到ROS消息服務(wù)系統(tǒng)中。
遠(yuǎn)程協(xié)作系統(tǒng)與客戶端數(shù)據(jù)通信方式采用了異步方式與同步方式結(jié)合。異步方式即發(fā)送數(shù)據(jù)方在發(fā)送的數(shù)據(jù)信息完成后立即返回,不會等待接收方的執(zhí)行結(jié)果,接收方在處理完成消息數(shù)據(jù)后,才會把處理結(jié)果通過回調(diào)的方式反饋給發(fā)送方。異步方式一般用于狀態(tài)數(shù)據(jù)傳輸,例如攝像頭圖像、位置信息、姿態(tài)信息等;同步方式即發(fā)送方將數(shù)據(jù)發(fā)送給接收方,并等待接收方將數(shù)據(jù)處理完成后返回。同步方式一般用于控制命令或參數(shù)設(shè)置等。
遠(yuǎn)程協(xié)作系統(tǒng)在異步處理消息的情況下,通過在ROS消息服務(wù)框架下注冊回調(diào)函數(shù)用于消息的接收。每當(dāng)ROS消息到來,回調(diào)函數(shù)將被調(diào)用一次用于接收消息后進(jìn)行處理或發(fā)送。當(dāng)存在ROS消息服務(wù)頻率過大的情況時,遠(yuǎn)程協(xié)作系統(tǒng)將對這類消息進(jìn)行緩存后批量處理,可將多個消息緩存后合并進(jìn)行處理或發(fā)送給客戶端,例如攝像頭圖像、姿態(tài)狀態(tài)數(shù)據(jù)等。但對一些消息只取最新獲得的數(shù)據(jù)進(jìn)行發(fā)送,例如電池狀態(tài)信息、心跳消息等。
遠(yuǎn)程協(xié)作系統(tǒng)在同步數(shù)據(jù)傳輸過程中,數(shù)據(jù)傳輸量較小,接收方處理時間較短,發(fā)送方很快可以獲得數(shù)據(jù)的發(fā)送與處理結(jié)果。同時,發(fā)送方維持著一個計時器,用于判斷在網(wǎng)絡(luò)狀態(tài)不佳的情況下,數(shù)據(jù)傳輸是否超出響應(yīng)時間范圍,進(jìn)而判斷數(shù)據(jù)傳輸是否失敗,是否需要重傳數(shù)據(jù)。
遠(yuǎn)程協(xié)作系統(tǒng)與客戶端之間的網(wǎng)絡(luò)服務(wù)采用雙向連接方式??蛻舳伺c遠(yuǎn)程協(xié)作系統(tǒng)都存在網(wǎng)絡(luò)服務(wù)節(jié)點,即Service Node??蛻舳讼认蜻h(yuǎn)程協(xié)作系統(tǒng)發(fā)起建立TCP連接請求,告知自身的網(wǎng)絡(luò)IP地址與端口信息,當(dāng)收到請求后,遠(yuǎn)程協(xié)作系統(tǒng)完成客戶端的連接請求,建立從客戶端到遠(yuǎn)程協(xié)作系統(tǒng)的數(shù)據(jù)連接。通過這一步驟,遠(yuǎn)程協(xié)作系統(tǒng)獲得了客戶端的網(wǎng)絡(luò)IP 地址,隨后發(fā)起向客戶端的TCP連接請求,客戶端收到連接請求后,完成遠(yuǎn)程協(xié)作系統(tǒng)的連接。至此,數(shù)據(jù)網(wǎng)絡(luò)服務(wù)的雙向連接建立完成。采用此種通信方式,客戶端發(fā)送參數(shù),控制命令鏈路與遠(yuǎn)程協(xié)作系統(tǒng)的發(fā)送傳感器數(shù)據(jù)鏈路完全區(qū)分。遠(yuǎn)程協(xié)作系統(tǒng)可主動推送智能機器人系統(tǒng)上的各類傳感器數(shù)據(jù),例如攝像頭數(shù)據(jù)、慣性導(dǎo)航單元數(shù)據(jù),這類數(shù)據(jù)發(fā)送量較大,發(fā)送頻率較高,單獨作為一個網(wǎng)絡(luò)鏈路發(fā)送,簡化客戶端處理數(shù)據(jù)連接流程,也簡化了網(wǎng)絡(luò)數(shù)據(jù)通信的處理實現(xiàn)機制。
數(shù)據(jù)采用加密傳輸機制。為了提升智能機器人系統(tǒng)網(wǎng)絡(luò)安全性,防止未經(jīng)授權(quán)認(rèn)證的用戶監(jiān)聽系統(tǒng)數(shù)據(jù)或與遠(yuǎn)程協(xié)作系統(tǒng)連接,遠(yuǎn)程協(xié)作系統(tǒng)在網(wǎng)絡(luò)上采用gRPC,使用SSL加密傳輸?shù)姆绞竭M(jìn)行傳輸數(shù)據(jù)[25]。目前,遠(yuǎn)程協(xié)作系統(tǒng)只支持與處于相同的局域網(wǎng)絡(luò)客戶端連接,如圖4所示,遠(yuǎn)程協(xié)作系統(tǒng)為了實現(xiàn)客戶端對ROS服務(wù)開放性訪問的安全性,在運行ROS系統(tǒng)平臺的Linux系統(tǒng)中,存在一個gRPC Service Node進(jìn)程服務(wù)用于實現(xiàn)gRPC服務(wù)端功能,該進(jìn)程擁有較高的系統(tǒng)權(quán)限,只能由Linux系統(tǒng)管理員管理。gRPC Service Node進(jìn)程通過ROS系統(tǒng)消息服務(wù)API可注冊ROS系統(tǒng)中的消息主題,獲取ROS系統(tǒng)中發(fā)布的消息,同時也可通過向ROS系統(tǒng)中注冊消息發(fā)布主題,向ROS系統(tǒng)中傳遞來自客戶端的命令消息。gRPC Service Node進(jìn)程會鑒別來自客戶端的gRPC client連接請求的身份,只有在客戶端身份認(rèn)證通過后,連接才會建立,隨后數(shù)據(jù)通信也采用SSL加密傳輸機制,防止信息泄露。遠(yuǎn)程協(xié)作系統(tǒng)連接客戶端gRPC Service Node 的過程與此類似。通過這一方式,避免了任意用戶對ROS系統(tǒng)服務(wù)的訪問,提升了系統(tǒng)的安全性。
系統(tǒng)通過protobuf定義服務(wù)端與客戶端通信接口,在protobuf中定義了各類服務(wù)的結(jié)構(gòu)體與遠(yuǎn)程方法調(diào)用的函數(shù)接口。
服務(wù)端:
[1]注冊ROS系統(tǒng)中的消息主體(發(fā)布與接收)[2]監(jiān)聽來自客戶端的連接請求a)接收到連接,認(rèn)證客戶端身份, 如果身份認(rèn)證通過,建立連接,b)否則,關(guān)閉客戶端連接請求[3]向客戶端建立同步命令傳輸網(wǎng)絡(luò)連接[4] Loop 接收客戶端的命令消息,轉(zhuǎn)發(fā)給ROS系統(tǒng)處理 向客戶端推送系統(tǒng)狀態(tài)信息,客戶端命令執(zhí)行結(jié)果 end[5]客戶端連接退出[6]服務(wù)端關(guān)閉客戶端連接
客戶端
[1]發(fā)起與服務(wù)端連接[2]通過身份認(rèn)證[3]Loop 發(fā)送命令 接收ROS系統(tǒng)消息 end [4]客戶端關(guān)閉連接
本文介紹了應(yīng)用于智能機器人的遠(yuǎn)程協(xié)作系統(tǒng)的設(shè)計與實現(xiàn)方案。遠(yuǎn)程協(xié)作系統(tǒng)為人工智能系統(tǒng)的應(yīng)用提供了支持。通過遠(yuǎn)程協(xié)作系統(tǒng),實現(xiàn)了客戶端遠(yuǎn)程對智能機器人運動進(jìn)行管理。該系統(tǒng)可支持不同類型的客戶端,例如,基于PC電腦的地面站系統(tǒng)或基于Android、IOS等移動平臺的應(yīng)用,在智能家居等領(lǐng)域具有一定的應(yīng)用參考價值。