APP下载

Android与ROS交互通信的可靠性设计

2018-04-18李梦男邵振洲施智平魏洪兴

计算机应用与软件 2018年3期
关键词:手臂终端节点

李梦男 邵振洲 渠 瀛 施智平 关 永 魏洪兴

1(首都师范大学信息工程学院 北京 100048) 2(轻型工业机器人与安全验证北京市重点实验室 北京 100088) 3(成像技术北京市高精尖创新中心 北京 100048) 4(田纳西大学工程学院 诺克斯维尔 37996) 5(北京航空航天大学机械工程及自动化学院 北京 100083)

0 引 言

当今,随着服务机器人基础工作的不断完善,人机交互方向的研究日益成为机器人领域的热门。传统的摇杆、按键等交互方式具有操作繁琐、不灵活、接口没有统一的标准等缺点,已不能满足于当今的智能服务机器人。机器人通信框架也可称为机器人操作系统的ROS一定程度上解决了以上机器人软件开发与人机交互中的痛点问题,因为其完美支持各种人机交互的传感器设备和拥有丰富的算法支撑。但是目前流行的人机交互方式存在着一些问题,例如Kinect和RealSense等视觉体感设备容易受周围环境的影响而使识别准确率下降;LeapMotion等手势识别控制器的交互方式局限性很大;语音识别又会受到距离、周围嘈杂环境的影响等[1-3]。因这些人机交互方式的鲁棒性、实时性、自适应性等方面均存在一定的缺陷,所以目前并没有得到很好的推广应用。

相比以上各种人机交互的传感设备,集语音识别、摄像头、陀螺仪、手势识别、定位导航等多种传感器于一体的智能移动设备作为服务机器人的人机交互终端更具有一定优势[4-5]。因其集成度高可省去一些交互设备,节约成本,还可为基于云概念的机器人提供多远程终端的支持,提高云端的扩展性[6],例如导游机器人、点餐机器人等。因此,将移动终端系统与ROS互联通信,对于出现在家庭、银行、餐饮、娱乐、教育等场所的服务机器人有着很好的应用前景[7-9]。

目前,一些组织(包括Google,Willow Garage等)已经作出了很多贡献,主要解决移动终端领域使用率最高的Android和iOS设备与目前流行的机器人系统ROS间的通信问题。其中,rosbridge协议的提出是为了让非ROS环境可与ROS节点进行通信,其基本思路是通过一个中间桥梁WebSocket来联系通信双方各自的协议,但此种方式存在着通信过程冗余、效率低、通信安全漏洞、平台兼容性等问题[10]。因此,在移动平台本地系统实现ROS环境是一种很好的解决方式,不仅可以提高与ROS通信的效率,还会增加人机交互系统的扩展性。当前,iOS设备与ROS交互的ROSPod (2015)并没有完全实现ROS通信的全部功能,而且稳定性不好[11]。另外一种实现方式是基于在Google I/O大会上发布的一个纯java实现ROS基本通信组件的客户端库rosjava[12]。因基于该库开发的android_core功能包具有很好的稳定性,使其成为了在Android移动终端构建与ROS机器人通信应用的重要组件。

然而,基于rosjava的Android应用功能包集合android_core虽然提供了ROS中基本的发布订阅通信方式,但是在应对交互过程中需要机器人不断反馈其任务执行状态信息给移动终端以及移动终端需要执行任务抢占时,此通信方式便不满足要求了。此外,该通信方式没有网络异常实时检测功能,在远程人机交互方面存在着通信安全隐患。例如机器人正执行Android移动终端发送的命令时,网络突然中断,与移动终端失去联系的ROS机器人就会面临失控的危险。因此,基于rosjava研究一种介于Android和ROS间的支持任务抢占与中间状态信息反馈,并且可以实时监测两者连接状态的可靠通信方式显得尤为重要。

本文一方面设计了一种实时监测Android与ROS间连接状态的功能模块“CheckNodeConnection”,在建立TCP/IP协议连接的应用层加入心跳包反馈机制,使得ROS机器人端时刻知道Android移动终端的连接状态,在任务执行过程突然通信中断时可进入预设的安全模式,增加了人机交互的安全性与友好性。另一方面,基于rosjava为Android移动终端开发了匹配ROS Actionlib中“ROS Action Protocol”的通信机制“RosActionOnAndroid”,满足了交互过程中移动终端需要不断获取机器人的状态反馈信息,以及可按优先级进行任务抢占的需求。

