《精通ROS机器人编程(原书第2版) 》 —1.5 理解ROS的计算图

举报
华章计算机 发表于 2020/02/10 13:56:27 2020/02/10
【摘要】 本节书摘来自华章计算机《精通ROS机器人编程(原书第2版) 》 一书中第1章,第1.5.1节,作者是[印度]郎坦·约瑟夫(Lentin Joseph)[意大利]乔纳森·卡卡切(Jonathan Cacace),张新宇 张志杰 等译 。

1.5 理解ROS的计算图

ROS中的计算是通过进程网络实现的,每个进程为一个ROS节点。这样的计算网络称为计算图(graph)。计算图中的主要概念有:ROS节点(node)、ROS节点管理器(master)、参数服务器(parameter server)、消息(message)、话题(topic)、服务(service)和消息记录包(bag)。图中的每个概念都以不同的方式对此图做出贡献。

与ROS通信相关的软件包包括核心客户端库工具(如roscpp、rospython),以及话题、节点、参数、服务等概念的实现。这些软件包都包含在一个名为 ros_comm的软件包集中(http://wiki.ros.org/ros_comm)。

该软件包集还包括诸如 rostopic、rosparam、rosservice、rosnode之类的工具来呼应前面的概念。

ros_comm 软件包集包含了 ROS通信的中间件软件包,这些软件包统称为 ROS图层(Graph Layer),如图1-6所示。

 image.png

图1-6 ROS图层的结构

以下是图中每个概念的简要介绍:

节点(Node):节点对应于执行计算任务的进程。每个ROS节点都使用ROS客户端库来编写。使用客户端库提供的API,我们可以实现ROS的各种功能,例如节点间通信。当一个机器人的不同节点间交换信息时,这种节点间的通信就显得尤为有用。利用这种ROS通信方式,节点间可以相互通信并交换数据。ROS节点的作用之一是构建多个简单的进程,而不是一个具有所有功能的大进程。因此ROS节点结构简单,易于调试。

节点管理器(Master):节点管理器用于所有其他节点的名称注册和查找。如果没有ROS节点管理器,节点将无法找到对方,也无法交换消息或请求服务。在分布式系统中,节点管理器仅运行在某一台电脑上,而其他远程节点通过与节点管理器通信来找到彼此。

参数服务器(Parameter Server):用户可以利用参数服务器将数据统一存储在一个地方。所有节点都可以访问和修改这些参数值。参数服务器是ROS节点管理器的一部分。

消息(Message): 节点间通过消息实现相互通信。消息是一种包含字段类型的数据结构,它可以保存一组数据,也可以将数据发送到其他节点。ROS消息支持一些标准的数据类型(如整型、浮点型、布尔类型等)。我们还可以利用这些标准的数据类型构建自己的消息类型。

话题(Topic):ROS 中的每条消息都使用被称为“话题”的特定总线进行传输。当节点通过话题发送消息时,我们可以说该节点正在发布话题。当某一节点通过话题接收消息时,我们可以说该节点正在订阅话题。发布节点和订阅节点不知道彼此的存在。我们甚至可以订阅一个没有任何发布者的话题。简而言之,消息的产生和获取是分离的。每个话题都有一个唯一的名称,任何节点都可以访问此话题并通过它发送数据,前提是它们具有正确的消息类型。

服务(Service):在某些机器人应用系统中,发布/订阅的通信模型不一定合适。例如,在某些情况下,我们需要一种请求/应答的交互方式,即其中一个节点可能向另一个节点请求执行某一个快速过程(如请求一些快速的计算)。基于ROS服务的交互方式就像远程过程调用。

日志(Logging):ROS 提供了一个用于存储数据的记录系统,如记录传感器数据。这些数据可能很难收集,但对于开发和测试机器人算法来说又是必不可少的。当涉及复杂的机器人时,消息记录包对于ROS开发是非常有用的。

图1-7展示了节点间如何使用话题相互通信。话题显示在矩形中,节点用椭圆表示。此图中不包括消息和参数信息。这种类型的图可以通过调用名为rqt_graph(http://wiki.ros.org/rqt_graph)的工具来生成。

 image.png

图1-7 基于话题的节点间的通信图

1.5.1 ROS节点

ROS节点是使用ROS客户端库(如 roscpp 或 rospy)编写的执行某种计算的进程。一个节点可以利用ROS 话题、ROS服务和ROS参数与其他节点通信。

一个机器人可能包含很多节点。例如,一个节点处理来自摄像头的图像,一个节点处理来自机器人的串口数据,一个节点则可以用来计算里程计信息等。

使用节点可以提高系统的容错能力。即使有一个节点崩溃,整个机器人系统仍然可以运转。与整体代码相比,由于每个节点只处理单个功能,节点机制还可以降低代码复杂性并降低调试难度。

所有正在运行的节点都应该有唯一的名称,以便区别系统中的其他节点。例如,

/camera_node 可以是广播相机图像的节点名称。

ROS中的小工具rosbash与 ROS 节点对应。其中,rosnode 命令可用于获取有关ROS节点的信息。以下是 rosnode 的用法:

$ rosnode info [node_name]:打印节点的相关信息。

$ rosnode kill [node_name]:强行终止一个正在运行的节点。

$ rosnode list:列出正在运行的节点。

$ rosnode machine [machine_name]:列出运行在某个机器上或多个机器人上的节点。

$ rosnode ping:检查节点的连通性。

$ rosnode cleanup:清除无法访问的节点注册信息。

后面,我们会用 roscpp编写节点示例,讨论当使用ROS话题、ROS服务、ROS消息和 actionlib 等功能时,ROS节点的工作机制。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。