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

roscore

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

rosrun turtlesim turtlesim_node

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

rosrun turtlesim turtle_teleop_key

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


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

turtlesim_nodeturtle_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话题的更多相关文章

  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. mongodb 2.6.6 在window10下的安装

    首先感谢波仔的知道,其次感叹下WIN10的牛叉,兼容性还不错. 首先,下载mongodb 2.6.6 安装包,可惜,官网太慢,还得注册.不过还好,我是个好人:http://pan.baidu.com/ ...

  2. javascript 全选与反选

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  3. Javascript数组中shift()和push(),unshift()和pop()操作方法使用

    Javascript为数组专门提供了push和pop()方法,以便实现类似栈的行为.来看下面的例子: var colors=new Array();       //创建一个数组 var count= ...

  4. SqlServer mssql 按月统计所有部门

    以订单统计为例,前端展示柱状图(Jquery统计): 表及主要字段描述如下:表名:Orders1.日期CreateTime2.金额Amount3.用户UserID 情况一:根据部门统计某一年每月销量( ...

  5. jquery 浏览器放大缩小函数resize

    <script> $(function(){ $(window).resize(function(){ var _height = $(window).height(); var _con ...

  6. Apache Tomcat Not Showing in Eclipse Server Runtime Environments

    In my case I needed to install "JST Server Adapters". I am running Eclipse 3.6 Helios RCP ...

  7. C++引用和函数返回值

    这是老师上课讲的内容,现在把它写下来,一方面当做复习,另一方面真的想学点东西.废话不多说,先贴上测试的代码: #include <iostream.h> float temp; float ...

  8. 在MyEclipse环境下写Struts,删除项目不干净的问题的解决

    这个头疼的问题弄了好几个小时,终于弄好了.方法如下:1.建立一个新的项目,确认自己已经部署好Struts2的环境(网上有好多教程).运行Tomcat还是会有之前的项目的错误,接下来进行第二步2.将To ...

  9. python初学笔记(三)

    Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节 (byte),所以,一 ...

  10. [原创]obj-c编程17:键值观察(KVO)

    原文链接:[原创]obj-c编程17:键值观察(KVO) 系列专栏链接:objective-c 编程系列 说完了前面一篇KVC,不能不说说它的应用KVO(Key-Value Observing)喽.K ...