1 ROS的通信框架以及与Android互联的实现要点

1.1 ROS通信框架

ROS运行于主操作系统之上,提供了一种分布式通信框架,由各自独立的功能节点(Node)组成。节点作为处理任务计算的进程,在不同的系统任务中可依据工作需求调整其承载的功能粒度,极大地增加了系统的模块化和代码的封装程度[13]。各节点间通过发布/订阅消息模型进行异步通信,通信的双方节点并不清楚对等端的存在,连接工作均交给中间管理者ROS Master。每个节点的信息都要在ROS Master上进行注册,可以将其看作一个查询表,为各个节点提供类似DNS的服务,即各个节点的主机名、IP地址、端口号等信息。其具体存储是在ROS Master内部的Parameter Server上,用户可通过封装有XMLRPC的接口进行存储和检索其中的信息。其中所有的资源(包括node、topic、service、parameter等)都是在某个命名空间中使用特定的Name进行了定义。计算图层中的Name在ROS的封装体系中非常重要,是各资源间的连接桥梁,还保障了不同资源间的Name不会冲突[14]。

ROS的分布式通信框架是一种点对点P2P(Peer-to-Peer)的松耦合的网络连接的处理架构,其主要的数据传输方式包括基于话题(Topic)的异步数据流通信、基于服务(Service)的请求回应模型以及基于远程过程调用(RPC)的节点管理器Master等[15]。根据通信协议进行分类主要分为两种:

(1) XML-RPC协议:包括ROS Master和ROS Parameters(搭载在Master上的参数服务器)。XML-RPC的全称是XML Remote Procedure Call,中文名叫作XML远程过程调用,是Apache软件基金会为解决分布式计算问题而创作的一种通信协议。在该协议的Server端绑定各种供用户使用的方法,Client端可以依据该协议来远程调用Server端的方法。具有跨平台、分布式、XML作为传输信息格式、多种数据结构等特点。其工作流程如图1所示。

图1 XML-RPC工作流程图

(2) TCPROS协议:基于TCP协议的ROS应用层数据协议,用于解析Topic和Service的数据流。TCPROS为了保证通信双方的传输类型一致,会在协议头中给出Topic名的md5 hash算法处理之后的值,每次改动消息类型时,md5的值都会随之改变,这样就避免了新旧消息类型不一致的问题。TCPROS的协议头所占字节数一般是固定的,其中seq可以检测是否丢包,stamp可以检测消息实时性。该协议还为用户提供了一些底层传输设置接口,例如Subscriber中的选项tcp_nodelay如果为1,便给socket设置TCP_NODELAY选项,降低延迟,但可能会降低传输效率。另外Service Client选项的persistent设置为1,则该service的链接会开放多个请求通道。

1.2 ROS与Android互联实现要点

目前,ROS和Android实现通信的方式主要有两类: rosbridge和rosjava。

1.2.1rosbridge

rosbridge协议的提出是为了让非ROS环境可与ROS节点进行通信,基本思想是通过一个中间桥梁WebSocket来联系通信双方各自的协议。对于Android与ROS通信来讲,可在Android平台实现WebSocket,其以JSON格式的API为非ROS环境提供ROS通信支持,包括基于话题的发布订阅和服务的各种操作,依据rosbridge协议解析JSON,这部分工作已经在一个开源项目RosBridgeClient中进行了实现,该库依赖java_websocket和json_simple两个库。ROS机器人中需要运行rosbridge_server作为监听rosbridge协议的服务器,通过RosBridgeClient和rosbridge_server便可使得Android应用与ROS机器人功能节点通过rosbridge协议进行通信,总体框图如图2所示。

图2 Android终端与ROS机器人使用rosbridge通信示意图

以rosbridge协议进行通信的方式是轻量级、跨平台的,依据第三方库可以快速构建自己ROS机器人的交互Android APP,不需要在 Android平台上过多依赖java实现的ROS组件。但是增加中间rosbridge协议无疑会带来传输效率降低、扩展困难、通信安全问题等缺点。此外,第三方库没有经过单元测试,并不能保证其鲁棒性。

1.2.2rosjava

