理解ROS 2话题

Goal目标: Use使用rqt_graph和命令行工具来反思ROS 2话题。 [待校准@8809]

教程级别: 初学者 [Alyssa@7088]

Time时间: 20 20分钟 [待校准@7181]

背景

ROS 2将复杂的系统分解成许多模块化节点。话题是ROS图中至关重要的元素,它充当节点交换消息的总线。

../../_images/Topic-SinglePublisherandSingleSubscriber.gif

节点可以将数据发布到任意数量的话题,同时订阅任意数量的话题。

../../_images/Topic-MultiplePublisherandMultipleSubscriber.gif

话题是数据在节点之间移动,从而在系统的不同部分之间移动的主要方式之一。 [待校准@8812]

先决条件

在这里建立的节点上, 上一个教程 提供了一些有用的背景信息。 [小鱼@8813]

和往常一样,不要忘记在 every new terminal you open 中源文件ROS 2。 [待校准@7566]

任务

1设置 [待校准@7567]

到目前为止,您应该可以轻松启动 turtlesim。 [机器人@8814]

打开新终端并运行: [待校准@7339]

ros2 run turtlesim turtlesim_node

打开另一个终端并运行: [待校准@7816]

ros2 run turtlesim turtle_teleop_key

previous tutorial 调用,默认情况下,这些节点的名称是 /turtlesim/teleop_turtle[待校准@8815]

2 rqt_graph [待校准@8816]

在本教程中,我们将使用 rqt_graph 可视化变化的节点和话题,以及它们之间的联系。 [待校准@8817]

[需手动修复的语法] turtlesim tutorial 告诉你如何安装rqt及其所有插件,包括 rqt_graph [待校准@8818]

要运行rqt_graph,请打开新终端并输入以下命令: [待校准@8819]

rqt_graph

您也可以通过打开 rqt 并选择插件> 自检> 节点图来打开rqt_graph。 [待校准@8820]

../../_images/rqt_graph.png

你应该看到上面的节点和话题,以及围绕图表外围的两个动作 (现在让我们忽略这些)。如果将鼠标悬停在中间的话题上,您会看到颜色突出显示,如上图所示。 [待校准@8821]

该图描述了 /turtlesim 节点和 /teleop_turtle 节点如何通过一个话题相互通信。的 /teleop_turtle 节点出版数据 (按键输入移动乌龟周围) /turtle1/cmd_vel 话题, /turtlesim 节点订阅话题接收数据。 [待校准@8822]

rqt_graph的突出功能在检查具有许多节点和以许多不同方式连接的话题的更复杂系统时非常有用。 [待校准@8823]

rqt_graph是一个图形自省工具。现在我们来看看一些用于内省话题的命令行工具。 [待校准@8824]

3 ros2话题列表 [待校准@8825]

在新终端中运行 ros2 topic list 命令将返回系统中当前活动的所有话题的列表: [待校准@8826]

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

[需手动修复的语法]``ros2 topic list -t`` will返回相同的话题列表,这次在括号中附加了话题类型: [待校准@8827]

/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

这些属性,尤其是类型,是节点如何知道它们在谈论与话题移动时相同的信息。 [待校准@8828]

如果您想知道所有这些话题在rqt_graph中的位置,可以取消选中Hide隐藏: Hide下的所有框 [待校准@8829]

../../_images/unhide.png

不过,现在,请检查这些选项以避免混淆。 [待校准@8830]

4 ros2话题回声 [待校准@8831]

要查看正在发布的关于某个话题的数据,请使用: [待校准@8832]

ros2 topic echo <topic_name>

既然我们知道 /teleop_turtle/turtle1/cmd_vel 话题上向 /turtlesim 公布了数据,让我们用 echo 来反思这个话题: [待校准@8833]

ros2 topic echo /turtle1/cmd_vel

首先,此命令不会返回任何数据。那是因为它在等待 /teleop_turtle 发表一些东西。 [待校准@8834]

回到 turtle_teleop_key 运行的终端,用箭头移动海龟。观看你的 echo 同时运行的终端,你会看到你所做的每一个动作的位置数据被公布: [待校准@8835]

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

现在返回rqt_graph并取消选中调试框。 [待校准@8836]

../../_images/debug.png

[需手动修复的语法]``/_ros2cli_26646`` is the node created by the echo we just ran (the number might be different). Now you can see that the publisher is publishing data over the cmd_vel topic和两个订户已订阅。 [待校准@8837]

