ROS可以形象的描述为一个工厂的运行机制,创建好一个工作空间(workspace)就像一个工厂,工厂里又有好多个生产车间,每个功能包(pkg)看作是一个生产车间,每个生产车间又有好多工人在配合,每个节点(node)看作是一个工人,节点是又是可执行程序的最小单位,工人们之间相互沟通通过消息(mesage)来完成.

ros系统架构 ros原理_服务器

  • 话题(topic)

  话题是单向的,一般用于连续发送数据的传感器,建立一次联系后,一个发布者可以向多个订阅者发送信息,同样,一个订阅者也可以订阅多个发布者的消息。

ros系统架构 ros原理_ros系统架构_02

  • 服务(service)

  服务是同步双向的通信机制,服务器只有在有请求的时候才响应,客户端在发出请求后才接受响应。当服务的请求和响应完成时,两个连接点自动断开。

 

ros系统架构 ros原理_ros系统架构_03

 

  •  动作(action)

  动作的通讯方式与服务有类似的情况,不同的是服务器收到请求后直至完成响应所需时间较长,中途需要反馈给客户端目前完成的情况,报告当前的现状。

ros系统架构 ros原理_RPC_04

  • 由以上三种通讯方式完成ROS节点间的信息交流,但是发布者,订阅者,服务服务器,服务客户端,动作服务器,动作客户端分布在不同的节点中。这些节点需要一个让它们建立联系的主节点构建通信的桥梁。分布在外面的不同节点,向主节点注册自己的信息,以便其它节点访问,同时向主节点获取那些访问自己节点的信息。获取后节点和节点间就可以通讯,不再需要主节点。

ros系统架构 ros原理_TCP_05

 通信步骤1:运行主节点roscore,声明自己的RPC地址URI。

ros系统架构 ros原理_ros系统架构_06

 

ros系统架构 ros原理_服务器_07

通信步骤2:订阅者节点通过RPC向主节点注册信息,告诉自己的节点名称、话题名称、消息类型及自己的RPC的URL地址和端口,运行小乌龟节点,向主节点注册自身信息,rosrun turtlesim turtlesim_node. 

ros系统架构 ros原理_RPC_08

ros系统架构 ros原理_ros系统架构_09

 

ros系统架构 ros原理_RPC_10

 

 通信步骤3:发布者节点通过RPC向主节点注册信息,告诉自己的节点名称、话题名称、消息类型及自己RPC的URL地址和端口,运行键盘控制节点,向主节点注册键盘的信息rosrun turtlesim turtle_teleop_key

ros系统架构 ros原理_RPC_11

ros系统架构 ros原理_TCP_12

通信步骤4:通知发布者消息,主节点通过RPC向小乌龟节点发送小乌龟希望访问的键盘发布者的节点名称,话题名称,消息类型和键盘的RPC地址和端口,即主节点将键盘信息告知小乌龟。

ros系统架构 ros原理_TCP_13

 通信步骤5:小乌龟(订阅者)得知键盘(发布者)要向自己发送信息,通过上面得知的键盘的RPC地址和端口向发布者请求直连,将小乌龟自己的节点名称、话题名称、和消息类型及TCP/IP地址端口告知键盘发布者,并请求获得键盘的TCP/IP地址的端口。告知的过程仍采用RPC通信。

ros系统架构 ros原理_ros系统架构_14

 通信步骤5:键盘发布者将响应小乌龟索要自己的TCP/IP地址端口的请求,将TCP服务器的URL地址和端口作为连接响应发送给小乌龟订阅者。但在这次告知小乌龟的过程仍采用RPC通信。

ros系统架构 ros原理_RPC_15

 通信建立完成6:当小乌龟和键盘节点都知道了对方的TCP/IP地址及端口后不在走RPC通信,之后将通过TCP/IP通讯接受键盘发送的运动信号。可以用rqt_graph查看节点关系图

ros系统架构 ros原理_TCP_16

ros系统架构 ros原理_TCP_17

ros系统架构 ros原理_ros系统架构_18

 

  总的小乌龟节点模型为:

ros系统架构 ros原理_服务器_19

 话题服务动作最终的通讯都是建立在以上的连接过程,发布者,订阅者,服务服务器,服务客户端,动作服务器,动作客户端分布节点中的,通讯建立过程都是基于节点单位来建立的在建立好通讯后才执行各自的信息交流。

发送消息:

ros系统架构 ros原理_RPC_20

服务请求和响应;

ros系统架构 ros原理_TCP_21

 

动作的目标、结果、反馈:

 

ros系统架构 ros原理_ros系统架构_22