[ROS](06)ROS通信 —— 话题(Topic)通信

  文章只是个人学习过程中学习笔记,主要参考ROS教程1


目录

  • 1、概念
  • 2、话题通信机制
  • 3、话题命令rostopic
  • 4、 话题通信实操 -- 键盘控制乌龟(turtlesim)运动
  • 5、话题命令实操
    • 5.1 rostopic list
    • 5.2 rostopic type
    • 5.3 rostopic echo
    • 5.4 rostopic pub
    • 5.5 rostopic hz
    • 5.6 rostopic bw
    • 5.7 rostopic info
    • 5.8 rostopic find

1、概念

  话题(Topics):节点可以将消息发布到话题,或者通过订阅话题来接收消息。话题是用于标识消息内容的名称。对某种数据感兴趣的节点会订阅到相应的话题。单个话题可能有多个并行发布者(publishers)和订阅者(subscribers),并且单个节点可以同时发布和订阅多个话题,单个节点也可以发布或订阅(监听)多个话题。通常,发布者和订阅者不知道彼此的存在。它们之间是属于解耦合的关系。从逻辑上讲,可以将话题视为强类型的消息总线。每条总线都有一个名称,只要类型正确,任何人都可以连接到总线以发送或接收消息。
  消息(Messages):订阅或发布话题时所使用的ROS数据类型。消息是由类型化字段组成。支持标准原始类型(整数、浮点、布尔值等),以及原始类型数组。消息可以包括任意嵌套的结构和数组(很像C结构)。
[ROS](06)ROS通信 —— 话题(Topic)通信_第1张图片

图1-1 话题(Topics)、发布者(Publisher)和订阅者(Subscriber)的概念图

  为了让事情更清楚,我将使用 FM收音机系统作为类比:广播电台(node)的发射器(publisher)将以某个固定频率(topic)传输你喜欢的频道(message)。假设你坐在车里,想收听你最喜欢的频道(message)。你将收音机接收器(subscriber)调谐到该频率(topic)。你既不知道广播电台的确切位置,广播电台也不想知道你在哪里。但你仍然可以在你喜爱的频道中欣赏音乐。

2、话题通信机制

  话题通信是ROS通信中最常用的一种基于发布和订阅模型的通信方式。用于实时性、周期性、少逻辑处理的数据传输场景。
  ROS Node想要通过topic方式来传递消息,首先 publisher 节点和 Subscriber 节点都要到ROS Master(节点管理器)中进行注册节点名称、话题名称、消息类型、URI地址和端口,然后ROS Master向 Subcriber 节点发送 publisher 节点信息, Subscriber 节点根据接收的 publisher 节点信息,向 publisher 节点请求直接连接,它们建立连接后, publisher 节点向 Subscriber 节点发送消息。节点间通信使用一种基于TCP/IP的消息传输,称为TCPROS

[ROS](06)ROS通信 —— 话题(Topic)通信_第2张图片

图2-1 话题(Topics)通信模型

3、话题命令rostopic

  rostopic命令工具能让你获取ROS话题的信息。

命令 功能
rostopic bw 列出消息发布带宽
rostopic delay display delay of topic from timestamp in header
rostopic echo 显示某个话题上发布的数据
rostopic find 根据消息类型查找话题
rostopic hz 报告数据发布的速率
rostopic info 获取指定Topic 当前发布的消息
rostopic list 列出当前所有的Topic
rostopic pub 把数据发布到当前某个正在广播的话题上
rostopic type 查看所有发布话题的消息类型

Tips:使用rostopic -h 帮助选项获取更详细的用法。

4、 话题通信实操 – 键盘控制乌龟(turtlesim)运动

  通过ROS内置的turtlesim来进行话题通信的实操,该实操中涉及到两个节点,一个是控制乌龟运动的键盘节点turtle_teleop_key,另外一个是显示乌龟运动的显示节点turtlesim_node,它们之间通过话题通信,turtle_teleop_key(publisher)在话题上发布键盘按下的消息,turtlesim_node(subscriber)则订阅该话题以接收消息,实现乌龟运动。我们可以使用rqt_graph GUI来显示当前运行的节点和话题。
[ROS](06)ROS通信 —— 话题(Topic)通信_第3张图片

图4-1 使用rqt_graph显示当前运行的节点和话题

  实现的步骤如下:
  步骤1:在新终端中启动roscore

