理解ROS话题
首先需要打开一个终端在里面运行roscore:
roscore
再打开一个终端,在里面运行一个turtlesim_node节点:
rosrun turtlesim turtlesim_node
打开另一个终端,在里面输入:
rosrun turtlesim turtle_teleop_key
从命令行可以看出,这是两个node,他们在同一个包中。
在运行完这条命令后,在运行turtle_teleop_key的终端下,按键盘上的方向键可以看到,之前我们运行的乌龟开始移动,:-),很有意思吧。
turtlesim_node和turtle_teleop_key通过ROS的话题(Topic)来相互通信。turtle_teleop_key把用户按下的键发布到话题上,turtlesim_node也订阅了同一个话题用来接收用户按下的键,并做出相应的动作。我们有这个例子可以体会到话题的作用,更加深刻的认识到了节点的概念。
rqt_graph创建了一个当前系统中运行的节点的动态图。如果你没有安装rqt的话,请首先安装:
sudo apt-get install ros-hydro-rqt
sudo apt-get install ros-hydro-rqt-common-plugins
通过上面的配置,我们实现了通过键盘按键来控制小乌龟的移动,然后我们在终端输入命令:
rosrun rqt_graph rqt_graph

就可以看到一个表示节点之间的关系的图。将鼠标放在图片上面可以看到图片会变为高亮。可以看到两个节点是通过/turtle1/command_velocity话题来进行通信的。
使用rostopic echo命令可以查看在一个话题上发布的数据。它的使用方法如下:
rostopic echo [topic]
You can use the help option to get the available sub-commands for rostopic
可以用过rostopic的help选项来查看一些子命令:
$ rostopic -h
rostopic bw display bandwidth used by topic
rostopic echo print messages to screen
rostopic hz display publishing rate of topic
rostopic list print information about active topics
rostopic pub publish data to topic
rostopic type print topic type
例如:我们输入:
rostopic echo /turtle1/cmd_vel
之后我们在运行turtle_teleop_key节点的窗口下按方向键,就可以在刚才的窗口看到输出的数据如下:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
这个就是显示的线速度和角速度,这也就是两个node之间信息通信的内容。注意这个流程,turtle_teleop_key这个node接收键盘的按键,然后发布消息到cmd_vel这个Topic中,然后turtlesim_node这个节点也订阅了这个Topic,所以能接收到命令。
现在我们重新运行(或者是刷新之前运行的那个rqt_graph):
rosrun rqt_graph rqt_graph

就可以看到话题刚才只有一个订阅者 现在又多了一个订阅者。可以看到,新的node的名字的rostopic打头的,也就是我们刚才输入的指令,可以理解为新的node,这个node的作用是把输入的指令打印在电脑上,说白点就是你给小龟的指令也给我一份,我把它显示在屏幕上,你给小龟的那个指令就控制它去乱跑吧!
使用rostopic list可以列举出当前系统中的话题:
rostopic list
使用:
rostopic list -v
可以查看每一个话题的发布者和订阅者的个数。
话题上的通信通过节点之间发送消息来完成。对于发布者(turtle_teleop_key)和接收者(turtlesim_node)的通信,发布者和接收者必须使用类型相同的消息。也就是说,一个话题的类型是通过在它上面发布的消息的类型来定义的。可以通过:
rostopic type /turtle1/cmd_vel
来查看/turtle1/cmd_vel的消息类型。你得到的返回类型如下:
geometry_msgs/Twist
我们可以使用rosmsg来查看一个消息类型的详细信息:
rosmsg show geometry_msgs/Twist
得到的结果如下:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
现在我们已经知道了turtlesim接收的消息类型,现在我们可以给它发布消息了。rostopic pub命令用来发布消息,它的使用方法如下:
rostopic pub [topic] [msg_type] [args]
实例如下:
rostopic pub - /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
我们可以看到,乌龟运动了一个弧度。这是一个非常复杂的命令,我们详细分析一下:
rostopic pub:这个命令发布话题
-:这个参数的意思是只发布一条命令,然后退出
/turtle1/cmd_vel:这是要发布消息的话题
-- [2.0] [1.8]:这两个参数我们可以先不用深究
我们可以使用rostopic pub -r命令让乌龟持续运动,如:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
1的意思是:输出频率为1HZ,不间断进行输出。这样我们会发现小龟正在转圈圈。
总结:通过这节的内容,我们了解到在运行中,有一些节点node向某个topic上发布消息,同时另外的一些节点从这个topic中订阅消息,这样就实现了两个节点之间的通信。
当然我们能把节点上传输的消息截获下来,显示到屏幕上,我们也能向这个topic上发布消息,让相关订阅这个topic的节点做出相应的相应。在我们截获消息或者发布消息的时候,利用rostopic list -v显示的某个消息的发布者和订阅者都会增加。
这是查看rqt_graph看到各个节点和topic的关系图:

