购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 理解ROS计算图级别

ROS中的计算是使用ROS节点网络完成的。这种计算网络称为计算图。计算图中的主要概念是ROS的 节点、节点管理器、参数服务器、消息、主题、服务和消息记录包 。计算图中的每一个概念都以不同的方式构成了这个图。

ROS通信相关的功能包[包括核心客户端库(如roscpp和rospython),以及主题、节点、参数和服务等概念的实现]都包含在一个名为ros_comm(http://wiki.ros.org/ros_comm)的栈中。

该栈还包括rostopic、rosparam、rosservice和rosnode等工具,用于补充前面的概念。

ros_comm栈包含ROS通信中间件包,这些包统称为 ROS图层 ,如图1.6所示。

图1.6 ROS图层的结构

ROS图的概念介绍如下。

节点 :节点是具有计算功能的进程。每个ROS节点都是使用ROS客户端库编写的。使用客户端库API,我们可以实现不同的ROS功能,例如节点之间的通信方法,这在机器人的不同节点之间必须交换信息时特别有用。ROS节点的目标之一是构建简单的流程,而不是具有所有所需功能的大型流程。由于结构简单,因此ROS节点易于调试。

节点管理器 :ROS节点管理器为其余节点提供名称注册和查找过程。如果没有ROS节点管理器,节点将无法找到对方,也无法交换消息或调用服务。在分布式系统中,我们应该在一台计算机上运行节点管理器,其他远程节点可以通过与该节点管理器通信找到对方。

参数服务器 :参数服务器允许你将数据存储在中心位置。所有节点都可以访问和修改这些值。参数服务器是ROS节点管理器的一部分。

主题 :ROS中的每条消息都使用被称为主题的命名总线来传输。当一个节点通过一个主题发送消息时,我们可以说该节点正在发布一个主题。当一个节点通过一个主题接收到一条消息时,我们可以说该节点订阅了一个主题。发布节点和订阅节点不知道彼此的存在。我们甚至可以订阅一个可能没有任何发布者的主题。简而言之,信息的产生和接收是解耦的。每个主题都有一个唯一的名称,任何节点都可以访问该主题并通过它发送数据,只要它们具有正确的消息格式。

日志记录 :ROS提供了一个日志记录系统,用于存储数据(例如传感器数据),这些数据可能很难收集,但对于开发和测试机器人算法是必要的。这些文件被称为bagfile。当我们处理复杂的机器人机制时,bagfile非常有用。

图1.7显示了节点之间如何使用主题相互通信。

如你所见,主题用矩形表示,而节点用椭圆表示。此图中不包括消息和参数。这些类型的图可以使用名为rqt_graph的工具生成(http://wiki.ros.org/rqt_graph)。

1.3.1 ROS节点

ROS节点使用roscpp和rospy等ROS客户端库进行计算。

机器人可能包含许多节点。例如,一个节点处理摄像头图像,一个节点处理来自机器人的串行数据,一个节点计算里程计,等等。

使用节点可以使系统具有容错性。即使一个节点崩溃,整个机器人系统仍然可以工作。与整体代码相比,节点还可以降低复杂性并提高调试能力,因为每个节点只处理一个功能。

所有正在运行的节点都应该指定一个名称,以帮助我们识别它们。例如,/camera_node可以是广播摄像机图像的节点的名称。

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主题、服务、消息和actionlib等功能的ROS节点是如何工作的。

图1.7 使用主题的节点间通信图

1.3.2 ROS信息

如前所述,消息是包含字段类型的简单数据结构。ROS消息支持标准基本数据类型和它们的组合。

我们可以使用以下方法访问消息定义。例如,当使用roscpp时,要访问std_msgs/msg/String.msg,我们必须在字符串消息定义中包含std-msgs/String.h.

除了消息数据类型,ROS还使用MD5校验和比较来确认发布者和订阅者是否交换的是相同的消息数据类型。

ROS有一个名为rosmsg的内置工具,用于收集有关ROS消息的信息。以下是与rosmsg一起使用的一些参数。

●rosmsg show [message_type]:显示消息的描述。

●rosmsg list:列出所有消息。

●rosmsg md5 [message_type]:显示消息的md5sum。

●rosmsg package [package_name]:列出一个包中的消息。

●rosmsg packages [package_1] [package_2]:列出所有包含消息的包。

现在,让我们来看看ROS主题。

1.3.3 ROS主题

使用主题时,ROS的通信是单向的。如果我们想要直接的请求/响应通信,则需要实现ROS服务。

ROS节点与主题的通信使用基于TCP/IP的传输方式,称为 TCPTOS 。此方法是ROS中默认使用的传输方法。另一种类型的通信是 UDPROS ,它具有低延迟和松散传输的特点,只适合远程操作。

ROS主题工具可用于收集有关ROS主题的信息。以下是该命令的语法。

●rostopic bw/topic:显示给定主题使用的带宽。

●rostopic echo/topic:以人类可读的格式打印给定主题的内容。用户可以使用-p选项以CSV格式打印数据。

●rostopic find/message_type:使用给定的消息类型查找主题。

●rostopic hz/topic:显示给定主题的发布速率。

●rostopic info/topic:打印有关活动主题的信息。

●rostopic list:列出ROS系统中的所有活动主题。

●rostopic pub/topic message_type args:向特定消息类型的主题发布值。

●rostopic type/topic:显示给定主题的消息类型。

现在,让我们来看看ROS服务。

1.3.4 ROS服务

在ROS服务中,一个节点充当ROS服务器,服务客户端可以向服务器请求服务。如果服务器完成服务程序,它会将结果发送到服务客户端。例如,考虑一个节点,它可以计算接收的两个数字的总和,并以ROS服务的形式实现该功能。系统中的其他节点可能会通过该服务请求计算两个数字的总和。在这种情况下,主题用于流式传输连续的数据流。

ROS服务定义可以通过以下方法访问。例如my_package/srv/Image.srv可通过my_package/Image访问。

在ROS服务中,还有一项MD5校验和比较,用于检查节点。如果检验值匹配,服务器才对请求的客户端做出响应。

有两个ROS工具可用于收集有关ROS服务的信息。第一个工具是rossrv,它类似于rosmsg,可用于获取有关服务类型的信息。第二个工具是rosservice,可用于列出和查询正在运行的ROS服务。

让我们解释一下如何使用rosservice工具来收集有关正在运行的服务的信息。

●rosservice call/service args:使用给定的参数调用服务。

●rosservice find service_type:查找给定服务类型的服务。

●rosservice info/services:打印有关给定服务的信息。

●rosservice list:列出系统上运行的活动服务。

●rosservice type/service:打印给定服务的服务类型。

●rosservice uri/service:打印服务的ROSRPC URI。

现在,让我们来看看ROS的bag文件。

1.3.5 ROS bag文件

rosbag命令可用于处理rosbag文件。ROS中的bag文件用于存储按主题传输的ROS消息数据。这个.bag扩展名用于表示bag文件。

bag文件是使用rosbag record命令创建的,该命令将订阅一个或多个主题,并在收到消息时将其数据存储在文件中。该文件可以播放与录制主题相同的主题,还可以重新映射现有主题。

以下是录制和回放一个bag文件的命令。

●rosbag record [topic_1] [topic_2] -o [bag_name]:将给定的主题记录到命令提供的bag文件中。我们还可以使用-a参数记录所有主题。

●rosbag play [bag_name]:回放现有的bag文件。

在终端中使用以下命令可以找到完整、详细的命令列表:

我们可以使用一个GUI工具来处理如何记录和回放bag文件,称为rqt_bag。要了解有关rqt_bag的更多信息,请访问https://wiki.ros.org/rqt_bag.

1.3.6 ROS节点管理器

ROS节点管理器很像DNS服务器,因为它将唯一的名称和ID与系统中活动的ROS元素相关联。当ROS系统中的任何节点启动时,它将开始寻找ROS节点管理器,并在其中注册节点的名称。因此,ROS节点管理器拥有ROS系统上当前运行的所有节点的详细信息。当节点的任何详细信息发生更改时,它将生成一个回调,并用最新的详细信息更新节点。这些节点详细信息对于连接每个节点都很有用。

当一个节点开始发布某个主题时,该节点将向ROS节点管理器提供该主题的详细信息,例如其名称和数据类型。ROS节点管理器将检查是否有任何其他节点订阅了同一主题。如果有任何节点订阅了同一主题,ROS节点管理器将向订阅节点共享发布服务器的节点详细信息。获取节点详细信息后,这两个节点将被连接。在连接到两个节点后,ROS节点管理器就不再起作用了。根据要求,我们可以停止发布者节点或订阅者节点。停止任何节点后,它们将再次向ROS节点管理器报到。ROS服务也使用同样的方法。

正如我们已经说过的,节点是使用ROS客户端库编写的,比如roscpp和rospy。这些客户端使用基于 XML远程过程调用(XMLRPC) 的API与ROS节点管理器交互,这些API充当ROS系统API的后端。

ROS_MASTER_URI环境变量包含ROS节点管理器的IP和端口。使用此变量,ROS节点可以定位ROS节点管理器。如果该变量错误,节点之间将不会进行通信。当我们在单个系统中使用ROS时,可以使用localhost的IP或localhost本身的名称。但是在一个分布式网络中,计算是在不同的物理计算机上进行的,我们应该正确定义ROS_MASTER_URI,只有这样,远程节点才能找到彼此并相互通信。在一个分布式系统中,我们只需要一个节点管理器,它应该运行在一台所有其他计算机都可以正确ping它的计算机上,以确保远程ROS节点可以访问节点管理器。

图1.8显示了ROS节点管理器如何与发布节点和订阅节点交互,发布者节点发布带有Hello World消息的字符串类型主题,订阅者节点订阅此主题。

图1.8 ROS节点管理器与Hello World发布者和订阅者之间的通信

当发布者节点开始在特定主题中发布Hello World消息时,ROS节点管理器将获得该主题和节点的详细信息。它将检查是否有任何节点订阅同一主题。如果当时没有节点订阅同一主题,则两个节点将保持未连接状态。如果发布者节点和订阅者节点同时运行,ROS节点管理器将向订阅者交换发布者的详细信息,它们将通过ROS主题连接和交换数据。

1.3.7 使用ROS参数

在对机器人编程时,我们可能需要定义机器人参数来调整控制算法,比如机器人控制器获得标准比例-积分-微分控制器的P、I和D。当参数数量增加时,我们可能需要将它们存储为文件。在某些情况下,这些参数必须在两个或多个程序之间共享。在这种情况下,ROS提供了一个参数服务器,这是一个共享服务器,其中所有ROS节点都可以从该服务器访问参数。节点可以从参数服务器读取、写入、修改和删除参数值。

我们可以将这些参数存储在一个文件中,并将其加载到服务器中。服务器可以存储多种数据类型,甚至可以存储字典。程序员还可以设置参数的范围,比如设置为只能由该节点访问或所有节点都可以访问。

参数服务器支持以下XMLRPC数据类型:

●32位整型

●布尔值

●字符串

●双精度浮点型

●ISO8601日期型

●列表

●基于64位编码的二进制数据

我们还可以在参数服务器上存储字典。如果参数的数量很大,我们可以使用YAML文件来保存它们。以下是YAML文件参数定义的示例:

rosparam工具可用于从命令行获取和设置ROS参数。以下是使用ROS参数的命令。

●rosparam set [parameter_name] [value]:在给定参数中设置一个值。

●rosparam get [parameter_name]:从给定参数中检索一个值。

●rosparam load [YAML file]:ROS参数可以保存到YAML文件中。它可以使用此命令将它们加载到参数服务器中。

●rosparam dump [YAML file]:将现有ROS参数转储到YAML文件中。

●rosparam delete [parameter_name]:删除给定的参数。

●rosparam list:列出现有的参数名称。

当使用dyamic_reconfigure包执行使用这些参数的节点时,可以动态更改这些参数(http://wiki.ros.org/dynamic_reconfigure)。 BmGNofvHpfudrHNAufPL0x8GJPg5vPMqL0JhwQHr+W6KxkLp3oCU9112fjbE1fv2

点击中间区域
呼出菜单
上一章
目录
下一章
×