You're reading the documentation for a development version. For the latest released version, please have a look at Galactic.

理解 ROS2 节点

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

Tutorial level: Beginner

Time: 10 minutes

背景

1 ROS 2 graph

在接下来的教程中,你将学习一系列构成 “ROS2 graph” 的核心 ROS 2 概念。

ROS graph 是一个由 ROS 2 元素组成的网络,在同一时间一起处理数据。它包含所有可执行文件以及它们之间的连接,如果您要将它们全部映射出来并可视化的话。

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 窗口将被打开,正如你在 上一篇教程 中看到的那样。

这里,包名是 turtlesim,可执行文件名是 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 上的重映射来更改正在控制的默认海龟。

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

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

既然你再次调用 ros2 run,另一个 turtlesim 窗口将打开。但是,现在如果您返回到运行 ros2 node list 的终端,并再次运行它,您将看到三个节点名:

/my_turtle
/turtlesim
/teleop_turtle

3 ros2 node info

现在您知道了节点的名称,可以使用以下方法访问更多关于节点的信息:

ros2 node info <node_name>

要检查最新的节点 my_turtle,运行以下命令:

ros2 node info /my_turtle

ros2 node info 返回与该节点交互的订阅者、发布者、服务和操作(ROS graph 连接)的列表。输出应该是这样的:

/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 graph 连接的概念,包括消息类型。

小结

节点是一个基本的 ROS 2 元素,在机器人系统中为一个单一的、模块化的目的服务。

在本教程中,你利用了从 turtlesim 包中创建的节点,运行可执行文件 turtlesim_nodeturtle_teleop_key

您了解了如何使用 ros2 node list 来发现活动节点名称和 ros2 node info,以便在单个节点上进行内省。这些工具对于理解复杂的、真实世界的机器人系统中的数据流至关重要。

下一步

现在你已经了解了 ROS 2 中的节点,你可以继续学习 主题 教程。主题是连接节点的通信类型之一。