李夢(mèng)男 邵振洲 渠 瀛 施智平 關(guān) 永 魏洪興
1(首都師范大學(xué)信息工程學(xué)院 北京 100048) 2(輕型工業(yè)機(jī)器人與安全驗(yàn)證北京市重點(diǎn)實(shí)驗(yàn)室 北京 100088) 3(成像技術(shù)北京市高精尖創(chuàng)新中心 北京 100048) 4(田納西大學(xué)工程學(xué)院 諾克斯維爾 37996) 5(北京航空航天大學(xué)機(jī)械工程及自動(dòng)化學(xué)院 北京 100083)
當(dāng)今,隨著服務(wù)機(jī)器人基礎(chǔ)工作的不斷完善,人機(jī)交互方向的研究日益成為機(jī)器人領(lǐng)域的熱門(mén)。傳統(tǒng)的搖桿、按鍵等交互方式具有操作繁瑣、不靈活、接口沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)等缺點(diǎn),已不能滿足于當(dāng)今的智能服務(wù)機(jī)器人。機(jī)器人通信框架也可稱為機(jī)器人操作系統(tǒng)的ROS一定程度上解決了以上機(jī)器人軟件開(kāi)發(fā)與人機(jī)交互中的痛點(diǎn)問(wèn)題,因?yàn)槠渫昝乐С指鞣N人機(jī)交互的傳感器設(shè)備和擁有豐富的算法支撐。但是目前流行的人機(jī)交互方式存在著一些問(wèn)題,例如Kinect和RealSense等視覺(jué)體感設(shè)備容易受周?chē)h(huán)境的影響而使識(shí)別準(zhǔn)確率下降;LeapMotion等手勢(shì)識(shí)別控制器的交互方式局限性很大;語(yǔ)音識(shí)別又會(huì)受到距離、周?chē)须s環(huán)境的影響等[1-3]。因這些人機(jī)交互方式的魯棒性、實(shí)時(shí)性、自適應(yīng)性等方面均存在一定的缺陷,所以目前并沒(méi)有得到很好的推廣應(yīng)用。
相比以上各種人機(jī)交互的傳感設(shè)備,集語(yǔ)音識(shí)別、攝像頭、陀螺儀、手勢(shì)識(shí)別、定位導(dǎo)航等多種傳感器于一體的智能移動(dòng)設(shè)備作為服務(wù)機(jī)器人的人機(jī)交互終端更具有一定優(yōu)勢(shì)[4-5]。因其集成度高可省去一些交互設(shè)備,節(jié)約成本,還可為基于云概念的機(jī)器人提供多遠(yuǎn)程終端的支持,提高云端的擴(kuò)展性[6],例如導(dǎo)游機(jī)器人、點(diǎn)餐機(jī)器人等。因此,將移動(dòng)終端系統(tǒng)與ROS互聯(lián)通信,對(duì)于出現(xiàn)在家庭、銀行、餐飲、娛樂(lè)、教育等場(chǎng)所的服務(wù)機(jī)器人有著很好的應(yīng)用前景[7-9]。
目前,一些組織(包括Google,Willow Garage等)已經(jīng)作出了很多貢獻(xiàn),主要解決移動(dòng)終端領(lǐng)域使用率最高的Android和iOS設(shè)備與目前流行的機(jī)器人系統(tǒng)ROS間的通信問(wèn)題。其中,rosbridge協(xié)議的提出是為了讓非ROS環(huán)境可與ROS節(jié)點(diǎn)進(jìn)行通信,其基本思路是通過(guò)一個(gè)中間橋梁WebSocket來(lái)聯(lián)系通信雙方各自的協(xié)議,但此種方式存在著通信過(guò)程冗余、效率低、通信安全漏洞、平臺(tái)兼容性等問(wèn)題[10]。因此,在移動(dòng)平臺(tái)本地系統(tǒng)實(shí)現(xiàn)ROS環(huán)境是一種很好的解決方式,不僅可以提高與ROS通信的效率,還會(huì)增加人機(jī)交互系統(tǒng)的擴(kuò)展性。當(dāng)前,iOS設(shè)備與ROS交互的ROSPod (2015)并沒(méi)有完全實(shí)現(xiàn)ROS通信的全部功能,而且穩(wěn)定性不好[11]。另外一種實(shí)現(xiàn)方式是基于在Google I/O大會(huì)上發(fā)布的一個(gè)純java實(shí)現(xiàn)ROS基本通信組件的客戶端庫(kù)rosjava[12]。因基于該庫(kù)開(kāi)發(fā)的android_core功能包具有很好的穩(wěn)定性,使其成為了在Android移動(dòng)終端構(gòu)建與ROS機(jī)器人通信應(yīng)用的重要組件。
然而,基于rosjava的Android應(yīng)用功能包集合android_core雖然提供了ROS中基本的發(fā)布訂閱通信方式,但是在應(yīng)對(duì)交互過(guò)程中需要機(jī)器人不斷反饋其任務(wù)執(zhí)行狀態(tài)信息給移動(dòng)終端以及移動(dòng)終端需要執(zhí)行任務(wù)搶占時(shí),此通信方式便不滿足要求了。此外,該通信方式?jīng)]有網(wǎng)絡(luò)異常實(shí)時(shí)檢測(cè)功能,在遠(yuǎn)程人機(jī)交互方面存在著通信安全隱患。例如機(jī)器人正執(zhí)行Android移動(dòng)終端發(fā)送的命令時(shí),網(wǎng)絡(luò)突然中斷,與移動(dòng)終端失去聯(lián)系的ROS機(jī)器人就會(huì)面臨失控的危險(xiǎn)。因此,基于rosjava研究一種介于Android和ROS間的支持任務(wù)搶占與中間狀態(tài)信息反饋,并且可以實(shí)時(shí)監(jiān)測(cè)兩者連接狀態(tài)的可靠通信方式顯得尤為重要。
本文一方面設(shè)計(jì)了一種實(shí)時(shí)監(jiān)測(cè)Android與ROS間連接狀態(tài)的功能模塊“CheckNodeConnection”,在建立TCP/IP協(xié)議連接的應(yīng)用層加入心跳包反饋機(jī)制,使得ROS機(jī)器人端時(shí)刻知道Android移動(dòng)終端的連接狀態(tài),在任務(wù)執(zhí)行過(guò)程突然通信中斷時(shí)可進(jìn)入預(yù)設(shè)的安全模式,增加了人機(jī)交互的安全性與友好性。另一方面,基于rosjava為Android移動(dòng)終端開(kāi)發(fā)了匹配ROS Actionlib中“ROS Action Protocol”的通信機(jī)制“RosActionOnAndroid”,滿足了交互過(guò)程中移動(dòng)終端需要不斷獲取機(jī)器人的狀態(tài)反饋信息,以及可按優(yōu)先級(jí)進(jìn)行任務(wù)搶占的需求。
ROS運(yùn)行于主操作系統(tǒng)之上,提供了一種分布式通信框架,由各自獨(dú)立的功能節(jié)點(diǎn)(Node)組成。節(jié)點(diǎn)作為處理任務(wù)計(jì)算的進(jìn)程,在不同的系統(tǒng)任務(wù)中可依據(jù)工作需求調(diào)整其承載的功能粒度,極大地增加了系統(tǒng)的模塊化和代碼的封裝程度[13]。各節(jié)點(diǎn)間通過(guò)發(fā)布/訂閱消息模型進(jìn)行異步通信,通信的雙方節(jié)點(diǎn)并不清楚對(duì)等端的存在,連接工作均交給中間管理者ROS Master。每個(gè)節(jié)點(diǎn)的信息都要在ROS Master上進(jìn)行注冊(cè),可以將其看作一個(gè)查詢表,為各個(gè)節(jié)點(diǎn)提供類(lèi)似DNS的服務(wù),即各個(gè)節(jié)點(diǎn)的主機(jī)名、IP地址、端口號(hào)等信息。其具體存儲(chǔ)是在ROS Master內(nèi)部的Parameter Server上,用戶可通過(guò)封裝有XMLRPC的接口進(jìn)行存儲(chǔ)和檢索其中的信息。其中所有的資源(包括node、topic、service、parameter等)都是在某個(gè)命名空間中使用特定的Name進(jìn)行了定義。計(jì)算圖層中的Name在ROS的封裝體系中非常重要,是各資源間的連接橋梁,還保障了不同資源間的Name不會(huì)沖突[14]。
ROS的分布式通信框架是一種點(diǎn)對(duì)點(diǎn)P2P(Peer-to-Peer)的松耦合的網(wǎng)絡(luò)連接的處理架構(gòu),其主要的數(shù)據(jù)傳輸方式包括基于話題(Topic)的異步數(shù)據(jù)流通信、基于服務(wù)(Service)的請(qǐng)求回應(yīng)模型以及基于遠(yuǎn)程過(guò)程調(diào)用(RPC)的節(jié)點(diǎn)管理器Master等[15]。根據(jù)通信協(xié)議進(jìn)行分類(lèi)主要分為兩種:
(1) XML-RPC協(xié)議:包括ROS Master和ROS Parameters(搭載在Master上的參數(shù)服務(wù)器)。XML-RPC的全稱是XML Remote Procedure Call,中文名叫作XML遠(yuǎn)程過(guò)程調(diào)用,是Apache軟件基金會(huì)為解決分布式計(jì)算問(wèn)題而創(chuàng)作的一種通信協(xié)議。在該協(xié)議的Server端綁定各種供用戶使用的方法,Client端可以依據(jù)該協(xié)議來(lái)遠(yuǎn)程調(diào)用Server端的方法。具有跨平臺(tái)、分布式、XML作為傳輸信息格式、多種數(shù)據(jù)結(jié)構(gòu)等特點(diǎn)。其工作流程如圖1所示。
圖1 XML-RPC工作流程圖
(2) TCPROS協(xié)議:基于TCP協(xié)議的ROS應(yīng)用層數(shù)據(jù)協(xié)議,用于解析Topic和Service的數(shù)據(jù)流。TCPROS為了保證通信雙方的傳輸類(lèi)型一致,會(huì)在協(xié)議頭中給出Topic名的md5 hash算法處理之后的值,每次改動(dòng)消息類(lèi)型時(shí),md5的值都會(huì)隨之改變,這樣就避免了新舊消息類(lèi)型不一致的問(wèn)題。TCPROS的協(xié)議頭所占字節(jié)數(shù)一般是固定的,其中seq可以檢測(cè)是否丟包,stamp可以檢測(cè)消息實(shí)時(shí)性。該協(xié)議還為用戶提供了一些底層傳輸設(shè)置接口,例如Subscriber中的選項(xiàng)tcp_nodelay如果為1,便給socket設(shè)置TCP_NODELAY選項(xiàng),降低延遲,但可能會(huì)降低傳輸效率。另外Service Client選項(xiàng)的persistent設(shè)置為1,則該service的鏈接會(huì)開(kāi)放多個(gè)請(qǐng)求通道。
目前,ROS和Android實(shí)現(xiàn)通信的方式主要有兩類(lèi): rosbridge和rosjava。
1.2.1rosbridge
rosbridge協(xié)議的提出是為了讓非ROS環(huán)境可與ROS節(jié)點(diǎn)進(jìn)行通信,基本思想是通過(guò)一個(gè)中間橋梁WebSocket來(lái)聯(lián)系通信雙方各自的協(xié)議。對(duì)于Android與ROS通信來(lái)講,可在Android平臺(tái)實(shí)現(xiàn)WebSocket,其以JSON格式的API為非ROS環(huán)境提供ROS通信支持,包括基于話題的發(fā)布訂閱和服務(wù)的各種操作,依據(jù)rosbridge協(xié)議解析JSON,這部分工作已經(jīng)在一個(gè)開(kāi)源項(xiàng)目RosBridgeClient中進(jìn)行了實(shí)現(xiàn),該庫(kù)依賴java_websocket和json_simple兩個(gè)庫(kù)。ROS機(jī)器人中需要運(yùn)行rosbridge_server作為監(jiān)聽(tīng)rosbridge協(xié)議的服務(wù)器,通過(guò)RosBridgeClient和rosbridge_server便可使得Android應(yīng)用與ROS機(jī)器人功能節(jié)點(diǎn)通過(guò)rosbridge協(xié)議進(jìn)行通信,總體框圖如圖2所示。
圖2 Android終端與ROS機(jī)器人使用rosbridge通信示意圖
以rosbridge協(xié)議進(jìn)行通信的方式是輕量級(jí)、跨平臺(tái)的,依據(jù)第三方庫(kù)可以快速構(gòu)建自己ROS機(jī)器人的交互Android APP,不需要在 Android平臺(tái)上過(guò)多依賴java實(shí)現(xiàn)的ROS組件。但是增加中間rosbridge協(xié)議無(wú)疑會(huì)帶來(lái)傳輸效率降低、擴(kuò)展困難、通信安全問(wèn)題等缺點(diǎn)。此外,第三方庫(kù)沒(méi)有經(jīng)過(guò)單元測(cè)試,并不能保證其魯棒性。
1.2.2rosjava
rosjava使用java實(shí)現(xiàn)了ROS中的基本通信機(jī)制,以及一些必要的核心工具(例如tf,geometry)和一些驅(qū)動(dòng)。android_core是Google基于rosjava開(kāi)發(fā)的用來(lái)在Android平臺(tái)實(shí)現(xiàn)ROS應(yīng)用的組件集合,包括Android視圖與ROS節(jié)點(diǎn)相結(jié)合的數(shù)據(jù)顯示功能組件,并且實(shí)現(xiàn)了Android中所需的基本組件Activity(RosActivity)和Service(NodeMainExecutorService)。RosActivity是ROS應(yīng)用程序在Android上進(jìn)行部署所必不可少的程序組件,用來(lái)與用戶進(jìn)行交互,NodeMainExecutorService主要用來(lái)獲取ROS Master,進(jìn)而執(zhí)行和管理Android中ROS節(jié)點(diǎn)(NodeMain)的生命周期。開(kāi)發(fā)者可通過(guò)android_core來(lái)構(gòu)建自己機(jī)器人的移動(dòng)終端交互APP。此外,通過(guò)Google提供的原生開(kāi)發(fā)工具NDK(Native Development Kit)來(lái)實(shí)現(xiàn)java與C/C++間的相互調(diào)用,開(kāi)發(fā)者可在Android開(kāi)發(fā)應(yīng)用中調(diào)用自己的ROSCPP相關(guān)庫(kù)函數(shù),保護(hù)一些敏感算法。
本文主要研究使用rosjava構(gòu)建的Android應(yīng)用與ROS機(jī)器人交互通信中的可靠性問(wèn)題,包括兩點(diǎn):一是通過(guò)TCPROS建立通信連接時(shí)的網(wǎng)絡(luò)異常檢測(cè);二是增加Android以ROS交互時(shí)的任務(wù)搶占與反饋機(jī)制。
ROS作為一種分布式系統(tǒng)框架,需要一個(gè)中間服務(wù)ROS Master管理各個(gè)節(jié)點(diǎn)間的聯(lián)系。它為各節(jié)點(diǎn)提供了名字注冊(cè)服務(wù),即各節(jié)點(diǎn)通過(guò)XMLRPC協(xié)議在Master上進(jìn)行注冊(cè)自己的信息。例如名字、話題、服務(wù)等。使得各節(jié)點(diǎn)間可以通過(guò)話題、服務(wù)等建立TCP連接,雙方通過(guò)TCPROS/UDPROS協(xié)議便可進(jìn)行數(shù)據(jù)傳輸。此時(shí)的ROS Master只是維護(hù)各節(jié)點(diǎn)的基本信息,在對(duì)節(jié)點(diǎn)間通信異常情況未做任何處理。對(duì)于一些人機(jī)交互方面,例如發(fā)送機(jī)器人手臂控制消息讓其做復(fù)雜任務(wù),機(jī)器人需長(zhǎng)時(shí)間執(zhí)行用戶命令,但若在此期間移動(dòng)終端連接中斷,便不能給機(jī)器人發(fā)送停止信號(hào),這時(shí)便可能發(fā)生機(jī)器人失控帶來(lái)的危險(xiǎn)。所以,對(duì)于一些交互節(jié)點(diǎn)的連接狀態(tài)采取必要的監(jiān)控是非常重要的。
Android移動(dòng)交互終端與ROS機(jī)器人間是通過(guò)基于TCPROS協(xié)議進(jìn)行數(shù)據(jù)傳輸?shù)?。該協(xié)議基于標(biāo)準(zhǔn)TCP協(xié)議,在三次握手建立連接與四次揮手關(guān)閉連接的過(guò)程中出現(xiàn)網(wǎng)絡(luò)異常時(shí),則通信雙方能夠互相感知。但是在建立好連接的狀態(tài)下,如若出現(xiàn)連接中斷,則雙方便不會(huì)及時(shí)知道對(duì)方的狀態(tài)如何。 這里提到的連接中斷包括網(wǎng)絡(luò)故障、通信雙方的應(yīng)用程序崩潰以及通信雙方的主機(jī)崩潰等。解決此類(lèi)問(wèn)題可采用以下兩種策略。
許多TCP的具體實(shí)現(xiàn)提供了一個(gè)稱作Keep-Alive的機(jī)制用來(lái)檢測(cè)死連接,其工作方式是在TCP通信鏈接通道空閑一段時(shí)間間隔后發(fā)送一個(gè)Keep-Alive包。如果對(duì)方主機(jī)的對(duì)等應(yīng)用程序正常運(yùn)行,就會(huì)響應(yīng)一個(gè)ACK應(yīng)答。如果對(duì)方主機(jī)可到達(dá)但是對(duì)等應(yīng)用程序沒(méi)有運(yùn)行,則會(huì)響應(yīng)RST消息,發(fā)送Keep-Alive消息的TCP程序就會(huì)撤銷(xiāo)連接并返回ECONNRESET錯(cuò)誤給應(yīng)用程序。如果對(duì)方既沒(méi)有響應(yīng)ACK又沒(méi)有返回RST消息,就會(huì)按照設(shè)定的嘗試次數(shù)繼續(xù)發(fā)送Keep-Alive探詢消息,在規(guī)定次數(shù)內(nèi)未收到對(duì)方響應(yīng),則表明對(duì)方不可到達(dá)或已經(jīng)崩潰,這時(shí)就會(huì)返回ETIMEDOUT錯(cuò)誤。
此種方式有三個(gè)重要參數(shù)tcp_keepalive_probes、tcp_keepalive_time、tcp_keepalive_intvl,其中tcp_keepalive_time為探測(cè)時(shí)間間隔,默認(rèn)為7 200秒,對(duì)于實(shí)時(shí)檢測(cè)幾乎沒(méi)有意義,如果改變參數(shù),又會(huì)失去清除長(zhǎng)時(shí)間死連接這一最初的意義。此外,keep-alive不僅會(huì)檢測(cè)死連接,還會(huì)撤銷(xiāo)它們,在某些使用場(chǎng)合是不希望發(fā)生的,并且對(duì)于TCP以短連接為主的方式不起作用。
在應(yīng)用層實(shí)現(xiàn)對(duì)連接中斷的檢測(cè)是本文的研究關(guān)鍵點(diǎn),基本思想和Keep-Alive類(lèi)似,定時(shí)向?qū)Φ确桨l(fā)送自定義探針,對(duì)等方需返回對(duì)應(yīng)協(xié)議的應(yīng)答,但由于是在應(yīng)用層實(shí)現(xiàn)的,可以根據(jù)應(yīng)用程序靈活掌握檢測(cè)時(shí)間。為減少Android移動(dòng)終端的計(jì)算壓力,本文將檢測(cè)通信網(wǎng)絡(luò)狀態(tài)的TCP Server設(shè)計(jì)在ROS機(jī)器人的任務(wù)執(zhí)行服務(wù)端,開(kāi)發(fā)一個(gè)監(jiān)聽(tīng)ROS節(jié)點(diǎn)連接狀態(tài)的功能模塊(CheckNodeConnection),如圖3所示。該模塊提供了一系列編程接口,ROS機(jī)器人可主動(dòng)監(jiān)測(cè)、被動(dòng)監(jiān)測(cè)Android中ROS節(jié)點(diǎn)的網(wǎng)絡(luò)連接狀態(tài),其中主動(dòng)監(jiān)測(cè)是在ROS機(jī)器人端輸入需要監(jiān)控節(jié)點(diǎn)的Caller ID,而被動(dòng)監(jiān)測(cè)是Android端節(jié)點(diǎn)主動(dòng)發(fā)起被監(jiān)聽(tīng)請(qǐng)求,請(qǐng)求中包含需要被監(jiān)控節(jié)點(diǎn)的Caller ID?!癈heckNodeConnection”模塊得到需要被監(jiān)控節(jié)點(diǎn)的Caller ID之后,就會(huì)實(shí)例化一個(gè)與ROS Master中的XMLRPC Server對(duì)應(yīng)的XMLRPC Client。通過(guò)XMLRPC協(xié)議調(diào)用“l(fā)ookupNode”方法,然后通過(guò)“Resolver”模塊解析返回的結(jié)果XmlRpcValue,得到需要被監(jiān)控節(jié)點(diǎn)的URL之后就可與被監(jiān)控節(jié)點(diǎn)建立TCP連接,并保持自定義心跳協(xié)議的長(zhǎng)連接。一旦通信出現(xiàn)異常或者Android端應(yīng)用程序崩潰等情況發(fā)生,“CheckNodeConnection”模塊就會(huì)檢測(cè)到連接異常,并通知相關(guān)任務(wù)執(zhí)行模塊進(jìn)入預(yù)設(shè)的安全模式,防止機(jī)器人失控帶來(lái)危險(xiǎn)。此外,還可在Android移動(dòng)交互端進(jìn)行提示用戶故障所在,增加交互的友好性。
圖3 “CheckNodeConnection”模塊總體框圖
Android移動(dòng)終端與ROS機(jī)器人間的交互需要一種可時(shí)刻反饋任務(wù)執(zhí)行狀態(tài)信息以及可搶占任務(wù)執(zhí)行的通信機(jī)制來(lái)提高人機(jī)交互的可靠性[16]。ROS中的Actionlib功能包提供了這種通信機(jī)制,但是,在android_core中并未提供與ROS Actionlib進(jìn)行通信的功能。因此,作者開(kāi)發(fā)了一套用于Android移動(dòng)終端與Actionlib中ActionServer通信的“RosActionOnAndroid” java開(kāi)發(fā)包。其總體結(jié)構(gòu)框圖如圖4所示。
圖4 “RosActionOnAndroid”開(kāi)發(fā)包總體框圖
該開(kāi)發(fā)包主要由Action Client/Server功能模塊和其對(duì)應(yīng)的狀態(tài)機(jī)組成,client和server分別為用戶提供相應(yīng)的編程接口。例如Action Client會(huì)提供目標(biāo)Publisher的設(shè)置接口,提供發(fā)送goal到Action Server的接口,Action Server有對(duì)應(yīng)該goal話題的Subscriber,提供給用戶MessageListener接口,用戶可根據(jù)消息進(jìn)行相應(yīng)任務(wù)的執(zhí)行,依據(jù)執(zhí)行情況可進(jìn)行Action Server狀態(tài)機(jī)的設(shè)置,Action Client中的狀態(tài)機(jī)狀態(tài)會(huì)跟隨Action Server的狀態(tài)變化而改變。
“RosActionOnAndroid”采用client-server的工作模式,兩者之間通過(guò)“ROS Action Protocol”進(jìn)行通信,該協(xié)議是對(duì)基礎(chǔ)ROS消息進(jìn)行的封裝,包括目標(biāo)(goal)、結(jié)果(result)、反饋(feedback)、狀態(tài)(state)、取消(cancel)。消息的傳遞方式還是采用基于TCPROS協(xié)議的發(fā)布訂閱通信模式,client和server分別維護(hù)各自的任務(wù)執(zhí)行狀態(tài)機(jī),為用戶提供可搶占任務(wù)、中間狀態(tài)信息反饋等各種接口。用戶可通過(guò)該開(kāi)發(fā)包在Android端構(gòu)建Action Client與ROS機(jī)器人中對(duì)應(yīng)執(zhí)行任務(wù)計(jì)算的Action Server進(jìn)行通信,包括發(fā)送任務(wù)目標(biāo)、取消目標(biāo)、獲取Action Server端任務(wù)執(zhí)行的反饋信息與最終結(jié)果等。
對(duì)于Android端的ActionClient功能包類(lèi)圖如圖5所示,ActionClient實(shí)現(xiàn)了rosjava中的NodeMain接口,并實(shí)現(xiàn)了其中的虛方法,所以在android_core的RosActivity中實(shí)例化一個(gè)ActionClient節(jié)點(diǎn),便可與ROS機(jī)器人中的Action Server通過(guò)“ROS Action Protocol”進(jìn)行通信。
圖5 ActionClient功能包類(lèi)圖
本文提供了一個(gè)應(yīng)用案例,為某一服務(wù)機(jī)器人平臺(tái)開(kāi)發(fā)一個(gè)Android移動(dòng)終端交互APP,如圖6所示。該應(yīng)用程序可與機(jī)器人進(jìn)行遠(yuǎn)程交互,例如語(yǔ)音識(shí)別、視覺(jué)傳輸、導(dǎo)航、手臂運(yùn)動(dòng)規(guī)劃控制等,并將本文設(shè)計(jì)的網(wǎng)絡(luò)通信異常檢測(cè)機(jī)制與“RosActionOnAndroid”通信機(jī)制加入其中來(lái)提高該交互過(guò)程的可靠性與精確性。
圖6 ROS服務(wù)機(jī)器人與其Android移動(dòng)終端交互APP
本文針對(duì)網(wǎng)絡(luò)通信異常檢驗(yàn)設(shè)計(jì)了一個(gè)簡(jiǎn)單普遍的應(yīng)用案例,Android移動(dòng)終端與ROS機(jī)器人如圖7所示進(jìn)行組網(wǎng)設(shè)計(jì),分別對(duì)Android智能手機(jī)、路由器兩部分進(jìn)行斷網(wǎng)、強(qiáng)制關(guān)機(jī)來(lái)模擬網(wǎng)絡(luò)故障、主機(jī)死機(jī)等情況,分別驗(yàn)證ROS機(jī)器人是否即刻感知其移動(dòng)交互終端的連接斷開(kāi)。
圖7 移動(dòng)終端與ROS機(jī)器人的組網(wǎng)示意圖
這兩部分的實(shí)驗(yàn)過(guò)程大體一致,這里針對(duì)Android智能手機(jī)斷網(wǎng)進(jìn)行實(shí)驗(yàn),測(cè)試ROS機(jī)器人是否感知移動(dòng)終端通信異常。正常情況下,Android移動(dòng)終端會(huì)與ROS機(jī)器人保持連接,每30 ms發(fā)送一次自定義協(xié)議心跳包,在該實(shí)驗(yàn)過(guò)程時(shí)間范圍內(nèi)Android移動(dòng)終端向ROS機(jī)器人發(fā)送的字節(jié)數(shù)如圖8所示。當(dāng)在A點(diǎn)時(shí)人為關(guān)閉Android移動(dòng)終端網(wǎng)絡(luò),再經(jīng)過(guò)5次探測(cè)后確定移動(dòng)終端網(wǎng)絡(luò)異常,在B點(diǎn)ROS機(jī)器人會(huì)得到感知,從而進(jìn)入預(yù)設(shè)的安全模式。
圖8 ROS機(jī)器人向Android移動(dòng)終端發(fā)送心跳包的時(shí)序圖
本文通過(guò)“RosActionOnAndroid”在Android移動(dòng)終端構(gòu)建與ROS機(jī)器人手臂交互控制的應(yīng)用,來(lái)測(cè)試其可通過(guò)執(zhí)行任務(wù)狀態(tài)信息的時(shí)刻反饋來(lái)提高控制精度和通過(guò)監(jiān)控手臂運(yùn)動(dòng)時(shí)的速度來(lái)防止危險(xiǎn)發(fā)生。
機(jī)器人手臂多由電機(jī)模塊組成,采用關(guān)節(jié)位置驅(qū)動(dòng)的方式,在物理機(jī)器臂運(yùn)動(dòng)時(shí)會(huì)受到內(nèi)部電機(jī)的速度、加速度等參數(shù)的制約,如果不加處理的話,就會(huì)使得算法規(guī)劃的手臂運(yùn)動(dòng)軌跡與物理機(jī)器臂運(yùn)動(dòng)的路徑不一致。此時(shí),Android移動(dòng)終端與ROS機(jī)器人交互時(shí),RosActionOnAndroid就能很好地解決這一問(wèn)題。
本文通過(guò)“RosActionOnAndroid”在Android移動(dòng)終端實(shí)時(shí)獲取ROS機(jī)器人手臂的運(yùn)動(dòng)位置,動(dòng)態(tài)逼近目標(biāo)值來(lái)提高控制運(yùn)動(dòng)路徑精度。例如,控制機(jī)器臂末端畫(huà)一個(gè)完整圓圈,以某一起點(diǎn)開(kāi)始再回到該點(diǎn),如圖9中的A所示,通過(guò)算法得到末端畫(huà)圓所經(jīng)過(guò)的路點(diǎn)如圖10所示。如果將規(guī)劃后的手臂運(yùn)動(dòng)路徑直接發(fā)送到ROS機(jī)器人,驅(qū)動(dòng)手臂運(yùn)動(dòng),由于物理機(jī)器人手臂運(yùn)動(dòng)經(jīng)過(guò)每個(gè)路點(diǎn)的時(shí)間不會(huì)正好與運(yùn)動(dòng)學(xué)算法規(guī)劃的時(shí)間相吻合,便導(dǎo)致真實(shí)路徑偏離理論的圓弧,如圖9中的B所示。然而,通過(guò)“RosActionOnAndroid”與ROS機(jī)器人通過(guò)Actionlib機(jī)制通信,通過(guò)ROS機(jī)器人時(shí)刻返回當(dāng)前運(yùn)動(dòng)狀態(tài)決定下一路點(diǎn)的控制時(shí)間,便會(huì)使軌跡接近理論圓弧,如圖9中的C所示。
圖9 機(jī)器人手臂畫(huà)圓測(cè)試
圖10 手臂末端執(zhí)行器畫(huà)圓所經(jīng)過(guò)的路點(diǎn)
此外,通過(guò)“RosActionOnAndroid”可在Android移動(dòng)交互終端實(shí)時(shí)獲得機(jī)器人的任務(wù)執(zhí)行狀態(tài)信息,監(jiān)控其是否符合安全運(yùn)作模式,動(dòng)態(tài)設(shè)置安全閾值。例如,移動(dòng)終端發(fā)送指令給ROS機(jī)器人手臂去執(zhí)行某種任務(wù),并監(jiān)控其手臂運(yùn)動(dòng)速度是否超出閾值,這時(shí)便需要目標(biāo)指令、手臂各個(gè)關(guān)節(jié)的速度值以及可任務(wù)搶占和終止四個(gè)數(shù)據(jù)傳輸通道,則基本的ROS發(fā)布訂閱通信模式就不適用了。
本實(shí)驗(yàn)將Android移動(dòng)終端,通過(guò)“RosActionOnAndroid”與ROS機(jī)器人手臂運(yùn)動(dòng)規(guī)劃服務(wù)端的ActionServer綁定連接,并時(shí)刻獲取其手臂運(yùn)動(dòng)規(guī)劃中的速度值,當(dāng)移動(dòng)終端發(fā)現(xiàn)速度值超出預(yù)先設(shè)置的閾值時(shí),則發(fā)送取消任務(wù)指令。在一次執(zhí)行任務(wù)時(shí)的各個(gè)關(guān)節(jié)的位置、速度如圖11中A、B所示,其中當(dāng)速度值超出1.0 radian/s時(shí),則修正該規(guī)劃路徑,并限制其在該最大速度繼續(xù)執(zhí)行任務(wù),如圖11中的C所示。
圖11 機(jī)器人手臂運(yùn)動(dòng)的位置、 速度以及超出閾值后的速度曲線圖
本文主要研究設(shè)計(jì)了Android移動(dòng)終端與ROS機(jī)器人交互中的可靠性通信機(jī)制,一方面設(shè)計(jì)了網(wǎng)絡(luò)異常檢測(cè)模塊“CheckNodeConnection”可避免在通信故障時(shí)機(jī)器人失控等危險(xiǎn)發(fā)生;另一方面開(kāi)發(fā)的“RosActionOnAndroid”功能包可提供任務(wù)搶占、執(zhí)行狀態(tài)信息反饋等功能,使得交互方式更加安全,控制更加精準(zhǔn)。未來(lái)ROS服務(wù)機(jī)器人與Android移動(dòng)終端互聯(lián)交互是一個(gè)必然趨勢(shì),兩者之間交互通信的可靠性應(yīng)當(dāng)?shù)玫街匾暋?/p>
由于目前的ROS通信機(jī)制尚不能保證很好的消息傳遞實(shí)時(shí)性,未來(lái)工作考慮結(jié)合ROS2.0中采用的數(shù)據(jù)分發(fā)服務(wù)(DDS)技術(shù),提高分布式系統(tǒng)的實(shí)時(shí)性[17]。并且繼續(xù)研究提高網(wǎng)絡(luò)異常檢測(cè)的實(shí)時(shí)性,完善應(yīng)用層自定義心跳反饋協(xié)議,并逐步形成標(biāo)準(zhǔn)。對(duì)于“RosActionOnAndroid”通信機(jī)制內(nèi)部的狀態(tài)機(jī)應(yīng)進(jìn)一步提高其可擴(kuò)展性,更易于開(kāi)發(fā)者使用。
[1] Xiao Y,Zhang Z,Beck A,et al.Human-robot interaction by understanding upper body gestures[J].Presence,2014,23(2):133-154.
[2] Jin H,Chen Q,Chen Z,et al.Multi-LeapMotion sensor based demonstration for robotic refine tabletop object manipulation task[J].Caai Transactions on Intelligence Technology,2016,1(1):104-113.
[3] 左軒塵,韓亮亮,莊杰,等.基于ROS的空間機(jī)器人人機(jī)交互系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2015(12):3370-3374.
[4] Aroca R V,Péricles A,Oliveira B S D,et al.Towards smarter robots with smartphones[C]//5th Workshop in Applied Robotics and Automation,2012:1-6.
[5] Barbosa J P D A,Lima F D P D C,Coutinho L D S,et al.ROS,Android and cloud robotics:How to make a powerful low cost robot[C]//International Conference on Advanced Robotics.IEEE,2015.
[6] Kehoe B,Patil S,Abbeel P,et al.A Survey of Research on Cloud Robotics and Automation[J].IEEE Transactions on Automation Science & Engineering,2015,12(2):398-409.
[7] Mayachita I,Widyarini R,Sono H R,et al.Implementation of Entertaining Robot on ROS Framework[J].Procedia Technology,2013,11(1):380-387.
[8] Hendrich N,Bistry H,Zhang J.Architecture and Software Design for a Service Robot in an Elderly-Care Scenario[J].Engineering,2015,1(1):27-35.
[9] Oros N,Krichmar J L.Smartphone based robotics:Powerful,flexible and inexpensive robots for hobbyists,educators,students and researchers[J].IEEE Robotics & Automation Magazine,2013,11(1):19-29.
[10] Dieber B,Kacianka S,Rass S,et al.Application-level Security for ROS-based Applications[C]//International Conference on Intelligent Robots and Systems,2016.
[11] Codd-Downey R,Jenkin M.RCON:Dynamic mobile interfaces for command and control of ROS-enabled robots[C]//International Conference on Informatics in Control,Automation and Robotics.IEEE,2015:66-73.
[12] Kohler D,Conley K.Rosjava:an implementation of ROS in pure Java with Android suport[EB/OL].[2013-05-15].http://code.gogle.com/p/rosjava.
[13] Zoppi A.A lightweight open-source communication framework for native integration of resource constrained robotics devices with ROS[D].Italy:Politecnico di Milano.
[14] Quigley M,Conley K,Gerkey B P,et al.ROS:an open-source Robot Operating System[C]//ICRA Workshop on Open Source Software.2009.
[15] 賈娟娟,施智平,關(guān)永,等.ROS中XML-RPC協(xié)議實(shí)現(xiàn)的形式化驗(yàn)證[J].小型微型計(jì)算機(jī)系統(tǒng),2015,36(12):2629-2633.
[16] Yepes J C,Yepes J J,Martínez J R,et al.Implementation of an Android based teleoperation application for controlling a KUKA-KR6 robot by using sensor fusion[C]//Health Care Exchanges.IEEE,2013:1-5.
[17] 樊澤棟,丁博,史殿習(xí),等.機(jī)器人中間件消息實(shí)時(shí)性保證機(jī)制的研究與實(shí)現(xiàn)[J].軟件,2015,36(10):21-25.