机器人操作系统(ROS)教程10:ROS的话题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9949|回复: 1

机器人操作系统(ROS)教程10:ROS的话题

[复制链接]
发表于 2015-2-14 12:01 | 显示全部楼层 |阅读模式
本帖最后由 对折之内 于 2015-2-14 12:05 编辑

上节我们启动了一个turtlesim_node  节点,这节我们再启动一个turtle_teleop_key  节点,并他们之间通过话题来互相通信。先看下这几个概念:                节点(NODE):一个节点就是一个可执行程序,它使用ROS可以和其他节点进行通信。

     消息(Message):当在一个话题上,发布或订阅时所使用的ROS的数据类型。

     话题(Topic):节点可以在一个话题上发布消息,同样也可以订阅一个话题来接收消息。

区分这几个概念,对理解ROS是很有帮助的。

现在打开终端,输入:


roscore  


再打开一个新的终端,运行一个turtlesim_node节点:
rosrun turtlesim turtlesim_node  

再打开一个终端,运行
turtle_teleop_key 节点:

rosrun turtlesim turtle_teleop_key  

在运行完这条命令后,在打开turtle_teleop_key 节点的这个终端下,按键盘上的方向键可以看到,之前我们运行的乌龟开始移动。就说明这两个节点间已经建立了通讯。 turtlesim_node和turtle_teleop_key通过ROS的话题来相互通信。turtle_teleop_key把用户按下的键发布到话题上,turtlesim_node也订阅了同一个话题用来接收用户按下的键,并做出相应的动作。从这个例子就可以明白节点和话题的关系和作用了。
我们可以使用rqt_graph工具来创建当前系统中运行的节点的动态图。从这个工具中你可以直观地看到节点之间通过话题的连接。如果没有安装rqt_graph的话,先输入:
sudo apt-get install ros-indigo-rqt  

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

来安装。
在这个过程中,不要关闭前面打开的节点。
新打开一个终端,输入:
rosrun rqt_graph rqt_graph

来启动
rqt_graph工具。就可以在rqt_graph中看到一个表示节点之间的关系的图。将鼠标放在图片上面可以看到图片会变为高亮。可以看到两个节点是通过/turtle1/cmd_vel话题来进行通信的。如下图所示:
图像 1.png

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

例如,我们可以输入:
rostopic echo /turtle1/cmd_vel   

之后我们在运行turtle_teleop_key节点的窗口下按方向键,就可以在刚才的窗口看到输出的数据如下:
[mw_shl_code=c,true]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  [/mw_shl_code]

现在点击rqt_graph窗口左上角的刷新按钮,就可以看到刚才的话题又多了一个订阅者。如下:
图像 2.png
使用rostopic list命令可以列举出当前系统中的话题:
rostopic list

使用
rostopic list -v  

可以详细地
查看每一个话题的发布者和订阅者的个数。
需要注意的是:发布者(turtle_teleop_key)和接收者(turtlesim_node)的通信,发布者和接收者必须使用相同类型的消息。也就是说,一个话题的类型是通过在它上面发布的消息的类型来定义的。可以通过:
rostopic type /turtle1/cmd_vel  

命令来
查看/turtle1/cmd_vel的消息类型。你得到的返回类型如下:
[mw_shl_code=c,true]geometry_msgs/Twist
[/mw_shl_code]

还可以使用rosmsg命令来查看一个消息类型的详细信息:
rosmsg show geometry_msgs/Twist  

得到的结果如下:
[mw_shl_code=c,true]geometry_msgs/Vector3 linear  
  float64 x  
  float64 y  
  float64 z  
geometry_msgs/Vector3 angular  
  float64 x  
  float64 y  
  float64 z  [/mw_shl_code]

于是我们就知道了发布者(turtle_teleop_key)和接收者(turtlesim_node)之间通信的消息类型了,于是我们可以自己用rostopic pub命令用来发布消息,使乌龟动起来。
rostopic pub命令的使用方法如下:
rostopic pub [topic] [msg_type] [args]

实例如下:

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

我们可以看到,乌龟运动了一个弧度。

我们来详细解析一下rostopic pub 命令的参数。
[mw_shl_code=c,true]-1[/mw_shl_code]
这个参数是说明执行命令的次数。此处表示,执行这个命令一次。
[mw_shl_code=c,true]/turtle1/cmd_vel[/mw_shl_code]
这个参数表示,发布这个消息的话题。是用哪个话题把这个消息发布出去。
[mw_shl_code=c,true] geometry_msgs/Twist[/mw_shl_code]
这个参数是说明消息的类型。
[mw_shl_code=c,true]'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'[/mw_shl_code]
这个则是消息的内容。可与geometry_msgs/Twist的类型一一对应。
可以使用rostopic pub -r命令让乌龟持续运动,如:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

可以看到,乌龟围绕着一个圈在不停的运动。








发表于 2016-8-31 09:52 | 显示全部楼层
可以,继续学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:29 , Processed in 0.075388 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表