由于本人学习接触ROS时间不长,研究的也不深,在这里仅记录自己关于ROS的一些理解与思考。
ros系统中有几个重要的概念:节点(node)、消息(message)、主题(topic)、服务(service)。接下来一个一个介绍。
1、节点
节点就是一些直行运行任务的进程。节点也可以称之为“软件模块”。节点的数量可以增加与减少,当许多节点同时运行时,可以很方便的将端到端的通讯绘制成一个图表,在这个图表中,进程就是图表上你的节点,而端到端的连接关系就是其中弧线连接。
2、消息
节点之间是通过传递消息进行通讯的。每一个消息都是一个严格的数据结构。原来标准的数据类型(int, float, string, bool …)都是支持的,消息可以包含任意的嵌套结构和数组。
3、主题
消息是以一种发布/订阅的方式传递的。一个节点可以在一个给定的主题中发布消息,也可以在给定的主题上订阅消息。可能同时有多个节点发布或者订阅相同的主题上的消息。发布者与订阅者不知道彼此的存在,他们只管发布或订阅自己被设定的消息。
4、服务
虽然基于话题的发布/订阅模式是很灵活的通讯模式,但是它广播的路径规划对于可以简化节点设计的同步传输模式并不适合。在ROS中,我们称之为一个服务,用一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于web服务器,web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一个服务:只有一个服务可以称之为“分类象征”,比如说,任意一个给出的URI地址只能有一个web服务器。
在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)。
ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。
理解
根据对ros的学习与应用情况,对其有一下几点认识:
1)每个节点可以发布多个消息,也可以订阅多个消息,视自己应用需求而定,没有限制。
2)消息发布者发布的消息传递的速度很快,基本上只受消息在系统中的流动速度影响,所以消息一经发布,基本上就能到达订阅者处,所以消息发布队列基本不会堵塞。
3)消息订阅者对每个消息的到来都会执行回调函数(callback),这个函数可以理解为另开了一个线程,进行相应处理。消息订阅者可能会产生消息堵塞,因为每当消息到来,回调函数执行需要时间,处理完上一个消息才会处理下一个消息,所以订阅者部分消息队列长度的设置需要注意。
4)客户-服务模式即为客户发布要求,服务器对要求进行处理,并返回结果(注意,此处有返回结果, 消息模式无返回结果)。服务器每接受到请求,执行回调函数(callback),同消息订阅者相同,可能产生消息堵塞。
5)消息订阅者与服务器都有回调函数(callback),这就涉及到收到消息后如何调用回调函数。就我了解,ROS有三种方式:
1 ros::spin(); 让这个节点一直等待消息的到来,消息一旦到来便开始处理。一般用在此节点只处理消息,没有其他任务需要执行
2 ros::spinOnce(); 让这个节点在这个函数出现的地方调用所有的回调函数,当然如果没有消息到来也便不会运行,这样可以在我们想要执行回调函数的地方执行。一般用在此节点有其他任务需要进行,不能一直等着消息,只能在某个特定的地方调用回调函数
3 定时回调函数; 每间隔一段时间便调用一次回调函数。
以上三种方式各有用处,根据自己的需要选用,具体使用方法可以百度或google之。
6)使用ros系统不需要显式地使用多线程编程。如果你觉得你的应用需要用多线程实现,那多半可以通过增加节点的方式实现。具体方式如下:将你认为需要另开线程实现的部分写成另一个节点,并设置其为消息订阅者或服务器,将需要实现的操作写为回调函数,由原节点向其传递消息或请求,当其接受到消息或请求,调用回调函数,由此实现相关操作。
ROS还有许多细节与内容,具体内容可以看书或百度之,不必一一记录。