文章只是个人学习过程中学习笔记,主要参考ROS教程1。
话题(Topics
):节点可以将消息发布到话题,或者通过订阅话题来接收消息。话题是用于标识消息内容的名称。对某种数据感兴趣的节点会订阅到相应的话题。单个话题可能有多个并行发布者(publishers)和订阅者(subscribers),并且单个节点可以同时发布和订阅多个话题,单个节点也可以发布或订阅(监听)多个话题。通常,发布者和订阅者不知道彼此的存在。它们之间是属于解耦合的关系。从逻辑上讲,可以将话题视为强类型的消息总线。每条总线都有一个名称,只要类型正确,任何人都可以连接到总线以发送或接收消息。
消息(Messages
):订阅或发布话题时所使用的ROS数据类型。消息是由类型化字段组成。支持标准原始类型(整数、浮点、布尔值等),以及原始类型数组。消息可以包括任意嵌套的结构和数组(很像C结构)。
为了让事情更清楚,我将使用 FM收音机系统作为类比:广播电台(
node
)的发射器(publisher
)将以某个固定频率(topic
)传输你喜欢的频道(message
)。假设你坐在车里,想收听你最喜欢的频道(message
)。你将收音机接收器(subscriber
)调谐到该频率(topic
)。你既不知道广播电台的确切位置,广播电台也不想知道你在哪里。但你仍然可以在你喜爱的频道中欣赏音乐。
话题通信是ROS通信中最常用的一种基于发布和订阅模型的通信方式。用于实时性、周期性、少逻辑处理的数据传输场景。
ROS Node想要通过topic
方式来传递消息,首先 publisher 节点和 Subscriber 节点都要到ROS Master(节点管理器)中进行注册节点名称、话题名称、消息类型、URI地址和端口,然后ROS Master向 Subcriber 节点发送 publisher 节点信息, Subscriber 节点根据接收的 publisher 节点信息,向 publisher 节点请求直接连接,它们建立连接后, publisher 节点向 Subscriber 节点发送消息。节点间通信使用一种基于TCP/IP
的消息传输,称为TCPROS
。
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
通过ROS内置的turtlesim来进行话题通信的实操,该实操中涉及到两个节点,一个是控制乌龟运动的键盘节点turtle_teleop_key
,另外一个是显示乌龟运动的显示节点turtlesim_node
,它们之间通过话题通信,turtle_teleop_key
(publisher)在话题上发布键盘按下的消息,turtlesim_node
(subscriber)则订阅该话题以接收消息,实现乌龟运动。我们可以使用rqt_graph GUI来显示当前运行的节点和话题。
实现的步骤如下:
步骤1:在新终端中启动roscore
roscore
步骤2:在新终端中启动turtlesim_node
rosrun turtlesim turtlesim_node
步骤3:在新终端中启动键盘turtle_teleop_key
rosrun turtlesim turtle_teleop_key
步骤4:在turtle_teleop_key
终端中(一定要选中该终端窗口,确保按键输入能够被捕获),按下键盘上的方向键来控制乌龟运动。
使用控制乌龟(turtlesim)运动
案例来实操话题命令。
rostopic list
能够列出当前已被订阅和发布的所有话题。
# (1) 列出当前已被订阅和发布的所有话题。
rostopic list
# (2) 列出所有发布和订阅的主题及其类型的详细信息。
rostopic list -v
rostopic type [topic]
命令用来查看所发布话题的消息类型。
# (1) 查看所发布话题[/turtle1/cmd_vel]的消息类型。
rostopic type /turtle1/cmd_vel
# (2) 使用rosmsg查看消息的详细信息
rosmsg show geometry_msgs/Twist
rostopic echo [topic]
可以显示在某个话题上发布的数据。
rostopic echo /turtle1/cmd_vel
当输入命令后,你可能会看到什么都没发生,因为现在还没有数据被发布到该话题上。可以通过按下键盘方向键让turtle_teleop_key
节点发布数据。记得如果不能控制乌龟,请选中turtle_teleop_key
的终端窗口以确保按键输入能够被捕获。当按下向右和向上键时,应该看到以下内容:
现在让我们再看一下rqt_graph。先按下左上角的刷新按钮以显示新节点。正如你所看到的,rostopic echo
(这里以红色显示)现在也订阅了turtle1/cmd_vel
话题。
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键,最后使用<-和->键修改
linear
和angular
。rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist
下面我们用 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]'
rostopic hz [topic]
命令用来报告数据发布的速率。
rostopic hz /turtle1/cmd_vel
rostopic bw [topic]
显示指定话题的消息数据带宽(bandwidth)。
rostopic bw /turtle1/cmd_vel
rostopic info [topic]
获取指定Topic 当前发布的消息 。
rostopic find [msg_type]
根据消息类型查找话题。
rostopic find geometry_msgs/Twist
ROS.otg. ROS教程[EB/OL]. 2020-12-22[2022-7-5].
http://wiki.ros.org/cn/ROS/Tutorials. ↩︎