购买
下载掌阅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)。 l0peZxj23bUeZ4cX4S7Rx/Alg4A4Ya8U8y0M1BiCFbp+7zIH2cby/4hOa/wq1HE8



1.4 ROS社区级别

这些都是ROS资源,在ROS社区中能够交流软件和知识。这些社区的各种资源如下。

发行版 :与Linux发行版类似,ROS发行版是我们可以安装的版本化元软件包的集合。ROS发行版允许我们轻松安装和收集ROS软件。它们通过软件集合维护一致的版本。

存储库 :ROS依赖于代码存储库的联合网络,不同机构可以在其中开发和发布自己的机器人软件组件。

The ROS Wiki :ROS Wiki社区是记录ROS信息的主要论坛。任何人都可以注册一个账户、贡献自己的文档、提供更正或更新、编写教程等。

错误记录系统 :如果我们在现有软件中发现错误,或需要添加新功能,则可以使用此资源。

邮件列表 :我们可以使用ROS用户邮件列表询问有关ROS软件的问题,并向社区分享程序问题。

ROS问答 :这个网站资源可以帮助读者提出与ROS相关的问题。如果我们在这个网站上发布自己的疑问,其他ROS用户就可以看到它们并提供解决方案。

博客 :ROS博客更新与ROS社区相关的新闻、照片和视频(http://www.ros.org/news)。

现在,让我们来看看学习ROS需要做的准备工作。 l0peZxj23bUeZ4cX4S7Rx/Alg4A4Ya8U8y0M1BiCFbp+7zIH2cby/4hOa/wq1HE8



1.5 准备工作

在开始使用ROS并尝试本书的代码之前,应先做以下准备工作。

Ubuntu 20.04 LTS/Debian 10 :ROS支持Ubuntu和Debian操作系统。我们更喜欢坚持用Ubuntu的LTS(长期支持)版本,即Ubuntu 20.04。

ROS Noetic桌面完整安装 :安装ROS的完整桌面。我们更喜欢的版本是ROS Noetic,这是本书写作时最新的稳定版本。以下链接提供了该ROS发行版的安装说明:http://wiki.ros.org/noetic/Installation/Ubuntu。从存储库列表中选择ros-noetic-desktop-full功能包。

让我们看看ROS框架的不同版本。

1.5.1 ROS发行版

ROS更新与新的ROS发行版一起发布。ROS的新发行版由其核心软件的更新版本和一套新的/更新的ROS功能包组成。ROS的发布周期与Ubuntu Linux发行版相同:每6个月发布一个新版本。通常情况下,对于每个Ubuntu LTS版本,都会发布一个LTS版本的ROS。 LTS 意味着发布的软件将被长期维护(对于ROS和Ubuntu来说为5年)。

本书的教程基于写作时ROS的最新LTS版本,即ROS Noetic Ninjemys。它代表了第13个ROS发行版本。部分ROS发行版的列表如图1.9所示。

图1.9 部分ROS发行版

1.5.2 运行ROS节点管理器和ROS参数服务器

在运行任何ROS节点之前,我们应该启动ROS节点管理器和ROS参数服务器。我们可以使用一个名为roscore的命令启动ROS节点管理器和ROS参数服务器,该命令将启动以下程序:

●ROS节点管理器

●ROS参数服务器

●rosout日志记录节点

rosout节点将从其他ROS节点收集日志消息,并将其存储在日志文件中,还会把收集的日志消息转播到另一个主题。/rosout主题由ROS节点使用roscpp和rospy等ROS客户端库发布,这个主题由rosout节点订阅,该节点在另一个名为/rosout_agg的主题中转播这些消息。/rosout_agg主题包含日志消息的聚合流。roscore命令应作为运行任何ROS节点的先决条件运行。图1.10显示了在终端中运行roscore命令时打印的消息。

使用以下命令在Linux终端上运行roscore:

运行此命令后,我们将在Linux终端中看到如图1.10所示的文本。

图1.10 运行roscore命令时的终端消息

以下是图中各部分的说明。

●在第1部分中,我们可以看到~/.ros/log文件夹中创建了一个日志文件,用于从ROS节点收集日志。此文件可用于调试。

●在第2部分中,该命令启动了一个名为roscore.xml的ROS启动文件。这个文件启动时,它会自动启动rosmaster和ROS参数服务器。roslaunch命令是一个Python脚本,只要它尝试执行启动文件,它就会启动rosmaster和ROS参数服务器。本部分还显示了端口内ROS参数服务器的地址。

●在第3部分中,我们可以看到rosdistro和rosversion等参数在终端中显示。这些参数在执行roscore.xml时就会显示出来。我们会在1.5.3节详细介绍roscore.xml。

●在第4部分中,我们可以看到rosmaster节点是用ROS_MASTER_URI启动的,之前我们将其定义为一个环境变量。

●在第5部分中,我们可以看到rosout节点正在启动,它将开始订阅/rosout主题并将其转播到/rosout_agg。

以下是roscore.xml的内容:

在执行roscore命令时,一开始,该命令会检查命令行参数,以获取rosmaster的新端口号。如果它得到了端口号,它就将开始监听新的端口号;否则,它将使用默认端口号。这个端口号和roscore.xml启动文件将被传递到roslaunch系统。roslaunch系统在Python模块中实现,它将解析端口号并启动roscore.xml文件。

在roscore.xml文件中,ROS参数和节点被封装在一个带有/namespace的组XML标记中。组XML标记表示此标记中的所有节点都具有相同的设置。

rosversion和rosdistro参数使用命令(command)标签存储rosversionroslaunch和rosversion-d命令的输出,命令标签是ROS param标签的一部分。command标签将执行其中提到的命令,并将命令的输出存储在这两个参数中。

rosmaster和参数服务器通过ROS_MASTER_URI地址在roslaunch模块内执行。这发生在roslaunch Python模块内部。ROS_MASTER_URI是rosmaster将要监听的IP地址和端口的组合。端口号可以根据roscore命令中给定的端口号进行更改。

1.5.3 检查roscore命令的输出

我们来看看运行roscore后创建的ROS主题和ROS参数。以下命令将列出终端中的活动主题:

根据我们对rosout节点的订阅/rosout主题的讨论,主题列表如下。它包含来自ROS节点的所有日志消息,/rosout_agg将转播这些日志消息:

以下命令列出了运行roscore时可用的参数:

这里提到的这些参数可以提供ROS发行版的名称、版本、roslaunch服务器地址和run_id,其中run_id是一个与特定roscore运行相关联的唯一ID:

运行roscore时生成的ROS服务列表可以使用以下命令进行检查:

正在运行的服务列表如下所示:

这些ROS服务是为每个ROS节点生成的,用于设置日志记录级别。 l0peZxj23bUeZ4cX4S7Rx/Alg4A4Ya8U8y0M1BiCFbp+7zIH2cby/4hOa/wq1HE8

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