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
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
后面这个还是要填你的文件名,比如我的是这样的:

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
这样的话速度会变快两倍,速度太快可能会出现轨迹都发生了变化。

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的局限性

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

你可能感兴趣的:(ROS学习笔记(十五)- 记录和回放数据)