注意:这时使用命令:
rostopic list -v
能看到另外的一些topic,例如其中的/turtle1/pose这个topic就是表示小乌龟当前的位置信息。我们可以把这些位置信息输出到屏幕上显示出来:
rostopic echo /turtle1/pose
然后rqt_graph会是这个样子,也就是说/turtle1/pose这个topic现在有一个发布者和一个订阅者(原来只有一个发布者,没有订阅者)。

理解ROS话题的更多相关文章
- 理解ros话题--6
理解ROS话题(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程介绍ROS话题(topics)以及如何使用ro ...
- (六)ROS话题---节点之间通信的方式
1. 理解 ROS 话题: (Ctrl+Alt+T 打开一个新终端) 运行下面的命令: $ roscore (Ctrl+Alt+T 打开一个新终端) $ rosrun turtlesim turtle ...
- ROS Learning-008 beginner_Tutorials ROS话题
ROS Indigo beginner_Tutorials-07 ROS话题 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LT ...
- ROS学习(七)—— 理解ROS Topic
一.准备工作 1.打开roscore roscore 2.turtlesim 打开一个turtulesim节点 rosrun turtlesim turtlesim_node 3.turtle key ...
- ROS知识(2)----理解ROS系统结构
学习新事物,方法高于技术本身,如果没有把握"BIG PICTURE"的话很难理解进去.通过以下几点进行理解ROS: ROS实际上不是操作系统,他只是一个通信的框架,一个代码管理的架 ...
- ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)
ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...
- 由浅到深理解ROS(1)
ROS机器人操作系统 ( Robot Operating System 或简称 ROS),可以帮助提高机器人软件的开发效率.ROS能够提供类似传统操作系统的诸多功能,如硬件抽象.底层设备控制.常用功能 ...
- ROS学习(六)—— 理解ROS节点
一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...
- 由浅到深理解ROS(5)- launch启动文件的理解与编写
ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...
随机推荐
- POJ2063 Investment 【全然背包】
Investment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8019 Accepted: 2747 Descri ...
- CSS权威指南学习笔记 —— HTML元素分类
HTML文档由各种元素组成.比如,p.table.span等等.每个元素都会对文档的表现有所影响.CSS中,每个元素都会生成一个框(传说中的盒子),其中包含元素内容. 元素可以根据它的创建方式分为两种 ...
- response.getWriter().write()与out.print()的区别 (转)
来自:http://www.cnblogs.com/zhwl/p/3623688.html 1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字 ...
- js——BOM
BOM:Browser Object Model 浏览器对象模型 open(页面的地址url,打开的方式) :方法 打开一个新的窗口(页面) 如果url为空,折磨人打开一个空白页面 如果打开方式为 ...
- 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽
1. 摘录 默认参数指的是当函数调用中省略了实参时自动使用的一个值. 默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式.使用默认参数,可以减少要定义的析构函数.方法以及方法重载的数量. 试图 ...
- tomcat异常
java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory : Unsupported major.minor ...
- Android checkBox
checkBox 状态:选中(true),未选中(false) 属性: checked="true/false"; private Chec ...
- jQuery相关知识
1.jQuery中$符号有何作用? $作为jQuery的别名,如$(document).ready() 即是 jQuery(document).ready() 2.jQuery选择器有哪几种? 基本选 ...
- PHP利用递归法获取多级类别的树状数组
数据结构:category(id, pid, name),对应:信息ID,父项ID,类别名 测试数据: $aryCate = array( array('id' => 1, 'pid' => ...
- 让2个并列的div根据内容自动保持同等高度js
有左右2个并列的div,2个div都不能限定高度.左div为导航,右div为内容.如何能让左div块自动获得和右div块相等的高度? 同时,也有网友提问到“如果右块高度比左块低,会不会导致左块的内容被 ...