ROS学习笔记(八)- 理解ROS Topics

1 设置

1.1 roscore

如果上次运行的Terminal已经关掉了,就重新roscore一下,必须先启动ROS才能继续。

1.2 turtlesim

然后再打开一个命令窗口,运行一个海龟:
$ rosrun turtlesim turtlesim_node

1.3 海龟键盘操作

再打开一个窗口,我们要运行对它的键盘操作了:
$ rosrun turtlesim turtle_teleop_key

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.

这个时候你必须点运行键盘的窗口,这样键盘的操作才能被记下来。

2 ROS Topics

刚才打开的turtlesim_node 和turtle_teleop_key 两个node就是通过Topic通信的。
turtle_teleop_key 把键盘点击发布到一个Topic,如果turtlesim_node 订阅了这个Topic,它就可以得到键盘点击的内容。我们可以通过rqt_graph查看正在运行的node和topic。
Note: If you're using electric or earlier, rqt is not available. Use rxgraph instead.

2.1 使用rqt_graph

这个东西能够创建一个动态图来描述系统里面正在运行什么。rqt_graph 是rqt包的一部分。除非你已经安装过了,不然就得安装一下:

$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins

还是一样的<distro>要换成版本号,比如kinetic。
开个新窗口,运行:
$ rosrun rqt_graph rqt_graph
然后你就会看到这样一张图:

rqt_Image.png

把鼠标移到 /turtle1/command_velocity 上之后,node就会变成蓝色和绿色,Topic就会变成红色。可以看到两个node是通过/turtle1/cmd_vel交流的。

2.2 引入rostopic

这个嘞,就是可以从ROS topic获取信息。
可以使用help查看一些相关命令用法:
$ rostopic -h

rostopic is a command-line tool for printing information about ROS Topics.

Commands:
    rostopic bw display bandwidth used by topic
    rostopic delay  display delay of topic from timestamp in header
    rostopic echo   print messages to screen
    rostopic find   find topics by type
    rostopic hz display publishing rate of topic    
    rostopic info   print information about active topic
    rostopic list   list active topics
    rostopic pub    publish data to topic
    rostopic type   print topic or field type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

我们可以试着用一下。

2.3 使用rostopic echo

rostopic echo展示发布到topic上的数据
用法:
rostopic echo [topic]
看一下刚才那个topic:
$ rostopic echo /turtle1/cmd_vel
这个时候什么都不会显示,因为还没有按按键,选择小海龟那个命令行窗口,然后按按键,就会有数据了。
类似这样的数据。

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
---

重新看一下rqt_graph ,点一下refresh,你会发现rostopic echo也订阅了 /turtle1/cmd_vel主题。

rqt_graph_2

使用rostopic list

这个命令会列举出当前正在被发布和订阅的所有topic。
看一下怎么用:
$ rostopic list -h

Usage: rostopic list [/namespace]

Options:
  -h, --help            show this help message and exit
  -b BAGFILE, --bag=BAGFILE
                        list topics in .bag file
  -v, --verbose         list full details about each topic
  -p                    list only publishers
  -s                    list only subscribers
  --host                group by host name

我们可以列举出所有信息:
$ rostopic list -v
显示如下:

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 4 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
 * /rosout [rosgraph_msgs/Log] 1 subscriber
 * /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber

3 ROS Messages

node就是通过在topic上面发送message来交流的。发布者和订阅者能够交流,是因为他们使用了相同的Message类型,topic的类型就取决于message的类型。message的类型可以由rostopic type来定义。

3.1 使用rostopic type

它可以返回任何topic被发布的message类型。
用法:
rostopic type [topic]
比如:
$ rostopic type /turtle1/cmd_vel
然后得到这个:
geometry_msgs/Twist
我们可以看一下他的详细信息:
$ 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

现在我们就知道我们的小海龟想要的数据类型了,我们可以直接给它发命令。

4 深入一步学习rostopic

我们要结合message使用topic了。

4.1 使用rostopic pub

rostopic pub publishes data on to a topic currently advertised.
我翻译不好,英语渣渣,这个笔记只是记录我的学习历程,并不是教程,如果其他人看见了,权当参考,我基本就是在翻译,没有写多少自己的理解。
这个命令可以向正在运行的topic发布数据消息。
用法:
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]'
官网说这个例子还挺复杂的,我们具体看一下:

  • 这个命令会把message发送到指定的topic
    rostopic pub
  • 这个选项是让rostopic只发布一次message,然后退出
    -1
  • 这个是message要发布到的topic的名字
    /turtle1/cmd_vel
  • 这个是发布message到topic的时候要使用的消息类型
    geometry_msgs/Twist
  • 这个就是告诉选项解析器,后面如果再出现“-”就不要管了,不是选项了。
    --
  • 最后一部分就是参数了,就是对应之前获得的数据类型写的。
    '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
    这么写的原因,是这个满足YAML语法,可以详细看看YAML命令行文档
    小乌龟移动了一下就不动了,原因是它需要持续的1Hz命令流才能保持移动,我们可以用 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]'
    现在小乌龟就一直在转圈了,我们可以再看一下rqt_graph:
Nodes only

4.2 使用rostopic hz

这个可以显示每个发布数据的速率
用法:
rostopic hz [topic]
我们可以来看一下, turtlesim_node发布 /turtle1/pose的速度有多快:
$ rostopic hz /turtle1/pose
可以看到:

subscribed to [/turtle1/pose]
average rate: 63.174
    min: 0.008s max: 0.022s std dev: 0.00229s window: 59
average rate: 62.830
    min: 0.008s max: 0.022s std dev: 0.00195s window: 122
average rate: 62.716
    min: 0.008s max: 0.022s std dev: 0.00191s window: 185
average rate: 62.659
    min: 0.008s max: 0.022s std dev: 0.00195s window: 247
average rate: 62.583
    min: 0.008s max: 0.022s std dev: 0.00192s window: 310
average rate: 62.583
    min: 0.008s max: 0.023s std dev: 0.00195s window: 372
average rate: 62.574
    min: 0.008s max: 0.023s std dev: 0.00192s window: 435
average rate: 62.557
    min: 0.008s max: 0.023s std dev: 0.00189s window: 498
average rate: 62.575
    min: 0.008s max: 0.023s std dev: 0.00187s window: 560
average rate: 62.566

我们可以看到turtlesim 发布数据的速度是60Hz,我们也可以通过 rostopic type和 rosmsg show 结合获得更多关于topic的信息。
$ rostopic type /turtle1/cmd_vel | rosmsg show

5 使用rqt_plot

首先运行rqtploat:
$ rosrun rqt_plot rqt_plot
等一会儿就会弹出来一个框,在左上角输入 /turtle1/pose/x ,然后点击“+”再输入/turtle1/pose/y,点击“+”。
就可以看到两条曲线,是发布到topic上的数据关于时间的曲线。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,966评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,170评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,909评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,959评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,851评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,583评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,956评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,590评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,878评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,892评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,719评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,501评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,957评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,124评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,440评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,003评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,211评论 2 339

推荐阅读更多精彩内容