ROS中记录数据与回放

转自:https://blog.csdn.net/ab748998806/article/details/51194019

在使用ROS系统的时候,我们可能会遇到这样的需求——重现机器人在的运行状况或者分析机器人的某些运行数据。这时候我们就十分需要对数据进行记录和备份的功能,好在ROS提供了非常方便的这样的功能。

一、记录数据(通过创建bag文件)

这一节里介绍的是在一个运行中的ROS系统中记录某一个话题的信息,我们以小海龟节点为例,介绍如何在一个bag文件里记录话题发布的信息。

首先运行ROS:

roscore
  • 1

然后在另一个终端里启动小海龟节点:

rosrun turtlesim turtlesim_node 
  • 1

再在另一个终端里启动小海龟键盘键盘控制节点:

rosrun turtlesim turtle_teleop_key
  • 1

启动这个节点后我们会得到这样的信息:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
  • 1
  • 2
  • 3

就像命令行提示的一样,我们按方向键就可以控制海龟移动了。

1、记录当前存在的所有话题

首先在一个新的终端里使用以下命令查看当前存在的所有话题:

rostopic list -v
  • 1

输出类似于:

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 2 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后我们这样记录上面列表里存在的所有的信息:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a 
  • 1
  • 2
  • 3

我们先创建了一个临时目录,然后使用rosbag record命令记录信息,-a参数则指定了我们要记录当前全部话题的信息。

现在如前面所说的那样,我们用键盘控制小海龟移动,持续10几秒之后,按CTRL C退出record命令。

查看~/bagfiles目录,我们发现里面多了一个这样的文件2016-04-19-20-35-30.bag,文件名的意思是年-月-日-时-分-秒,这个文件里记录了这个文件名所示的时间里所有话题里的所有的信息。

二、使用备份数据重现节点状态

我们使用rosbag命令将数据记录在bag文件之后,还可以利用里面的数据重现我们节点的运行状态。

~/bagfiles目录里执行下面的命令查看文件信息:

rosbag info <your bagfile>
  • 1

这里得到输出类似这样:

path:        2016-04-19-20-35-30.bag
version:     2.0
duration:    2:08s (128s)
start:       Apr 19 2016 20:35:30.97 (1461069330.97)
end:         Apr 19 2016 20:37:39.83 (1461069459.83)
size:        1.1 MB
messages:    16369
compression: none [2/2 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                   19 msgs    : rosgraph_msgs/Log   (2 connections)
             /rosout_agg               15 msgs    : rosgraph_msgs/Log  
             /turtle1/cmd_vel         258 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   8039 msgs    : turtlesim/Color    
             /turtle1/pose           8038 msgs    : turtlesim/Pose
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

可以发现列出的文件详情包括信息的数量、类型、记录信息的时间等等。

下一步我们使用这个文件的数据来重现我们小海龟的运行状态。

首先在turtle_teleop_key节点运行着的终端里按CTRL C终止这个节点的运行,然后在~/bagfiles目录例子执行:

rosbag play <your bagfile>
  • 1

得到的输出类似:

[ INFO] [1461070112.371264040]: Opening 2016-04-19-20-35-30.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
  • 1
  • 2
  • 3
  • 4
  • 5

然后查看小海龟窗口,发现它在按照与之前相同的轨迹行进。

默认情况下,rosbag play命令会等待0.2秒之后才开始发布信息,这是为了在发布信息之前通知所有订阅信息的节点,以使它们能够及时地接收到rosbag play发布的信息。这个等待时间可以用-d选项指定。

因为rosbag record记录数据是有延迟的,所以在执行rosbag play最初的一小段时间里小海龟是不会动的,使用-s选项后跟秒数可以跳过bag文件记录的前几秒,从而是小海龟可以马上动起来。

另一个有趣的选项是-r,它可以改变信息发布的速度,比如

rosbag play -r 2 <your bagfile>
  • 1

将会以原来的两部速率发布bag文件内记录的信息,这其实等效于我们用原来两倍的速度来按键盘。

三、记录数据子集

在一个包含数百个话题的大型系统中,经常会发布诸如图像等的大量的信息,把它们都记录到一个文件里是不现实的,好在rosbag record命令提供了仅记录部分话题的能力。

还是在两个终端里分别启动这两个节点:

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key
  • 1
  • 2

然后在~/bagfiles目录里执行:

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

-O选项指定了我们要保存的bag文件的名字,后面的/turtle1/cmd_vel/turtle1/pose则指定了我们要记录信息的话题。

同上面一样,按几下键盘,记录一下10几秒的信息。

接下来在~/bagfiles目录里查看我们刚刚创建的文件的信息:

rosbag info subset.bag
  • 1

得到:

path:        subset.bag
version:     2.0
duration:    1:42s (102s)
start:       Apr 19 2016 21:10:00.97 (1461071400.97)
end:         Apr 19 2016 21:11:43.78 (1461071503.78)
size:        494.3 KB
messages:    6427
compression: none [1/1 chunks]
types:       turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/pose   6427 msgs    : turtlesim/Pose
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以发现,这一次文件内仅保存了/turtle1/poseturtlesim/Pose两个话题的信息。

四、rosbag record/play的局限

我们可以发现,尽管我们记录了小海龟的运行数据并且重新使用了它们,但是小海龟运动的形状同以前并不完全相同。

这是因为,对于小海龟运动这类动作,极小的时间上的差别就会产生不同的结果,而rosbag记录时间的精度又是有限的,我们不可能完全重现小海龟的状态。所以要记住这一点——我们默认rosbag record/play无法完美重现系统的状态。

猜你喜欢

转载自blog.csdn.net/yinxingtianxia/article/details/80266768