ROS学习笔记(十五)- 记录和回放数据

这个教程要学习的是怎么从一个运行的ROS系统中记录一些数据存放在.bag文件中,之后再回放这些数据制造一个相似的行为

1 记录数据(创建一个bag文件)

这一节会讲怎么从一个运行的ROS系统中记录topic的数据。topic的数据会被累计存储在一个bag文件中。
首先,执行以下三条命令:

roscore
rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

这就是之前的小海龟和键盘控制的两个node。

1.1 记录所有发布的topic

首先让我们列举出所有正在被发布消息的topic,打开一个新窗口,输入:
rostopic list -v
你将会看到如下内容:

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

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

列表中,只有publish topic才能被记录下来,换句话说,只有推送的message才能被记录。topic /turtle1/cmd_vel 是teleop_turtle 推送的命令消息,作为turtlesim 进程的输入,messages /turtle1/color_sensor 和 /turtle1/pose 是输出。
现在我们就要记录推送数据了,打开一个新窗口运行以下指令:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a

这里我们建立了一个临时文件夹去记录数据,然后运行rosbag record ,并加上a选项,指定将所有发布的topic数据都累加记录下来。
回到 turtle_teleop 窗口并运行小海龟10秒左右。
然后在运行rosbag的窗口Ctrl+C退出,接下来就要测试纪录的数据了。

2 检查并播放bag文件

我们可以通过rosbag info指令查看bag文件的内容,在bag文件所在的目录运行以下指令:
rosbag info <your bagfile>
bag文件的名称是由时间、后缀等内容组成的,如:
2017-03-12-10-28-01.bag
所以我应该执行:
rosbag info 2017-03-12-10-28-01.bag
然后会看到这个:

path:        2017-03-12-10-28-01.bag
version:     2.0
duration:    12:30s (750s)
start:       Mar 12 2017 10:28:01.76 (1489285681.76)
end:         Mar 12 2017 10:40:32.22 (1489286432.22)
size:        6.2 MB
messages:    93626
compression: none [7/7 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                     4 msgs    : rosgraph_msgs/Log   (2 connections)
             /turtle1/cmd_vel          122 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   46750 msgs    : turtlesim/Color    
             /turtle1/pose           46750 msgs    : turtlesim/Pose

这个会告诉我们topic的名字,类型,以及存储在这里的每个message topic的数目。
接下来我们就要回放记录了。首先关掉之前读取键盘的那个窗口,保留小海龟。
在新窗口中运行:
rosbag play <your bagfile>
后面这个还是要填你的文件名,比如我的是这样的:

qkingros@ubuntu:~/bagfiles$ rosbag play 2017-03-12-10-28-01.bag
[ INFO] [1489299953.329543310]: Opening 2017-03-12-10-28-01.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [PAUSED]   Bag Time: 1489285990.443460   Duration: 308.684625 / 750.462410     
^C

中间按了空格键,它显示了暂停,s表示一步一步运行。需要注意的是,可能你无法观察到小海龟的运动,因为在看前面的教程时,你输入了记录的命令之后,它就开始记录了,直到你按了键盘小乌龟才开始运动,前面这段时间小海龟是不动的,建议再重新做一次观察。
其实如果一开始纪录的内容就包含了让小海龟运行的指令,而小海龟还没打开,那很可能就会错过一些。这个时候可以使用-d选项让重放延时一定时间。
如果你不想再来一遍,可以使用-s让它从某个时间点开始。如果你不知道大概要多久,你可以试一下-r,就是rate,可以加快速度播放:
rosbag play -r 2 <your bagfile>
这样的话速度会变快两倍,速度太快可能会出现轨迹都发生了变化。

3 记录一个数据的子集

当我们运行一个很复杂的系统时,把所有topic的数据存下来是不切实际的,比如摄像头,可能会产生大量的数据。我们可以有选择的存储我们感兴趣的topic数据。
首先如果小海龟和键盘检测都关掉了,重新打开他们:

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

在你的bag文件所在目录,运行下面的指令:
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
这个-O高速rosbag record记录到subset.bag里面,后面的参数是让其值记录这些主题的数据。现在使用键盘让小海龟运动几秒钟,然后Ctrl+C停止记录。
现在看一下刚刚记录的bag的内容:
rosbag info subset.bag
你会看到如下内容,只记录了两个topic的内容。

path:        subset.bag
version:     2.0
duration:    22.8s
start:       Mar 12 2017 15:48:31.14 (1489304911.14)
end:         Mar 12 2017 15:48:53.97 (1489304933.97)
size:        119.6 KB
messages:    1470
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel     42 msgs    : geometry_msgs/Twist
             /turtle1/pose      1428 msgs    : turtlesim/Pose

可以再播放一下:
rosbag play subset.bag

4 rosbag record/play的局限性

在前面我们也看到了,如果加速播放,小海龟的路径都会出现问题。因为这个只是简单的对数据的记录和回放,如果节奏发生改变,很可能会引起接收端的一些错误,它并没有与接收方进行任何的交互。就像是你说话的录音,这个录音虽然可以向别人传递消息,但是至于那个人听到了什么它是不管的。所以有可能复现不出原来的行为。

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

推荐阅读更多精彩内容