ROS引入通信机制,是为了实现ROS节点(进程)之间的通信。利用ROS进程的分布式框架,可以使得每个进程独立的工作,甚至分布于不同的主机工作。机器人上的各种传感器,比如雷达、GPS等,需要传递数据以实现对机器人的合理控制,进程通信的实现则是其中传输数据的关键。
ROS的基本通信方式将分为三种:
1.话题通信(发布订阅模式)
2.服务通信(请求响应模式)
3.参数服务器(参数共享模式)
接下来将会详细介绍三种通信方式的理论模型
话题通信,一般就是指:一个节点发布消息,另一个节点订阅该消息。适用于不断更新的、少逻辑处理的数据传输场景。
话题通信涉及到三个角色。
Talker(发布者)
负责像订阅者发布数据。
Listener(订阅者)
负责接收发布者的数据。
ROS Master(管理者)
负责保管发布者和订阅者注册的信息,并匹配话题相同的发布者与订阅者,帮助发布者与订阅者建立连接。
下图就是话题通信建立的示意图,摘抄自课程笔记。
发布者在管理者处注册,其中包含所发布消息的话题名称。管理者会将节点的注册信息加入到注册表中。
订阅者在管理者处注册,包含需要订阅消息的话题名称。管理者会将节点的注册信息加入到注册表中。
管理者根据注册表中的发布者、订阅者的话题名称进行匹配,并将发布者的地址信息告诉订阅者。
订阅者向发布者发送连接请求,传输订阅的话题名称、消息类型以及通信协议(TCP/UDP)。
发布者响应订阅者的请求,并发送自身的 TCP 地址信息。
订阅者根据步骤4 返回的消息使用 TCP 与发布者建立网络连接。
连接建立以后,发布者向订阅者发送信息。
1.step0与step1没有先后顺序的要求,即发布者和订阅者的启动没有先后的要求
2.只有当发布者和订阅者的话题名称相同时才能进行话题通信
3.发布者和订阅者可以有多个
4.发布者和订阅者关闭以后就不再需要管理者,即使管理者关闭,话题通信仍能进行。
5.在代码编写中,我们关注的一般是话题、消息传输的格式等等,而发布者和订阅者所建立连接的过程是被封装好的。
服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。一般用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。
和话题通信相似,服务通信也有三个角色
client(客户端)
负责向服务端发送请求,并接收服务端发送的数据。
server(服务端)
负责接收处理请求,并对客户端做出响应。
ROS Master(管理者)
负责保管客户端和服务端注册的信息,并匹配话题相同的客户端与服务端,帮助客户端与服务端建立连接。
下图就是服务通信建立的示意图,摘抄自课程笔记。
服务端启动,在管理者处注册,其中包含提供的服务的名称。管理者会将节点的注册信息加入到注册表中。
客户端启动,在管理者处注册,其中包含请求的服务的名称。管理者会将节点的注册信息加入到注册表中。
管理者根据服务端和客户端的服务名称进行匹配,并将服务端的地址信息告知客户端。
客户端与服务端进行网络连接,并发送有关请求。
服务端处理请求数据,产生响应并发送给客户端。
1.客户端请求被处理时,要保证服务端已经启动
2.服务端和客户端都可以存在多个
参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。参数服务器一般用于存储一些多节点共享的数据,类似于全局变量。
ROS Master (管理者)
管理者作为一个公共的容器保存数据
Talker (参数设置者)
参数设置者往容器中存储数据
Listener (参数调用者)
参数调用者读取容器中所需的数据
如图所示,是参数服务器的模型
参数设置者向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中。
参数调用者向参数服务器发送参数查找请求,请求中包含要查找的参数名。
ROS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果发送给参数调用者。
32-bit integers
booleans
strings
doubles
iso8601 dates
lists
base64-encoded binary data
字典
1.参数服务器不再是talker与listener之间传输数据
2.参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据