rosjava使用java实现了ROS中的基本通信机制,以及一些必要的核心工具(例如tf,geometry)和一些驱动。android_core是Google基于rosjava开发的用来在Android平台实现ROS应用的组件集合,包括Android视图与ROS节点相结合的数据显示功能组件,并且实现了Android中所需的基本组件Activity(RosActivity)和Service(NodeMainExecutorService)。RosActivity是ROS应用程序在Android上进行部署所必不可少的程序组件,用来与用户进行交互,NodeMainExecutorService主要用来获取ROS Master,进而执行和管理Android中ROS节点(NodeMain)的生命周期。开发者可通过android_core来构建自己机器人的移动终端交互APP。此外,通过Google提供的原生开发工具NDK(Native Development Kit)来实现java与C/C++间的相互调用,开发者可在Android开发应用中调用自己的ROSCPP相关库函数,保护一些敏感算法。

本文主要研究使用rosjava构建的Android应用与ROS机器人交互通信中的可靠性问题,包括两点:一是通过TCPROS建立通信连接时的网络异常检测;二是增加Android以ROS交互时的任务抢占与反馈机制。

2 Android与ROS通信中的网络异常检测机制

ROS作为一种分布式系统框架,需要一个中间服务ROS Master管理各个节点间的联系。它为各节点提供了名字注册服务,即各节点通过XMLRPC协议在Master上进行注册自己的信息。例如名字、话题、服务等。使得各节点间可以通过话题、服务等建立TCP连接,双方通过TCPROS/UDPROS协议便可进行数据传输。此时的ROS Master只是维护各节点的基本信息,在对节点间通信异常情况未做任何处理。对于一些人机交互方面,例如发送机器人手臂控制消息让其做复杂任务,机器人需长时间执行用户命令,但若在此期间移动终端连接中断,便不能给机器人发送停止信号,这时便可能发生机器人失控带来的危险。所以,对于一些交互节点的连接状态采取必要的监控是非常重要的。

Android移动交互终端与ROS机器人间是通过基于TCPROS协议进行数据传输的。该协议基于标准TCP协议,在三次握手建立连接与四次挥手关闭连接的过程中出现网络异常时,则通信双方能够互相感知。但是在建立好连接的状态下,如若出现连接中断,则双方便不会及时知道对方的状态如何。 这里提到的连接中断包括网络故障、通信双方的应用程序崩溃以及通信双方的主机崩溃等。解决此类问题可采用以下两种策略。

2.1 Keep-Alive

许多TCP的具体实现提供了一个称作Keep-Alive的机制用来检测死连接,其工作方式是在TCP通信链接通道空闲一段时间间隔后发送一个Keep-Alive包。如果对方主机的对等应用程序正常运行,就会响应一个ACK应答。如果对方主机可到达但是对等应用程序没有运行,则会响应RST消息,发送Keep-Alive消息的TCP程序就会撤销连接并返回ECONNRESET错误给应用程序。如果对方既没有响应ACK又没有返回RST消息,就会按照设定的尝试次数继续发送Keep-Alive探询消息,在规定次数内未收到对方响应,则表明对方不可到达或已经崩溃,这时就会返回ETIMEDOUT错误。

此种方式有三个重要参数tcp_keepalive_probes、tcp_keepalive_time、tcp_keepalive_intvl,其中tcp_keepalive_time为探测时间间隔,默认为7 200秒,对于实时检测几乎没有意义,如果改变参数,又会失去清除长时间死连接这一最初的意义。此外,keep-alive不仅会检测死连接,还会撤销它们,在某些使用场合是不希望发生的,并且对于TCP以短连接为主的方式不起作用。

2.2 应用层心跳包

