理解 ROS 2 节点
目标: 了解 ROS 2 中节点的功能,以及与节点交互的工具。
教程级别: 初级
预计用时: 10 分钟
1. ROS 2 图
Section titled “1. ROS 2 图”在接下来的几个教程中,你将学习一系列构成所谓”ROS(2)图”的核心 ROS 2 概念。
ROS 图是由一系列 ROS 2 元素组成的网络,它们协同处理数据。它涵盖了系统中所有的可执行文件及其之间的连接关系——前提是你能将它们全部映射并可视化出来。
2. ROS 2 中的节点
Section titled “2. ROS 2 中的节点”ROS 中的每个节点负责一个单一的、模块化的功能,例如控制轮子电机或发布激光测距仪的传感器数据。每个节点都可以通过话题(topic)、服务(service)、动作(action)或参数(parameter)与其他节点收发数据。

一个完整的机器人系统由许多协同工作的节点组成。在 ROS 2 中,一个可执行文件(C++ 程序、Python 程序等)可以包含一个或多个节点。
上一篇教程介绍了如何安装本教程所使用的 turtlesim 功能包。
和往常一样,每次打开新终端时都别忘了 source ROS 2。
1. ros2 run
Section titled “1. ros2 run”ros2 run 命令用于从某个功能包中启动一个可执行文件。
$ ros2 run <package_name> <executable_name>要运行 turtlesim,请打开一个新终端,并输入以下命令:
$ ros2 run turtlesim turtlesim_nodeturtlesim 窗口将会打开,和上一篇教程中看到的一样。
这里,功能包名是 turtlesim,可执行文件名是 turtlesim_node。
不过,我们还不知道节点的名称。你可以使用 ros2 node list 来查看节点名称。
2. ros2 node list
Section titled “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 的终端,再次运行该命令。现在你会看到两个活动节点的名称:
$ ros2 node list/turtlesim/teleop_turtle2.1 重映射
Section titled “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_turtle3. ros2 node info
Section titled “3. ros2 node info”既然已经知道了节点的名称,你就可以通过以下命令查看它们的更多信息:
$ ros2 node info <node_name>要查看最新的节点 my_turtle,请运行以下命令:
$ ros2 node info /my_turtle/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_msgs/msg/Color /turtle1/pose: turtlesim_msgs/msg/Pose Service Servers: /clear: std_srvs/srv/Empty /kill: turtlesim_msgs/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_msgs/srv/Spawn /turtle1/set_pen: turtlesim_msgs/srv/SetPen /turtle1/teleport_absolute: turtlesim_msgs/srv/TeleportAbsolute /turtle1/teleport_relative: turtlesim_msgs/srv/TeleportRelative Service Clients:
Action Servers: /turtle1/rotate_absolute: turtlesim_msgs/action/RotateAbsolute Action Clients:ros2 node info 返回订阅者(subscriber)、发布者(publisher)、服务(service)和动作(action)的列表,也就是该节点与 ROS 图中其他元素的连接关系。
现在尝试对 /teleop_turtle 节点运行相同的命令,看看它的连接与 my_turtle 有何不同。
在接下来的教程中,你将进一步了解 ROS 图中的连接概念(包括消息类型)。
节点是 ROS 2 的基本组成单元,在机器人系统中负责单一的、模块化的功能。
在本教程中,你通过运行可执行文件 turtlesim_node 和 turtle_teleop_key,使用了 turtlesim 功能包中创建的节点。
你学习了如何使用 ros2 node list 来发现活动节点的名称,以及如何使用 ros2 node info 来查看单个节点的信息。这些工具对于理解复杂的真实机器人系统中的数据流至关重要。
既然你已经理解了 ROS 2 中的节点,接下来可以继续学习话题(topic)教程。话题是连接节点的通信类型之一。
关于节点的概念页面提供了更多关于节点概念的细节。