什么是ROS2中的——nodes

127 阅读3分钟

本文的目标:了解ROS 2中nodes的功能,以及与它们交互的工具。

Background

1 The ROS 2 graph

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

ROS2中的nodes

ROS中的每个node都应负责单一的模块化目的,例如控制车轮电机或发布激光测距仪的传感器数据。每个nodes可以通过topics, services, actions, or parameters.发送和接收来自其他nodes的数据。

Nodes-TopicandService.gif

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

理解ROS2中的nodes

1 ros2 run

首先要运行人ros2,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

image.png

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

ros2 run turtlesim turtle_teleop_key

在这里,我们再次引用 turtlesim 包,但这次针对的是名为 turtle_teleop_key 的可执行文件。

返回到运行 ros2 node list的终端并再次运行。现在,将看到两个活动节点的名称:

image.png

2.1 重映射

重新映射允许将默认节点属性(如nodes名称、Topics名称、Services名称等)重新分配给自定义值。在文章开始学习使用 turtlesim, ros2, and rqt使用了turtle_teleop_key上的重新映射来更改cmd_vel Topics和目标 turtle2。

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

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

image.png

3 ros2 node info

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

ros2 node info <node_name>

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

ros2 node info /my_turtle

ROS2 节点信息返回subscribers, publishers, services, and actions的列表。即与该节点交互的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:

image.png

现在尝试在 /teleop_turtle 节点上运行相同的命令,并查看其连接与my_turtle有何不同。

总结

nodes是基本的 ROS2元件,在机器人系统中具有单一的模块化用途。

在本文中,运行可执行文件turtlesim_node和turtle_teleop_key来利用在 turtlesim 包中创建的节点。

学习了如何使用 ros2 节点列表来发现活动节点名称和 ros2 节点信息以自检单个nodes。