在应用层实现对连接中断的检测是本文的研究关键点,基本思想和Keep-Alive类似,定时向对等方发送自定义探针,对等方需返回对应协议的应答,但由于是在应用层实现的,可以根据应用程序灵活掌握检测时间。为减少Android移动终端的计算压力,本文将检测通信网络状态的TCP Server设计在ROS机器人的任务执行服务端,开发一个监听ROS节点连接状态的功能模块(CheckNodeConnection),如图3所示。该模块提供了一系列编程接口,ROS机器人可主动监测、被动监测Android中ROS节点的网络连接状态,其中主动监测是在ROS机器人端输入需要监控节点的Caller ID,而被动监测是Android端节点主动发起被监听请求,请求中包含需要被监控节点的Caller ID。“CheckNodeConnection”模块得到需要被监控节点的Caller ID之后,就会实例化一个与ROS Master中的XMLRPC Server对应的XMLRPC Client。通过XMLRPC协议调用“lookupNode”方法,然后通过“Resolver”模块解析返回的结果XmlRpcValue,得到需要被监控节点的URL之后就可与被监控节点建立TCP连接,并保持自定义心跳协议的长连接。一旦通信出现异常或者Android端应用程序崩溃等情况发生,“CheckNodeConnection”模块就会检测到连接异常,并通知相关任务执行模块进入预设的安全模式,防止机器人失控带来危险。此外,还可在Android移动交互端进行提示用户故障所在,增加交互的友好性。

图3 “CheckNodeConnection”模块总体框图

3 RosActionOnAndroid通信机制的实现

Android移动终端与ROS机器人间的交互需要一种可时刻反馈任务执行状态信息以及可抢占任务执行的通信机制来提高人机交互的可靠性[16]。ROS中的Actionlib功能包提供了这种通信机制,但是,在android_core中并未提供与ROS Actionlib进行通信的功能。因此,作者开发了一套用于Android移动终端与Actionlib中ActionServer通信的“RosActionOnAndroid” java开发包。其总体结构框图如图4所示。

图4 “RosActionOnAndroid”开发包总体框图

该开发包主要由Action Client/Server功能模块和其对应的状态机组成,client和server分别为用户提供相应的编程接口。例如Action Client会提供目标Publisher的设置接口,提供发送goal到Action Server的接口,Action Server有对应该goal话题的Subscriber,提供给用户MessageListener接口,用户可根据消息进行相应任务的执行,依据执行情况可进行Action Server状态机的设置,Action Client中的状态机状态会跟随Action Server的状态变化而改变。

“RosActionOnAndroid”采用client-server的工作模式,两者之间通过“ROS Action Protocol”进行通信,该协议是对基础ROS消息进行的封装,包括目标(goal)、结果(result)、反馈(feedback)、状态(state)、取消(cancel)。消息的传递方式还是采用基于TCPROS协议的发布订阅通信模式,client和server分别维护各自的任务执行状态机,为用户提供可抢占任务、中间状态信息反馈等各种接口。用户可通过该开发包在Android端构建Action Client与ROS机器人中对应执行任务计算的Action Server进行通信,包括发送任务目标、取消目标、获取Action Server端任务执行的反馈信息与最终结果等。

对于Android端的ActionClient功能包类图如图5所示,ActionClient实现了rosjava中的NodeMain接口,并实现了其中的虚方法,所以在android_core的RosActivity中实例化一个ActionClient节点,便可与ROS机器人中的Action Server通过“ROS Action Protocol”进行通信。

图5 ActionClient功能包类图

4 应用与实验验证

本文提供了一个应用案例,为某一服务机器人平台开发一个Android移动终端交互APP,如图6所示。该应用程序可与机器人进行远程交互,例如语音识别、视觉传输、导航、手臂运动规划控制等,并将本文设计的网络通信异常检测机制与“RosActionOnAndroid”通信机制加入其中来提高该交互过程的可靠性与精确性。

图6 ROS服务机器人与其Android移动终端交互APP

4.1 网络通信异常检验测试

本文针对网络通信异常检验设计了一个简单普遍的应用案例,Android移动终端与ROS机器人如图7所示进行组网设计,分别对Android智能手机、路由器两部分进行断网、强制关机来模拟网络故障、主机死机等情况,分别验证ROS机器人是否即刻感知其移动交互终端的连接断开。

图7 移动终端与ROS机器人的组网示意图

这两部分的实验过程大体一致,这里针对Android智能手机断网进行实验,测试ROS机器人是否感知移动终端通信异常。正常情况下,Android移动终端会与ROS机器人保持连接,每30 ms发送一次自定义协议心跳包,在该实验过程时间范围内Android移动终端向ROS机器人发送的字节数如图8所示。当在A点时人为关闭Android移动终端网络,再经过5次探测后确定移动终端网络异常,在B点ROS机器人会得到感知,从而进入预设的安全模式。

图8 ROS机器人向Android移动终端发送心跳包的时序图

