PS:这是迄今看到的关于ROS通信原理讲解的最通俗易懂的博客,强烈推荐~
ROS
可以形象的描述为一个工厂的运行机制,创建好一个工作空间(workspace
)就像一个工厂,工厂里又有好多个生产车间,每个功能包(pkg
)看作是一个生产车间,每个生产车间又有好多工人在配合,每个节点(node
)看作是一个工人,节点是又是可执行程序的最小单位,工人们之间相互沟通通过消息(mesage
)来完成。
1. 话题(topic)
话题是单向的,一般用于连续发送数据的传感器,建立一次联系后,一个发布者可以向多个订阅者发送信息,同样,一个订阅者也可以订阅多个发布者的消息。
2. 服务(service)
服务是同步双向的通信机制,服务器只有在有请求的时候才响应,客户端在发出请求后才接受响应。当服务的请求和响应完成时,两个连接点自动断开。
3. 动作(action)
动作的通讯方式与服务有类似的情况,不同的是动作服务器收到请求后直至完成响应所需时间较长,中途需要反馈给客户端目前完成的情况,报告当前的现状。
由以上三种通讯方式完成ROS
节点间的信息交流。
但是发布者,订阅者,服务服务器,服务客户端,动作服务器,动作客户端分布在不同的节点中。这些节点需要一个让它们建立联系的主节点构建通信的桥梁。
分布在外面的不同节点,向主节点注册自己的信息,以便其它节点访问,同时向主节点获取那些访问自己节点的信息。获取后节点和节点间就可以通讯,不再需要主节点。
4. 通信步骤
一:运行主节点roscore,声明自己的RPC地址URI:
二:订阅者节点通过RPC向主节点注册信息,告诉自己的节点名称、话题名称、消息类型及自己的RPC的URL地址和端口:
运行小乌龟节点,向主节点注册自身信息,rosrun turtlesim turtlesim_node
:
三:发布者节点通过RPC向主节点注册信息,告诉自己的节点名称、话题名称、消息类型及自己RPC的URL地址和端口:
运行键盘控制节点,向主节点注册键盘的信息,rosrun turtlesim turtle_teleop_key
:
四:通知发布者消息,主节点通过RPC向小乌龟节点发送小乌龟希望访问的键盘发布者的节点名称,话题名称,消息类型和键盘的RPC地址和端口:
即主节点将键盘信息告知小乌龟:
五:小乌龟(订阅者)得知键盘(发布者)要向自己发送信息,通过上面得知的键盘的RPC地址和端口向发布者请求直连,将小乌龟自己的节点名称、话题名称、和消息类型及TCP/IP地址端口告知键盘发布者,并请求获得键盘的TCP/IP地址的端口:
告知的过程仍采用RPC通信:
六:键盘发布者将响应小乌龟索要自己的TCP/IP地址端口的请求,将TCP服务器的URL地址和端口作为连接响应发送给小乌龟订阅者:
但在这次告知小乌龟的过程仍采用RPC通信:
七:当小乌龟和键盘节点都知道了对方的TCP/IP地址及端口后不再走RPC通信,之后将通过TCP/IP通讯接收键盘发送的运动信号:
可以用rqt_graph
查看节点关系图:
总的小乌龟节点模型为:
话题、服务、动作最终的通讯都是建立在以上的连接过程。发布者,订阅者,服务服务器,服务客户端,动作服务器,动作客户端分布节点中的通讯建立过程都是基于节点单位来建立的,在建立好通讯后才执行各自的信息交流。
总结
发送消息:
服务请求和响应:
动作的目标、结果、反馈: