首先需要打开一个终端在里面运行roscore:

  1. roscore

再打开一个终端,在里面运行一个turtlesim_node节点:

  1. rosrun turtlesim turtlesim_node

打开另一个终端,在里面输入:

  1. rosrun turtlesim turtle_teleop_key

从命令行可以看出,这是两个node,他们在同一个包中。


在运行完这条命令后,在运行turtle_teleop_key的终端下,按键盘上的方向键可以看到,之前我们运行的乌龟开始移动,:-),很有意思吧。

turtlesim_nodeturtle_teleop_key通过ROS的话题(Topic)来相互通信。turtle_teleop_key把用户按下的键发布到话题上,turtlesim_node也订阅了同一个话题用来接收用户按下的键,并做出相应的动作。我们有这个例子可以体会到话题的作用,更加深刻的认识到了节点的概念。


rqt_graph创建了一个当前系统中运行的节点的动态图。如果你没有安装rqt的话,请首先安装:

  1. sudo apt-get install ros-hydro-rqt
  1. sudo apt-get install ros-hydro-rqt-common-plugins

通过上面的配置,我们实现了通过键盘按键来控制小乌龟的移动,然后我们在终端输入命令:

  1. rosrun rqt_graph rqt_graph

就可以看到一个表示节点之间的关系的图。将鼠标放在图片上面可以看到图片会变为高亮。可以看到两个节点是通过/turtle1/command_velocity话题来进行通信的。

使用rostopic echo命令可以查看在一个话题上发布的数据。它的使用方法如下:

  1. rostopic echo [topic]

You can use the help option to get the available sub-commands for rostopic

可以用过rostopic的help选项来查看一些子命令:

  1. $ rostopic -h
  1. rostopic bw display bandwidth used by topic
  2. rostopic echo print messages to screen
  3. rostopic hz display publishing rate of topic
  4. rostopic list print information about active topics
  5. rostopic pub publish data to topic
  6. rostopic type print topic type

例如:我们输入:

  1. rostopic echo /turtle1/cmd_vel

之后我们在运行turtle_teleop_key节点的窗口下按方向键,就可以在刚才的窗口看到输出的数据如下:

  1. linear:
  2. x: 2.0
  3. y: 0.0
  4. z: 0.0
  5. angular:
  6. x: 0.0
  7. y: 0.0
  8. z: 0.0
  9. ---
  10. linear:
  11. x: 2.0
  12. y: 0.0
  13. z: 0.0
  14. angular:
  15. x: 0.0
  16. y: 0.0
  17. z: 0.0
  18. ---

这个就是显示的线速度和角速度,这也就是两个node之间信息通信的内容。注意这个流程,turtle_teleop_key这个node接收键盘的按键,然后发布消息到cmd_vel这个Topic中,然后turtlesim_node这个节点也订阅了这个Topic,所以能接收到命令。

现在我们重新运行(或者是刷新之前运行的那个rqt_graph):

  1. rosrun rqt_graph rqt_graph

就可以看到话题刚才只有一个订阅者 现在又多了一个订阅者。可以看到,新的node的名字的rostopic打头的,也就是我们刚才输入的指令,可以理解为新的node,这个node的作用是把输入的指令打印在电脑上,说白点就是你给小龟的指令也给我一份,我把它显示在屏幕上,你给小龟的那个指令就控制它去乱跑吧!


使用rostopic list可以列举出当前系统中的话题:

  1. rostopic list

使用:

  1. rostopic list -v

可以查看每一个话题的发布者和订阅者的个数


话题上的通信通过节点之间发送消息来完成。对于发布者(turtle_teleop_key)和接收者(turtlesim_node)的通信,发布者和接收者必须使用类型相同的消息。也就是说,一个话题的类型是通过在它上面发布的消息的类型来定义的。可以通过:

  1. rostopic type /turtle1/cmd_vel

来查看/turtle1/cmd_vel的消息类型。你得到的返回类型如下:

  1. geometry_msgs/Twist

我们可以使用rosmsg来查看一个消息类型的详细信息:

  1. rosmsg show geometry_msgs/Twist

得到的结果如下:

  1. geometry_msgs/Vector3 linear
  2. float64 x
  3. float64 y
  4. float64 z
  5. geometry_msgs/Vector3 angular
  6. float64 x
  7. float64 y
  8. float64 z

现在我们已经知道了turtlesim接收的消息类型,现在我们可以给它发布消息了。rostopic pub命令用来发布消息,它的使用方法如下:

  1. rostopic pub [topic] [msg_type] [args]

实例如下:

  1. rostopic pub - /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

