【ROS2入门】理解 ROS 2 Topics 话题

        大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们一起了解ROS 2中节点的功能以及与之交互的工具, 这一篇,我们主要会围绕ROS中另外一个重要的概念“Topic ”,详细其具体的操作指令。

目录


一、ROS2中话题(Topic in ROS 2)

ROS 2将复杂系统分解为许多模块化节点。“Topic ”是ROS图的一个重要元素,充当节点交换消息的总线。

 节点可以向任意数量的主题发布数据,并同时订阅任意数量的话题“Topic ”。

【ROS2入门】理解 ROS 2 Topics 话题

 主题“Topic ”是数据在节点之间移动的重要方式之一,因此在系统的不同部分之间移动。

1 、启动模拟节点

到现在,你应该可以轻松地启动turtlesim。打开一个终端,执行如下命令:

ros2 run turtlesim turtlesim_node

打开一个新的终端,启动遥控节点:

ros2 run turtlesim turtle_teleop_key

2、 rqt_graph

在本教程中,我们将使用rqt_graph来可视化不断变化的节点和主题,以及它们之间的连接。Turtlesim教程告诉您如何安装rqt及其所有插件,包括rqt_graph。

sudo apt update
sudo apt install ros-eloquent-rqt*

启动

rqt_graph

 你还可以打开 rqt_graph 通过打开rqt 选择 Plugins > Introspection > Nodes Graph.

         您应该看到上面的节点和主题,以及围绕图形外围的两个操作(现在让我们忽略它们)。如果将鼠标悬停在中心的主题上,您将看到如上图所示的颜色高亮显示。

        该图描述了/turtlesim节点和/teolep_turtle节点如何在主题上相互通信。/teolep_turtle节点正在向/turtle1/cmd_vel主题发布数据(您输入的键击以移动海龟),/turtlesim节点订阅该主题以接收数据。

         rqt_graph的突出显示功能在检查具有以多种不同方式连接的多个节点和主题的更复杂系统时非常有用。rqt_graph是一个图形化的工具。现在我们来看一些用于主题的命令行工具。

3、 ros2 topic list

在新终端中运行ros2 topic list命令将返回系统中当前活动的所有主题的列表:

ros2 topic list

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

ros2 topic list -t将返回相同的主题列表,这一次主题类型附加在每个主题后面的括号中:

ros2 topic list -t

nvidia@ubuntu:~$ 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]

主题”Topic”有名称和类型。这些属性,特别是类型,是节点在主题上移动时如何知道自己在谈论相同的信息的。

如果您想知道所有这些主题在rqt_graph中的位置,可以取消选中下面的所有框

 不过,目前暂时,请选中这些选项以避免混淆。

4 、ros2 topic echo

要查看主题上发布的数据,请使用:

ros2 topic echo <topic_name>

由于我们知道/teolep_turtle通过/turtle1/cmd_vel主题向/turtlesim发布数据,因此让我们使用echo来反思该主题:

ros2 topic echo /turtle1/cmd_vel

 现在,回到 rqt_graph and 取消选择 the Debug box.

 /_ros2cll_29047是由我们刚刚运行的echo创建的节点(数字会改变)。现在,您可以看到发布者正在通过cmd_vel主题发布数据,并且订阅了两个订阅者。

5、 ros2 topic info

主题不一定只有点对点的交流;它可以是一对多、多对一或多对多。另一种方法是运行:

ros2 topic info /turtle1/cmd_vel

会回复如下信息:

nvidia@ubuntu:~$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscriber count: 1

6 、ros2 interface show

节点使用消息通过主题发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。在运行ros2主题列表之后,我们前面看到的主题类型-t让我们知道每个主题可以发送什么类型的消息。

ros2 topic list -t

会回复带类型的话题:

nvidia@ubuntu:~$ 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]

cmd_vel主题的类型:

geometry_msgs/msg/Twist

这意味着在geometry_msgs包中有一个名为Twist的msg。

现在,我们可以在该类型上运行ros2 interface show<type>.msg,以了解其详细信息,特别是消息所需的数据结构。

ros2 interface show geometry_msgs/msg/Twist

会得到如下回复:

nvidia@ubuntu:~$ ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.
​
Vector3  linear
Vector3  angular

回忆一下,之前我们的ECHO话题:

nvidia@ubuntu:~$ ros2 topic echo /turtle1/cmd_vel
linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 2.0
---

linear 和angular 都是一个数组,每个数组有3个元素。

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}}"

这个比起之前ROS1上还是直管了很多。

–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主题pub以1Hz的稳定流发布命令。

您可以刷新rqt_graph,以图形方式查看正在发生的情况。你会看到ros 2主题PUB。。。节点(/ros2cli_29722)正在/turtle1/cmd_vel主题上发布,并由ros2主题echo接收。。。节点(/ros2cli_29884)和/turtlesim节点。

 最后,您可以对姿势主题运行echo并重新检查rqt_graph:

ros2 topic echo /turtle1/pose

 在这种情况下,/turtlesim现在发布到pose主题,并订阅了一个新的echo节点。

8 、ros2 topic hz

在此过程中的最后可以使用以下方法报告数据发布的速度:

ros2 topic hz /turtle1/pose

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

average rate: 56.477
    min: 0.004s max: 0.135s std dev: 0.01506s window: 65

可以再看看turtle1/cmd_vel

ros2 topic hz turtle1/cmd_vel

和我们之前写的一致,1HZ。

9、总结

        结束前,此时,将有许多节点正在运行。不要忘记通过关闭终端窗口或在每个终端中输入“Ctrl+C”来停止它们。节点通过主题发布信息,这允许任何数量的其他节点订阅和访问该信息。在本教程中,您使用rqt_graph和命令行工具检查了主题上多个节点之间的连接。现在,您应该对ROS 2系统中的数据如何移动有了很好的了解。

以上就是我今天要分享的内容。纠错,疑问,交流: 911946883@qq.com

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年12月28日
下一篇 2023年12月28日

相关推荐