ROS2学习之旅(5)——理解ROS2 Graph中的话题(Topic)

ROS2将复杂系统分解为许多模块化的节点,话题(topics)是ROS Graph中的一个重要元素,它充当节点传递消息的总线。

节点可以发布任意数量的话题,并可以同时订阅任意数量的话题。话题是数据在节点之间(在系统的不同部分之间)移动的重要方式之一。

1.启动节点

打开终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

此时,启动了两个节点turtlesim_nodeturtle_teleop_key

2.rqt_graph

通过rqt_graph可以将节点和话题以及他们之间的连接可视化,安装rqt所有插件时,即安装了rqt_graph。rqt的安装可以参考:rqt安装

要运行rqt_graph,打开终端输入并运行:

rqt_graph

同样的,也可以打开rqt,选择Plugins > Introspection > Nodes Graph进行添加。

此时,应该可以看到上面的节点和主题,以及围绕图形外围的两个动作(暂时忽略)。如果将鼠标悬停在主题中心,会看到像上面的图片一样的颜色高亮显示。该图描述了/turtlesim节点和/teleop_turtle节点是如何通过一个主题相互通信的,/teleop_turtle节点将数据(用于移动海龟的按键)发布到/turtle1/cmd_vel话题,/turtlesim节点订阅该话题以接收数据。

rqt_graph的突出显示特性在检查通过许多不同方式连接的众多节点和话题时非常有用,是一个图形化的工具。

3.ros2 topic list

运行ros2 topic list命令,可以得到系统中当前所活跃的所有话题:

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

ros2 topic list -t将返回相同的话题列表,话题类型被添加在括号后面:

/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]

话题具有名称和类型两种属性。这些属性,特别是类型,是节点之间在传递数据时知道它们正在讨论相同信息的方式。如果想知道rqt_graph中所有的话题,可以取消Hide下的所有复选框:

4.ros2 topic echo

为了查看话题发送的数据,可以在终端运行:

ros2 topic echo <topiv_name>

如上所示,teleop_turtle通过话题/turtle1/cmd_velturtlesim发送数据,可以通过echo查看话题的具体数据:

ros2 topic echo /turtle1/cmd_vel

此时,不会返回任何数据,因为/teleop_turtle此时还未发布数据。返回到运行turtle_teleop_key的终端,并使用箭头移动海龟。 观察终端,会看到发布的每一个动作:

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

现在返回到rqt_graph并取消Debug复选框。

/_ros2cli_26646是运行的echo创建的节点(数字会改变),可以看到发布者正在通过cmd_vel话题发布数据,并且有两个订阅者。

5. ros2 topic info

话题不只是一对一的交流,它可以是一对多、多对一或多对多。可以通过info查看话题的属性信息,在终端运行:

ros2 topic info /turtle1/cmd_vel

此时会返回:

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

6.ros2 interface show

节点使用消息(messages)通过话题发送数据。发布者和订阅者必须发送和接收相同类型的消息进行通信。运行ros2 topic list -t之后可以看到每个话题发布的消息类型,或者通过info也可以获得某一消息的类型,回想一下cmd_vel主题的类型:

geometry_msgs/msg/Twist

这表示在geometry_msgs包里,有一个msg叫做Twist

可以通过运行ros2 interface show <type>.msg查看消息的细节,特别是消息的数据结构。

ros2 interface show geometry_msgs/msg/Twist

此时,终端返回:

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

Vector3  linear
Vector3  angular

根据终端返回的信息,可以得到/turtlesim节点所期望的消息包含两个向量(线性向量和角向量),每个向量有三个元素,这与/teleop_turtle通过echo命令传递给/turtlesim的数据结构是相同的:

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

7.ros2 topic pub

在已知消息结构之后,可以直接从命令行发布数据到话题,使用如下命令:

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

'<args>'参数是传递给话题的实际数据。
需要注意的是,这个参数需要以YAML语法输入。像这样输入完整的命令:

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是一个可选参数,意思是“发布一条消息然后退出”。

将在终端中收到以下消息:

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))

turtlesim此时显示为:

小海龟(通常是要模拟的真正的机器人)需要一个稳定的命令流来进行连续操作。所以,为了让小海龟继续移动,可以在终端运行:

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 pub1 Hz的频率稳定发布命令。

刷新rqt_graph以图形化方式查看发生了什么,可以看到ros 2 topic pub ...节点 (/_ros2cli_30358)在/turtle1/cmd_vel话题上发布,并且被两个ros2话题ros2 topic echo ...节点(/_ros2cli_266461)和/turtlesim节点订阅。

最后,可以在pose话题上运行echo并重新查看rqt_graph:

ros2 topic echo /turtle1/pose

在本例中,/turtlesim现在发布到pose话题,并由一个新的echo节点订阅。

8.ros2 topic hz

可以使用以下方法报告数据发布的速率:

ros2 topic hz /turtle1/pose

它将返回关于/turtlesim节点向pose话题发布数据的速率。

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

9.清理节点

不要忘记在每个终端中输入Ctrl+C来停止节点运行。

10.总结

节点通过话题发布信息,允许任何数量的其他节点订阅和访问该信息。可以使用rqt_graph和命令行工具检查话题上节点之间的连接。

如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。

都看到这了,点个推荐再走吧~

未经允许,禁止转载。

posted @ 2021-07-13 21:39  Love&Robot  阅读(2250)  评论(0编辑  收藏  举报