我们可以看到,乌龟运动了一个弧度。这是一个非常复杂的命令,我们详细分析一下:

  1. rostopic pub:这个命令发布话题
  2. -:这个参数的意思是只发布一条命令,然后退出
  3. /turtle1/cmd_vel:这是要发布消息的话题
  4. -- [2.0] [1.8]:这两个参数我们可以先不用深究

我们可以使用rostopic pub -r命令让乌龟持续运动,如:

  1. 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的关系图:


注意:这时使用命令:

  1. rostopic list -v

能看到另外的一些topic,例如其中的/turtle1/pose这个topic就是表示小乌龟当前的位置信息。我们可以把这些位置信息输出到屏幕上显示出来:

  1. rostopic echo /turtle1/pose

然后rqt_graph会是这个样子,也就是说/turtle1/pose这个topic现在有一个发布者和一个订阅者(原来只有一个发布者,没有订阅者)。


理解ROS话题的更多相关文章

  1. 理解ros话题--6

    理解ROS话题(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程介绍ROS话题(topics)以及如何使用ro ...

  2. (六)ROS话题---节点之间通信的方式

    1. 理解 ROS 话题: (Ctrl+Alt+T 打开一个新终端) 运行下面的命令: $ roscore (Ctrl+Alt+T 打开一个新终端) $ rosrun turtlesim turtle ...

  3. ROS Learning-008 beginner_Tutorials ROS话题

    ROS Indigo beginner_Tutorials-07 ROS话题 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LT ...

  4. ROS学习(七)—— 理解ROS Topic

    一.准备工作 1.打开roscore roscore 2.turtlesim 打开一个turtulesim节点 rosrun turtlesim turtlesim_node 3.turtle key ...

  5. ROS知识(2)----理解ROS系统结构

    学习新事物,方法高于技术本身,如果没有把握"BIG PICTURE"的话很难理解进去.通过以下几点进行理解ROS: ROS实际上不是操作系统,他只是一个通信的框架,一个代码管理的架 ...

  6. ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)

    ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...

  7. 由浅到深理解ROS(1)

    ROS机器人操作系统 ( Robot Operating System 或简称 ROS),可以帮助提高机器人软件的开发效率.ROS能够提供类似传统操作系统的诸多功能,如硬件抽象.底层设备控制.常用功能 ...

  8. ROS学习(六)—— 理解ROS节点

    一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...

  9. 由浅到深理解ROS(5)- launch启动文件的理解与编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

随机推荐

  1. ruby on rails出现的问题ActiveModel::ForbiddenAttributesError

    首先分清楚我们在搞rails时.看资料和所使用的环境的版本号是否同样.看的资料是rails3.2,电脑配置的环境是4.0,就会出现这样的安全防范措施的问题. 这类问题大多出如今new或者create两 ...

  2. LA - 5031 - Graph and Queries

    题意:一个N个点(编号从1开始),M条边的无向图(编号从1开始),有3种操作: D X:把编号为X的边删了: Q X K:查询编号为X的结点所在连通分量第K大的元素: C X V:将编号为X的结点的权 ...

  3. .net通用权限框架B/S (三)--MODEL层(1)

    1.新建c#类库 2.安装配置好entity frame5 3.新建的类库项目上右键"添加--新建项",选择AOD.NET实体数据模型 4.设置数据库连接, 5.选择建好的表 6. ...

  4. 20141129 LinQ to SQL

    ORMO-Object对象R-Relation关系M-Mapping映射 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是 ...

  5. 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)

    首先明确数据库对象的定义:数据库对象定义数据库内容的结构.它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本. 常见的数据库对象包括:表,索引,视图,图表,缺省值,规则,触发器,存储过程, ...

  6. fragment详解(官方文档)

    原作者为: 苍山.感谢他分享的内容,现在分享出来给eoeAndroid的各位同胞. 详情参考http://www.eoeandroid.com/thread-71642-1-1.html和http:/ ...

  7. CentOS6.4下搭建hadoop2.2(64bit)注意事项

    注:本文针对64位机器,32bit课直接tar -zxvf hadoop-2.2.0.tar.gz 解压配置即可. Step1:安装jdk(6以上版本) Step2:下载hadoop--->ht ...

  8. Thinkphp利用微信多客服消息推送取货二维码消息

    首先看微信官方的说法: 当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单.订阅事件.扫描二维码事件.支付成功事件.用户维权), 微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改 ...

  9. C语言中头文件<stdio.h>中的#ifndef _STDIO_H_

    先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  10. [php]php时间戳当中关于时区的问题

    PHP_VERSION = 5.5.11 话说php函数 time() 的起始时间戳是从:GMT 1970-01-01 00:00:00 开始算起的 写了点测试代码: $gmt1 = strtotim ...