ROS2入门教程—理解话题(Topic)


  ros2将复杂系统分解为许多模块化节点,而这些节点之间则是通过一个至关重要的通道完成数据交换的,这个通道就是“话题”。

在这里插入图片描述

  一个节点可以通过多个话题向外发布数据,也可以同时订阅多个其他节点发布的话题,相当于话题是一个多对多的订阅/发布模型。

在这里插入图片描述

  可见,话题是节点之间实现数据传输的重要途径,也是机器人各个子系统之间交换数据的重要方式。

1 启动小海龟仿真器

  打开新终端并运行:

ros2 run turtlesim turtlesim_node

  打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2 rqt_graph

  rqt_graph这个工具,可以从上帝视角看到整个系统的状态。使用rqt_graph来可视化显示节点和话题的连接关系, 在一个新的终端中,输入:

rqt_graph

  可以看到一个新的界面,里边清晰的展示了ROS计算图的网络形态。

在这里插入图片描述

  根据上图可以看到相关的节点和话题,先忽略图中的action。如果将鼠标悬停在最下面的topic上,您将看到如上图所示的颜色高亮显示。话题/turtle1/cmd_vel的发布者是/teleop_turtle节点,而订阅者是/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 <topic_name>

  既然我们知道节点/teleop_turtle通过话题/turtle1/cmd_vel向节点/turtlesim发布数据,那么让我们使用echo对该topic进行查看:

ros2 topic echo /turtle1/cmd_vel

  一开始,这个命令不会返回任何数据。那是因为它在等待节点/teleop_turtle发布一些东西。返回运行turtle_teleop_key的终端,使用箭头移动turtle。观察echo运行的终端,你会看到为你的每一个动作发布的位置数据:

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

  原来键盘控制节点将点击的键盘按键变成了线速度和角速度,通过话题发送给海龟仿真器,海龟才动起来的。

5 ros2 topic info

  话题不必只是点对点的通信;它可以是一对多,多对一,或多对多。类似查看节点的详细信息一样,我们也可以用如下命令查看话题的详细信息:

ros2 topic info /turtle1/cmd_vel

  可以在终端中看到该话题的详细信息:

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

6 ros2 interface show

  节点之间要想成功建立数据传输,必须发布和订阅同样数据类型的消息,发布者发布的是速度指令,订阅者想订阅位置信息可是行不通的。我们在运行ros2 topic list -t之后看到的话题类型让我们知道每个话题可以发送什么类型的消息。回想一下,cmd_vel话题的类型是:

geometry_msgs/msg/Twist

  熟悉ROS1的应该并不陌生,这就是在ROS中常用的标准速度指令,以上内容表示在geometry_msgs包的msg中有一个数据类型Twist。这个数据类型的具体数据结构什么样的,继续通过如下指令看一下:

ros2 interface show geometry_msgs/msg/Twist

  在终端中输出如下信息:

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

Vector3  linear
Vector3  angular

  因此,Twist中包含了两个三维向量,分别表示线速度和角速度。

7 ros2 topic pub

  现在您已经知道了消息的具体结构,可以使用以下命令直接从命令行将数据发布到话题上:

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

  '<args>'参数是您将传递给话题的实际数据,需要使用YAML的语法来描述。比如要发布速度指令Twist,可以按如下方式输入完整命令:

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

  如果希望小海龟一直运动,那就得以某个频率持续发布:

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

在这里插入图片描述

8 ros2 topic hz

  如果我们想查看某一个话题的发布频率,可以通过命令行来实现:

ros2 topic hz /turtle1/pose

  在终端中可以看到/turtlesim节点发布/turtle1/pose话题的频率:

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roar冷颜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值