理解节点

目标: 了解ROS 2中节点的功能以及与之交互的工具。

教程级别: 初学者

时间: 10分钟

背景

1 ROS 2图

在接下来的几个教程中,您将了解一系列组成所谓“ROS (2)图”的核心ROS 2概念。

ROS图是一个由ROS 2元素组成的网络,这些元素同时处理数据。如果您将它们全部映射并可视化,它将包含所有可执行文件和它们之间的连接。

ROS 2中的两个节点

ROS中的每个节点应该负责一个单一的模块化功能,例如控制轮子马达或发布来自激光测距仪的传感器数据。每个节点可以通过主题(topics)、服务(services)、动作(actions)或参数(parameters)与其他节点进行数据的发送和接收。

../../../_images/Nodes-TopicandService.gif

一个完整的机器人系统由许多协同工作的节点组成。在ROS 2中,单个可执行文件(C++程序、Python程序等)可以包含一个或多个节点。

先决条件

上一篇教程 中,你可以了解如何安装这里使用的 turtlesim 包。

像往常一样,在 每个新开的终端中 都不要忘记加载 ROS 2 。

任务

1 ros2 run

命令``ros2 run``会从一个软件包中启动一个可执行文件。

ros2 run <package_name> <executable_name>

要运行turtlesim,请打开一个新的终端,并输入以下命令:

ros2 run turtlesim turtlesim_node

turtlesim窗口将会打开,就像你在:doc:`上一个教程<../Introducing-Turtlesim/Introducing-Turtlesim>`中看到的那样。

这里,包名是 使用 turtlesim 、 ros2 和 rqt,可执行文件名是 turtlesim_node

然而,我们还不知道节点名称。您可以使用 ros2 node list 命令查找节点名称。

2 ros2 node list

ros2 node list 命令将显示所有正在运行的节点的名称。当您想与节点进行交互或者系统运行多个节点时需要跟踪它们时,这特别有用。

在另一个终端中打开新的终端,同时 turtlesim 仍在运行,请输入以下命令:

ros2 node list

终端将返回节点名称:

/turtlesim

再打开一个新的终端,并使用以下命令启动 teleop 节点:

ros2 run turtlesim turtle_teleop_key

在这里,我们再次引用了“turtlesim”软件包,但这次我们的目标是名为“turtle_teleop_key”的可执行文件。

返回到之前运行``ros2 node list``的终端,再次运行该命令。你将会看到两个活动节点的名称:

/turtlesim
/teleop_turtle

2.1 重映射

重映射 允许你重新分配默认节点属性,如节点名称、话题名称、服务名称等,以自定义的值。在上一个教程中,你在``turtle_teleop_key``上使用了重映射来改变``cmd_vel``话题和目标节点为**turtle2**。

现在,让我们重新分配``/turtlesim``节点的名称。在一个新的终端中运行以下命令:

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

由于您再次调用``ros2 run``启动了turtlesim,将会打开另一个turtlesim窗口。但是,现在如果您返回到之前运行``ros2 node list``的终端,并再次运行该命令,您将看到三个节点名称:

/my_turtle
/turtlesim
/teleop_turtle

3. ros2节点信息

既然您知道了节点的名称,您可以使用以下命令访问有关它们的更多信息:

ros2 node info <node_name>

要查看您最新的节点``my_turtle``,请运行以下命令:

ros2 node info /my_turtle

``ros2 node info``返回订阅者、发布者、服务和动作的列表,即与该节点进行交互的ROS图连接。输出应该如下所示:

/my_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

现在尝试在``/teleop_turtle``节点上运行相同的命令,观察它的连接与``my_turtle``有何不同。

在即将进行的教程中,您将更多地了解ROS图连接概念,包括消息类型。

总结

节点是ROS 2中的基本元素,在机器人系统中具有单一的模块化功能。

在本教程中,您利用了``turtlesim``包中创建的节点,通过运行``turtlesim_node``和``turtle_teleop_key``可执行文件。

你学会了如何使用 ros2 node list 命令来发现活动节点的名称,以及使用 ros2 node info 命令来内省单个节点。这些工具对于理解复杂的实际机器人系统中的数据流非常重要。

下一步

现在你已经了解了ROS 2中的节点,可以继续阅读 topics tutorial。主题是连接节点的通信类型之一。