roscore

  步骤2:在新终端中启动turtlesim_node

rosrun turtlesim turtlesim_node

  步骤3:在新终端中启动键盘turtle_teleop_key

rosrun turtlesim turtle_teleop_key

  步骤4:在turtle_teleop_key终端中(一定要选中该终端窗口,确保按键输入能够被捕获),按下键盘上的方向键来控制乌龟运动。
[ROS](06)ROS通信 —— 话题(Topic)通信_第4张图片

图4-2 键盘控制乌龟(turtlesim)运动

5、话题命令实操

  使用控制乌龟(turtlesim)运动案例来实操话题命令。

5.1 rostopic list

   rostopic list 能够列出当前已被订阅和发布的所有话题。

# (1) 列出当前已被订阅和发布的所有话题。
rostopic list
# (2) 列出所有发布和订阅的主题及其类型的详细信息。
rostopic list -v

[ROS](06)ROS通信 —— 话题(Topic)通信_第5张图片

5.2 rostopic type

   rostopic type [topic] 命令用来查看所发布话题的消息类型。

# (1) 查看所发布话题[/turtle1/cmd_vel]的消息类型。
rostopic type /turtle1/cmd_vel
# (2) 使用rosmsg查看消息的详细信息
rosmsg show geometry_msgs/Twist

[ROS](06)ROS通信 —— 话题(Topic)通信_第6张图片

5.3 rostopic echo

   rostopic echo [topic] 可以显示在某个话题上发布的数据。

rostopic echo /turtle1/cmd_vel

   当输入命令后,你可能会看到什么都没发生,因为现在还没有数据被发布到该话题上。可以通过按下键盘方向键让turtle_teleop_key节点发布数据。记得如果不能控制乌龟,请选中turtle_teleop_key的终端窗口以确保按键输入能够被捕获。当按下向右和向上键时,应该看到以下内容:
[ROS](06)ROS通信 —— 话题(Topic)通信_第7张图片
现在让我们再看一下rqt_graph。先按下左上角的刷新按钮以显示新节点。正如你所看到的,rostopic echo(这里以红色显示)现在也订阅了turtle1/cmd_vel话题。
[ROS](06)ROS通信 —— 话题(Topic)通信_第8张图片

5.4 rostopic pub

   rostopic pub [topic] [msg_type] [args] 命令可以把数据发布到当前某个正在广播的话题上。

# 命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度移动。
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
  • -1:这一选项会让rostopic只发布一条消息,然后退出。
  • /turtle1/cmd_vel:这是要发布到的话题的名称
  • geometry_msgs/Twist:这是发布到话题时要使用的消息的类型。
  • --:这一选项(两个破折号)用来告诉选项解析器,表明之后的参数都不是选项。如果参数前有破折号(-)比如负数,那么这是必需的。

还有一种快速输入的方法:先输入以下命令,然后双击Tab键,最后使用<-和->键修改linearangular

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist 

[ROS](06)ROS通信 —— 话题(Topic)通信_第9张图片
  下面我们用 rostopic pub -r 命令来发布源源不断的命令:

# 命令以1Hz的频率发送消息给turtlesim,保证乌龟持续做圆周运动
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

[ROS](06)ROS通信 —— 话题(Topic)通信_第10张图片

5.5 rostopic hz

   rostopic hz [topic] 命令用来报告数据发布的速率。

rostopic hz /turtle1/cmd_vel

[ROS](06)ROS通信 —— 话题(Topic)通信_第11张图片

5.6 rostopic bw

   rostopic bw [topic] 显示指定话题的消息数据带宽(bandwidth)。

rostopic bw /turtle1/cmd_vel

[ROS](06)ROS通信 —— 话题(Topic)通信_第12张图片

5.7 rostopic info

   rostopic info [topic] 获取指定Topic 当前发布的消息 。
[ROS](06)ROS通信 —— 话题(Topic)通信_第13张图片

5.8 rostopic find

   rostopic find [msg_type] 根据消息类型查找话题。

rostopic find geometry_msgs/Twist

rostopic find


  1. ROS.otg. ROS教程[EB/OL]. 2020-12-22[2022-7-5].
    http://wiki.ros.org/cn/ROS/Tutorials. ↩︎

你可能感兴趣的:(ROS,笔记,自动驾驶,人工智能,机器学习)