4.2 RosActionOnAndroid测试

本文通过“RosActionOnAndroid”在Android移动终端构建与ROS机器人手臂交互控制的应用,来测试其可通过执行任务状态信息的时刻反馈来提高控制精度和通过监控手臂运动时的速度来防止危险发生。

机器人手臂多由电机模块组成,采用关节位置驱动的方式,在物理机器臂运动时会受到内部电机的速度、加速度等参数的制约,如果不加处理的话,就会使得算法规划的手臂运动轨迹与物理机器臂运动的路径不一致。此时,Android移动终端与ROS机器人交互时,RosActionOnAndroid就能很好地解决这一问题。

本文通过“RosActionOnAndroid”在Android移动终端实时获取ROS机器人手臂的运动位置,动态逼近目标值来提高控制运动路径精度。例如,控制机器臂末端画一个完整圆圈,以某一起点开始再回到该点,如图9中的A所示,通过算法得到末端画圆所经过的路点如图10所示。如果将规划后的手臂运动路径直接发送到ROS机器人,驱动手臂运动,由于物理机器人手臂运动经过每个路点的时间不会正好与运动学算法规划的时间相吻合,便导致真实路径偏离理论的圆弧,如图9中的B所示。然而,通过“RosActionOnAndroid”与ROS机器人通过Actionlib机制通信,通过ROS机器人时刻返回当前运动状态决定下一路点的控制时间,便会使轨迹接近理论圆弧,如图9中的C所示。

图9 机器人手臂画圆测试

图10 手臂末端执行器画圆所经过的路点

此外,通过“RosActionOnAndroid”可在Android移动交互终端实时获得机器人的任务执行状态信息,监控其是否符合安全运作模式,动态设置安全阈值。例如,移动终端发送指令给ROS机器人手臂去执行某种任务,并监控其手臂运动速度是否超出阈值,这时便需要目标指令、手臂各个关节的速度值以及可任务抢占和终止四个数据传输通道,则基本的ROS发布订阅通信模式就不适用了。

本实验将Android移动终端,通过“RosActionOnAndroid”与ROS机器人手臂运动规划服务端的ActionServer绑定连接,并时刻获取其手臂运动规划中的速度值,当移动终端发现速度值超出预先设置的阈值时,则发送取消任务指令。在一次执行任务时的各个关节的位置、速度如图11中A、B所示,其中当速度值超出1.0 radian/s时,则修正该规划路径,并限制其在该最大速度继续执行任务,如图11中的C所示。

图11 机器人手臂运动的位置、 速度以及超出阈值后的速度曲线图

5 结 语

本文主要研究设计了Android移动终端与ROS机器人交互中的可靠性通信机制,一方面设计了网络异常检测模块“CheckNodeConnection”可避免在通信故障时机器人失控等危险发生;另一方面开发的“RosActionOnAndroid”功能包可提供任务抢占、执行状态信息反馈等功能,使得交互方式更加安全,控制更加精准。未来ROS服务机器人与Android移动终端互联交互是一个必然趋势,两者之间交互通信的可靠性应当得到重视。

由于目前的ROS通信机制尚不能保证很好的消息传递实时性,未来工作考虑结合ROS2.0中采用的数据分发服务(DDS)技术,提高分布式系统的实时性[17]。并且继续研究提高网络异常检测的实时性,完善应用层自定义心跳反馈协议,并逐步形成标准。对于“RosActionOnAndroid”通信机制内部的状态机应进一步提高其可扩展性,更易于开发者使用。

[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].计算机工程与设计,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] 贾娟娟,施智平,关永,等.ROS中XML-RPC协议实现的形式化验证[J].小型微型计算机系统,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] 樊泽栋,丁博,史殿习,等.机器人中间件消息实时性保证机制的研究与实现[J].软件,2015,36(10):21-25.

猜你喜欢

手臂终端节点
复杂线束在双BCI耦合下的终端响应机理
手臂上的抓痕
X美术馆首届三年展:“终端〉_How Do We Begin?”
概念格的一种并行构造算法
结合概率路由的机会网络自私节点检测算法
采用贪婪启发式的异构WSNs 部分覆盖算法*
Crosstalk between gut microbiota and antidiabetic drug action
基于声波检测的地下防盗终端
“吃人不吐骨头”的终端为王
完美的手臂