从计算图(Graph)级的角度来看,ROS的本质就是一个基于网络的数据流动控制器。它的核心roscore其实就相当于一个服务器(Server),主导着数据的流动,每一个程序都相当于一个客户(Client),客户之间需要通信,如发送文字、图片、语音等。
ROS2中涉及到的基本概念有:节点(Node)、话题(Topic)、消息(Message)、服务(Service)和发现(Discovery)。
下面分别予以介绍:
1、节点(Node)
节点是一些执行运算任务的进程,有着数据的输入和输出。也就是说,节点就是一个数据传输和处理的程序,你可以把ROS系统理解为一张巨大的网络,在这个网络中我们有着众多的节点,网络中流动着数据。
查看节点的详细信息命令:
$ ros2 node info /rosout
结果如下:
Node [/rosout]
Publications:
* /rosout_agg [rosgraph_msgs/Log]
Subscriptions:
* /rosout [unknown type]
Services:
* /rosout/set_logger_level
* /rosout/get_loggers
contacting node http://machine_name:54614/ ...
Pid: 5092
---------------------
转自https://blog.csdn.net/sad490/article/details/79829497
可以看到,节点包含的信息:节点的发布的话题,以及话题中所包含信息的类型,还有这个节点所订阅(Subscribe)的话题(Topic),还包含着节点包含的服务。
节点也可以被称之为“软件模块”。我们使用“节点”使得基于ROS的系统在运行的时候更加形象化:当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表,在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。
2、消息(Message)
节点之间是通过传送消息进行通讯的。每一个消息都是一个严格的数据结构。原来标准的数据类型(整型,浮点型,布尔型等等)都是支持的,同时也支持原始数组类型。消息可以包含任意的嵌套结构和数组(很类似于C语言的结构structs)。
使用如下命令就可以看到某一种类型所包含的数据类型:
ros2 msg show visualization_msgs/InteractiveMarkerControl
3、主题(Topic)
Topic和C++中的数据流很像,在每一个Topic中,流动着重要的数据,如果某一个程序(其实就是节点)想要了解关于这个话题的数据,就订阅它,然后,你就可以获取所感兴趣的数据了。由此对于一个话题,有发布、订阅、查看信息等操作。
消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在
发布主题命令:
ros2 topic pub /chatter std_msgs/String "data: Hello world"
查看主题内容命令:
ros2 topic echo /chatter
查看主题的一些信息:
ros2 topic info /chatter
4、服务(Service)
虽然基于话题的发布/订阅模型是很灵活的通讯模式,但是它广播式的路径规划对于可以简化节点设计的同步传输模式并不适合。在ROS中,我们称之为一个服务,用一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于web服务器,web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一个服务:只有一个服务可以称之为“分类象征”,比如说,任意一个给出的URI地址只能有一个web服务器。
5、发现(Discovery)
ROS2里是没有master的,那么节点之间是怎么知道彼此存在的呢?这就全靠一种自动发现的机制——Discovery。什么意思呢?简单来说,当一个节点启动后,首先在网络中发条广播,大声告诉这个世界我来了,其他节点听到之后,也纷纷反馈各自的信息,这样一来二去也就联系上了。当然,万一哪个节点掉线了怎们办?没关系,每个节点都会周期性的发布广播,告诉其他节点他还在线,就算要下线,他也会广播告诉其他节点他要走了,下次再聊。总之,发现(Discovery)可以理解为一种身份声明和响应的机制。
另外,再来介绍两个文件系统级的基本概念。
ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式。
ROS中有无数的节点、消息、服务、工具和库文件,需要有效的结构去管理这些代码。在ROS的文件系统级,有两个重要概念:包(package)、堆(stack)。
6、包(package)
ROS的软件以包的方式组织起来。包包含节点、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。包的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的包短小精干。
7、堆(stack)
堆是包的集合,它提供一个完整的功能,像“navigation stack”。Stack与版本号关联,同时也是如何发行ROS软件方式的关键。
ROS是一种分布式处理框架。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到包(Packages)和堆(Stacks)中,以便于共享和分发。下图是在包和堆在文件中的具体结构:
Manifests (manifest.xml):提供关于Package元数据,包括它的许可信息和Package之间依赖关系,以及语言特性信息像编译旗帜(编译优化参数)。
Stack manifests (stack.xml):提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。
参考博客:
①https://blog.csdn.net/hcx25909/article/details/8795211
②https://blog.csdn.net/sad490/article/details/81475280
③https://blog.csdn.net/sad490/article/details/79829497