5 ros2话题信息 [待校准@8838]

话题不一定只是点对点通讯; 它可以是一对多、多对一或多对多。 [待校准@8839]

另一种看待这个问题的方式是运行: [待校准@8840]

ros2 topic info /turtle1/cmd_vel

它将返回: [待校准@8090]

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6 ros2界面展示 [待校准@8841]

节点使用消息通过话题发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。 [待校准@8842]

我们之前在运行 ros2 topic list -t 后看到的话题类型让我们知道每个话题使用了什么信息类型。重新调用 cmd_vel 话题的类型: [待校准@8843]

geometry_msgs/msg/Twist

这意味着在 geometry_msgs 包装中有一个 msg 调用 Twist[待校准@8844]

现在我们可以在这种类型上运行 ros2 interface show <msg type> 来了解它的细节,特别是调用y,消息期望的数据结构。 [待校准@8845]

ros2 interface show geometry_msgs/msg/Twist

对于上面的消息类型,它产生: [待校准@8846]

# This expresses velocity in free space broken into its linear and angular parts.

    Vector3  linear
    Vector3  angular

这告诉你, /turtlesim 节点期望有两个向量的消息, linearangular ,每个向量有三个元素。如果你重新调用数据,我们看到 /teleop_turtleecho 命令传递给 /turtlesim ,它的结构是一样的: [待校准@8847]

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

7 ros2话题酒吧 [待校准@8848]

现在有了消息结构,您可以使用以下命令直接从命令行将数据发布到话题上: [待校准@8849]

ros2 topic pub <topic_name> <msg_type> '<args>'

'''<args>''' 参数是您将传递给话题的实际数据,位于您在上一节中刚刚发现的结构中。 [待校准@8850]

需要注意的是,此参数需要以YAML语法输入。输入完整命令,如下所示: [待校准@8851]

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

[需手动修复的语法]``--once`` is是一个可选参数,意思是 “发布一条消息然后退出”。 [待校准@8852]

您将在终端中收到以下消息: [待校准@8853]

publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

你会看到你的乌龟像这样移动: [待校准@8854]

../../_images/pub_once.png

乌龟 (通常是用来模仿的真正机器人) 需要源源不断的命令来连续运行。所以,为了让乌龟继续移动,你可以跑: [待校准@8855]

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

这里的不同之处在于移除了 --once 选项,并增加了 --rate 1 选项,这告诉 ros2 topic pub 以1赫兹的稳定流发布命令。 [待校准@8856]

../../_images/pub_stream.png

您可以刷新rqt_graph以查看graphi调用y时发生了什么。您将看到 ros 2 topic pub ... 节点 ( /_ros2cli_30358 ) 正在发布关于 /turtle1/cmd_vel 话题的内容,并且现在被 ros2 topic echo ... 节点 ( /_ros2cli_26646 ) 和 /turtlesim 节点接收。 [待校准@8857]

../../_images/rqt_graph2.png

最后,您可以在 pose 话题上运行 echo ,并重新检查rqt_graph: [待校准@8858]

ros2 topic echo /turtle1/pose
../../_images/rqt_graph3.png

你可以看到 /turtlesim 节点也在发布到 pose 话题,新的 echo 节点订阅了这个话题。 [待校准@8859]

8 ros2话题hz [待校准@8860]

对于此过程的最后一次自省,您可以使用以下方法查看数据发布的速率: [待校准@8861]

ros2 topic hz /turtle1/pose

它将返回关于 /turtlesim 节点将数据发布到 pose 话题的速率的数据。 [待校准@8862]

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58

重新调用您使用 ros2 topic pub --rate 1turtle1/cmd_vel 的发布速率设置为稳定的1Hz。如果你用 turtle1/cmd_vel 而不是 turtle1/pose 运行上述命令,你会看到一个反映该速率的平均值。 [待校准@8863]

9清理 [待校准@8864]

此时,您将运行许多节点。不要忘记在每个终端输入 “ctrl + c” 来停止它们。 [待校准@8865]

总结

节点通过话题发布信息,这允许任意数量的其他节点订阅和访问该信息。在本教程中,您使用rqt_graph和命令行工具检查了多个节点之间的话题连接。您现在应该对数据如何在ROS 2系统中移动有了一个很好的了解。 [待校准@8866]

下一步

接下来,您将通过教程 了解ROS 2服务 在ROS图中了解另一种通讯类型。 [待校准@8867]