ROS入门:保存和回放数据(bag文件的使用)

简介:

1.记录数据(生成bag文件)
2.检查并播放bag文件
3.记录数据集的子集:
4.常用命令汇总(更新中)

简介:

.bag文件可以保存ros系统运行过程中产生的话题和服务数据,并可以播放出来以供其他系统使用,有种仿真器的感觉,在使用 别人数据集的过程中十分有用。本文讲解了如何将正在运行的ROS系统中的数据记录到一个.bag文件中,然后回放这些数据,以在运行的系统中产生类似的数据流。

1.记录数据(生成bag文件)

首先在不同的终端运行下列指令,以运行小海龟的仿真程序:
终端1:

roscore

终端2:

rosrun turtlesim turtlesim_node

终端3:

rosrun turtlesim turtle_teleop_key

这时便会生成两个节点,一个用于可视化小海龟,另一个用于读取键盘的指令。在终端3下通过按上下左右即可控制乌龟的运动方向。

在这里插入图片描述

首查看一下此时系统发布的所有的话题,需要新打开一个终端:

rostopic list -v

在这里插入图片描述

这里显示了所有发布和接受到的话题名称及数据类型,接下来只记录发布的消息。
下面开始记录这些数据,新打开一个终端,运行:

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

这里创建一个临时bagfiles来记录数据,然后运行带有-a选项的rosbag record,-a表示所有发布的主题都应该保存在一个bag文件中。

现在通过键盘移动小海龟,大约10s钟即可
在运行rosbag record exit的窗口中,使用Ctrl-C键以停止程序。现在检查目录~/bagfiles的内容。您应该看到一个文件,文件名以年份、日期和时间开头,后缀为.bag。这是一个bag文件,包含运行rosbag记录时任何节点发布的所有主题。

在这里插入图片描述

2.检查并播放bag文件

查看bag文件信息:
在bag文件路径下打开终端,根据自己bag名称运行一下命令:

rosbag info 2020-07-04-11-01-11.bag

在这里插入图片描述

它告诉我们主题名称和类型以及包文件中包含的每个消息主题的数量
运行bag数据:

rosbag play 2020-07-04-11-01-11.bag

这时终端会输出很多消息

在这里插入图片描述

此时因为接收到了新的消息,小海龟开始自己移动了

在这里插入图片描述

也可以试一下二倍速

rosbag play -r 2 2020-07-04-11-01-11.bag

3.记录数据集的子集:

截取数据子集的原因是,很多时候系统中会有数十个话题,而我们可能只需要其中几个话题的数据。
具体做法很简单:

rosbag record -O subset /turtle1/cmd_vel /turtle1/pose

-O表示只记录一些数据子集,/turtle1/cmd_vel /turtle1/pose是所要记录的话题
用rosbag info命令查看bag文件的信息,发现只剩下了两个话题

在这里插入图片描述

4.常用命令汇总(更新中)

(1)记录所有的话题(-a),并制定名称(-O subset)

rosbag record -a -O subset

(2)记录指定的话题

rosbag record /imu /left 

(3)按一定速率播放bag文件( -r 100 )

rosbag play -r 100 ./test.bag

(4)更改话题名称并更改播放速率

rosrun topic_tools throttle messages /left-bef 4.0 /left-aft

(5)提取数据集中的图片:首先安装依赖项

sudo apt-get install ffmpeg

新建一个文件夹用于存储图片,并打开终端运行

rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE> 

< IMAGETOPICINBAGFILE >为bag文件
PS:如果输出的图片数量与rosbag info命令查询得到的数量不符,可以减少_sec_per_frame参数的值。
运行roscore并播放rosbag数据集

参考ros教程:
http://wiki.ros.org/ROS/Tutorials/Recording%20and%20playing%20back%20data