理解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功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...
随机推荐
- ruby on rails出现的问题ActiveModel::ForbiddenAttributesError
首先分清楚我们在搞rails时.看资料和所使用的环境的版本号是否同样.看的资料是rails3.2,电脑配置的环境是4.0,就会出现这样的安全防范措施的问题. 这类问题大多出如今new或者create两 ...
- LA - 5031 - Graph and Queries
题意:一个N个点(编号从1开始),M条边的无向图(编号从1开始),有3种操作: D X:把编号为X的边删了: Q X K:查询编号为X的结点所在连通分量第K大的元素: C X V:将编号为X的结点的权 ...
- .net通用权限框架B/S (三)--MODEL层(1)
1.新建c#类库 2.安装配置好entity frame5 3.新建的类库项目上右键"添加--新建项",选择AOD.NET实体数据模型 4.设置数据库连接, 5.选择建好的表 6. ...
- 20141129 LinQ to SQL
ORMO-Object对象R-Relation关系M-Mapping映射 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是 ...
- 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)
首先明确数据库对象的定义:数据库对象定义数据库内容的结构.它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本. 常见的数据库对象包括:表,索引,视图,图表,缺省值,规则,触发器,存储过程, ...
- fragment详解(官方文档)
原作者为: 苍山.感谢他分享的内容,现在分享出来给eoeAndroid的各位同胞. 详情参考http://www.eoeandroid.com/thread-71642-1-1.html和http:/ ...
- CentOS6.4下搭建hadoop2.2(64bit)注意事项
注:本文针对64位机器,32bit课直接tar -zxvf hadoop-2.2.0.tar.gz 解压配置即可. Step1:安装jdk(6以上版本) Step2:下载hadoop--->ht ...
- Thinkphp利用微信多客服消息推送取货二维码消息
首先看微信官方的说法: 当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单.订阅事件.扫描二维码事件.支付成功事件.用户维权), 微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改 ...
- C语言中头文件<stdio.h>中的#ifndef _STDIO_H_
先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...
- [php]php时间戳当中关于时区的问题
PHP_VERSION = 5.5.11 话说php函数 time() 的起始时间戳是从:GMT 1970-01-01 00:00:00 开始算起的 写了点测试代码: $gmt1 = strtotim ...