ROS通信机制
ROS通信机制概述
ROS通信机制的概念
ROS的核心功能是提供一种软件点对点通信机制。ROS的运行架构是基于Socket网络连接的松耦合架构(后面讲的TCP和UDP包括Http协议还有XMLRPC协议最底层都是基于Socket通信架构的)。这个运行架构中包含一系列进程(也就是后面的节点了),这些进程可以驻留在多个不同的主机上并且在运行过程中通过点对点的拓扑结构实现通信。
ROS把每个工作进程看做一个节点,使用节点管理器进行统一管理,并提供一套相应的消息传递机制(Topic,service,action)。在ROS中所有的消息通信都必须使用节点管理器,ROS的特殊性主要体现在消息通信层。点对点的连接和配置通过XMLRPC机制实现;节点间的数据流是通过网络套接字实现(TCP/UDP),数据流在ROS中被称为消息(也就是指的msg,srv,cation消息类型了),这些消息都是提供了指定的接口进行定义与描述的(.msg或.srv或.action文件,有固定的接口格式)。
ROS底层的通信是通过HTTP完成的,因此ROS内核本质上是一个HTTP服务器,运行过roslaunch或者rosrun就知道,刚启动都会有如图所示,上面就写有节点管理器(ROS_MASTER_URI)的URI:
端口号为11311,即当需要连接到另一台计算机上运行的ROS时,只要连上该机的11311端口即可。
ROS通信机制的基本要素
- Node节点:节点是主要的计算执行进程。
- ROSMaster节点管理器:节点管理器的主要目的是实现节点之间的通信,用于主题、服务的注册和查找等,参数服务器也运行在节点管理器之上。
- 参数服务器:用于存储和检索运行时的参数。
- 消息:节点之间的通信是通过消息来传递实现的。主要的消息包括msg,srv,action
- 主题(Topic):一种发布->订阅的通信方式
- 服务(Service):一种请求->应答的通信方式
ROS通信机制的分类
简单进行分类有:
- Topic主题:节点Node:发布 --> 节点Node :订阅 的形式进行通信
- Service服务:请求->响应模式进行通信
- Action活动:与Service通信机制相类似,但添加了实时反馈的功能。
基于主题Topic的异步数据流通信原理
概述
Topic通信机制采用的是节点发布与订阅的形式进行。若一个节点需要与其他节点进行通信,则只需要在自己关心的Topic上发布或订阅消息即可。一个Topic主题上可以拥有多个发布者和订阅者,同时一个节点也可以发布或订阅多个主题。
ROS的主题Topic通信支持TCPROS和UDPROS两种通信协议。
(TCPROS是基于标准的TCP/IP套接字来传输消息数据的,通常topic和service这两种通信机制使用的是这种协议,UDPROS采用标准的UDP传输方式,它是一种低延时、高效率的传输方式,但可能丢包)
在一个系统中,必须包含一个节点管理器Master。
节点管理器(ROS Master)
Master用来管理发布者和订阅者,使得发布者的消息可以正确的发送给订阅者,因此每当有一个新的发布者或订阅者产生时,都必须在Master上注册信息。
当发布者在Master上注册时,Master会保存发布者的URI地址和发布者发布的主题,当系统有一个新的订阅者在Master上注册时,Master会根据订阅者订阅的主题,在保存的信息中寻找与Topic主题匹配的发布者,然后将这些发布者的URI发送给订阅者。订阅者会根据发布者的URI与这些发布者建立一对多的连接,从而接收这些发布者在Topic主题上发布的消息。
基于主题的数据流通信主要通过以下四步来完成。如书P35图3-2所示。
- 通过XMLRPC ,发布者与订阅者在Master上注册,订阅者和发布者协商共同支持的协议(TCPROS或UDPROS)
- 发布者和订阅者通过互相发送header,建立TCPROS/UDPROS连接。
- 经过这两步之后,连接已近建立成功,可以进行数据传送。发布者向特定的主题发布消息,订阅者会在特定的主题上接收消息,然后将消息保存在回调函数队列中,等待处理。
- 最后调用回调函数队列中已经注册的回调函数来处理接收到的消息。
异步数据流的实现基础(Topic通信实现的基础)
-
1.节点准备
-
1.1初始化
- 在创建每个节点时都会首先调用ros::init()完成对节点的初始化,而ros::init()这个初始化方法,主要还包括
- 注册终止函数:当主函数执行完毕,会自动检查节点是否关闭,如果没有,则自动调用ros::shutdown()关闭节点。
- 建立全局回调函数队列:用于存储用户编写的回调函数和等待处理的消息队列。
- 全局变量初始化:通过调用ros::network、ros::master、ros::this_node、ros::file_log、ors::param初始化函数实现一些全局变量的初始化,ros::network::init()完成对节点主机名或IP地址,以及TCP连接中监听端口的初始化,ros::master::init()获取Master的URI、主机号及端口号
- 创建通信接口:NodeHandle类创建发布者、订阅者、服务客户端等roscpp接口
- 在创建每个节点时都会首先调用ros::init()完成对节点的初始化,而ros::init()这个初始化方法,主要还包括
-
1.2启动管理器(Master)
- 在节点完成初始化之后,可以创建ros::NodeHandle类对象。当创建这个类的实例时,他会自动为我们实例化TopicManager,ServiceManager,Connection-Manager,PollManager和XMLRPCManager类,并在所有实例上调用他们的成员函数start(),是的他们执行相应的操作。
-
什么是XMLRPC
XMLRPC是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:
1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;
2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
- 简单看看上面的简介,总结一句就是XMLRPC协议就是一种基于Http协议的传输数据类型为xml文本数据的数据协议。
- 通过其中的一个对象XMLRPCManager,这个对象定义了一个服务器server,端口为0,他还创建了一个serverThreadFunc线程,该线程用于创建XMLRPC连接,断开不需要的XMLRPC连接,总的来说XMLRPCManager用于节点间,节点与节点管理器之间通过XMLRPC协议来建立连接。
-
-
2.订阅者发现发布者
- 主要就是通过XMLRPC传输协议,XMLRPC调用的执行由请求和应答两个阶段组成。XMLRPC客户端将方法调用请求发送给XMLRPC服务器,服务器会调用请求对应的方法。
- 具体实现过程:通过XMLRPC协议,订阅者可发现发布者,并与发布者协商共同支持的协议(TCPROS/UDPROS)。过程如下
- 1.运行ROS节点之前必须运行ROS Master
- 2.发布者在Master上注册要发布的主题(通过XMLRPC协议),Master保存发布者所在节点的URI和发布者发布的主题。
- 3.运行订阅者所在的节点,订阅者首先在Master上注册要订阅的主题,之后Master会查询保存的发布者,将主题匹配的发布者URI发送给订阅者。
- 4.订阅者根据Master提供的发布者所在节点的URI,与发布者协商共同支持的协议,即TCPROS或UDPROS
一名刚入门的小学生,从今天开始决定要深入理解ROS操作系统,如果有写的不好或者不对的地方,还请各位大神们帮忙批评改进。