理解节点
目标: 了解ROS 2中节点的功能以及与之交互的工具。
教程级别: 初学者
时间: 10分钟
背景
1 ROS 2图
在接下来的几个教程中,您将了解一系列组成所谓“ROS (2)图”的核心ROS 2概念。
ROS图是一个由ROS 2元素组成的网络,这些元素同时处理数据。如果您将它们全部映射并可视化,它将包含所有可执行文件和它们之间的连接。
ROS 2中的两个节点
ROS中的每个节点应该负责一个单一的模块化功能,例如控制轮子马达或发布来自激光测距仪的传感器数据。每个节点可以通过主题(topics)、服务(services)、动作(actions)或参数(parameters)与其他节点进行数据的发送和接收。
一个完整的机器人系统由许多协同工作的节点组成。在ROS 2中,单个可执行文件(C++程序、Python程序等)可以包含一个或多个节点。
任务
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。主题是连接节点的通信类型之一。