机器人操作系统Computation Graph Computation Graph Level(计算图)就是用ROS的P2P(peer-to-peer网络传输协议)网络集中处理所有的数据
基本的Computation Graph的概念包括Node, Master, Parameter Server,messages, services, topics, 和bags, 以上所有的这些都以不同的方式给Graph传输数据
Nodes: Nodes(节点)是一系列运行中的程序
ROS被设计成在一定颗粒度下的模块化系统
一个机器人控制系统通常包含许多Nodes
比如一个Node控制激光雷达,一个Node控制车轮马达,一个Node处理定位,一个Node执行路径规划,另外一个提供图形化界面等等
一个ROS节点是由Libraries ROS client library写成的, 例如 roscpp和rospy
Master: ROS Master 提供了登记列表和对其他计算图的查找
没有Master,节点将无法找到其他节点,交换消息或调用服务
Server Parameter Server: 参数服务器使数据按照钥匙的方式存储
参数服务器是主持的组成部分
Messages:节点之间通过messages来传递消息
一个message是一个简单的数据结构,包含一些归类定义的区
支持标准的原始数据类型(整数、浮点数、布尔数,等)和原始数组类型
message可以包含任意的嵌套结构和数组(很类似于C语言的结构structs)Topics: Messages以一种发布/订阅的方式传递
一个node可以在一个给定的topic中发布消息
Topic是一个name被用于描述消息内容
一个node针对某个topic关注与订阅特定类型的数据
可能同时有多个node发布或者订阅同一个topic的消息;也可能有一个node同时发布或订阅多个topic
总体上,发布者和订阅者不了解彼此的存在
主要的概念在于将信息的发布者和需求者解耦、分离
逻辑上,topic可以看作是一个严格规范化的消息bus
每个bus有一个名字,每个node都可以连接到bus发送和接受符合标准类型的消息
Services:发布/订阅模型是很灵活的通讯模式,但是多对多,单向传输对于分布式系统中经常需要的“请求/回应”式的交互来说并不合适
因此,“请求/回应” 是通过services来实现的
这种通讯的定义是一种成对的消息:一个用于请求,一个用于回应
假设一个节点提供了一个服务提供下一个name和客户使用服务发送请求消息并等待答复
ROS的客户库通常以一种远程调用的方式提供这样的交互
Bags: Bags是一种格式,用于存储和播放ROS消息
对于储存数据来说Bags是一种很重要的机制
例如传感器数据很难收集但却是开发与测试中必须的
在ROS的计算图中,ROS的Master以一个name service的方式工作
它给ROS的节点存储了topics和service的注册信息
Nodes 与Master通信从而报告它们的注册信息
当这些节点与master通信的时候,它们可以接收关于其他以注册节点的信息并且建立与其它以注册节点之间的联系
当这些注册信息改变时Master也会回馈这些节点,同时允许节点动态创建与新节点之间的连接
节点之间的连接是直接的; Master仅仅提供了查询信息,就像一个DNS服务器
节点订阅一个topic将会要求建立一个与发布该topics的节点的连接,并且将会在同意连接协议的基础上建立该连接
ROS里面使用最广的连接协议是TCPROS,这个协议使用标准的TCP/IP 接口
这样的架构允许解耦操作(decoupled operation),通过这种方式大型或是更为复杂的系统得以建立,其中names方式是一种行之有效的手段
names方式在ROS系统中扮演极为重要的角色: topics, services, and parameters 都有各自的names
每一个ROS客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行
例如,为了控制一个北阳激光测距仪(Hokuyo laser range-finder),我们可以启动这个hokuyo_node 驱动,这个驱动可以给与激光仪进行对话并且在"扫描"topic下可以发布sensor_msgs/LaserScan 的信息
为了处理数据,我们也许会写一个使用laser_filters的node来订阅"扫描"topic的信息
订阅之后,我们的过滤器将会自动开始接收激光仪的信息
注意两边是如何脱钩工作的
所有的hokuyo_node的节点都会完成发布"扫描",不需要知道是否有节点被订阅了
所有的过滤器都会完成"扫描"的订阅,不论知道还是不知道是否有节点在发布"扫描"
在不引发任何错误的情况下,这两个nodes可以任何的顺序启动,终止,或者重启
以后我们也许会给我们的机器人加入另外一个激光器,这会导致我们重新设置我们的系统
我们所需要做的就是重新映射已经使用过的names
当我们开始我们的第一个hokuyo_node时,我们可以说它用base_scan代替了映射扫描,并且和我们的过滤器节点做相同的事
这些节点将会用base_scan的topic来通信从而代替,并且将不再监听"扫描"topic的信息
然后我们就可以为我们的新激光测距仪启动另外一个hokuyo_node
以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。