此文章讲怎样将运行中的ROS系统记录保存在a.bag文件,并将保存的该文件运行得到相同的行为。






1,运行前准备工作



安装turtle_teleoppackage 和其相关的packages.



命令如下:



$ roscdturtle_teleop     



$ rosdepinstall turtle_teleop



$ rosmaketurtle_teleop



安装好turtle_teleop package的依赖项,然后生成turtle_teleop和所有没有生成的依赖项。






2,记录数据(生成bag文件)



首先,执行下面两条命令:



$ roscdturtle_teleop



$ roslaunchlaunch/turtle_keyboard.launch



此触launch会执行两个节点,turtlesim可视华节点和允许键盘执行节点。将鼠标放在终端,用键盘方向键控制turlesim时,终端会生成:



Reading fromkeyboard



-----------------------------------------



Use arrow keysto move the turtle.






1.2.1记录所有发送的topics



首先,检测所有列表的topics在运行系统中被发送。所以打开新的终端,执行下面命令:



$ rostopic list-v



得到输出结果:



Published topics:



  */turtle1/color_sensor [turtlesim/Color] 1 publisher



  */turtle1/command_velocity [turtlesim/Velocity] 1 publisher



  * /rosout[roslib/Log] 2 publishers



  */rosout_agg [roslib/Log] 1 publisher



  */turtle1/pose [turtlesim/Pose] 1 publisher






Subscribed topics:



  */turtle1/command_velocity [turtlesim/Velocity] 1 subscriber



  * /rosout[roslib/Log] 1 subscriber



这里所列举的topics只是消息类可能被记录的数据日志文件,因为只能发送的消息可以被记录。/turtle1/commanda_velocitypackag是turtle_teleop发送的消息,输入到turtlesim进程。/turtle1/color_sensor和/turtle1/pose消息是turtlesim发送的消息输出。






然后,我们开始记录发送的数据,打开新的终端,执行下面命令:



$ mkdir~/bagfiles



$ cd~/bagfiles



$ rosbag record-a






这里,我们创建一个临时路径来记录数据,然后执行rosbagrecord采用 -a 选项,表示所有的发送topics,都将记录在bag文件中。



将鼠标放到turtlesim终端上,运行10妙左右小海龟,用ctrl+c强制关闭rosbag终端,查看~/bagfiles,可以看到文件命名包括year,data,time 和 suffix.bag。这个文件包含所有节点发送的所有的主题在rosbag record运行时。






1.3,检查和运行bag文件



我们用rosbag record记录发送数据,我们也可以检查他并将他重现出来,采用命令rosbag info和rosbag play。



首先我们来查看下bag文件记载的数据。可以采用info命令,此命令检测bag文件的内容但是并不运行。



$ rosbag info<your bagfile> %我们需要cd到bag保存的目录下



我们得到(这是我电脑生成的):



$ rosbag info2011-02-21-17-06-35.bag 



path:         2011-02-21-17-06-35.bag



version:     2.0



duration:     6:36s (396s)



start:       Feb 21 2011 17:06:36.76(1298279196.76)



end:         Feb 212011 17:13:13.23 (1298279593.23)



size:         2.4MB



messages:     36462



compression: none [3/3chunks]



types:       roslib/Log         [acffd30cd6b6de30f120938c 17c593fb]



              turtlesim/Color     [353891e354491c51aabe32df 673fb446]



              turtlesim/Pose     [863b248d5016ca62ea2e895a e5265cf9]



              turtlesim/Velocity[9d5c2dcd348ac8f76ce2a430 7bd63a13]



topics:       /rosout                         4 msgs @ 323.2 Hz :roslib/Log         (2 connections)



              /turtle1/color_sensor       18189 msgs @  63.3 Hz : turtlesim/Color   



              /turtle1/command_velocity       80 msgs @  24.8 Hz : turtlesim/Velocity



              /turtle1/pose               18189 msgs@   63.7 Hz : turtlesim/Pose






他告诉我们topics的名字,类型,每个消息topic包含的数目。



下一步,我们运行这个bag文件,重现运行系统的行为。首先,要关闭掉所有turtlesim可能运行的节点(在launchturtle_keyboard.launch的终端运行- a Ctrl-C),然后在新的终端运行下命令:



$ rosrunturtlesim turtlesim_node



这个命令launches turtlesim节点,但没有触发键盘节点,我们可以对其用我们保存的bag文件,进行命令该turtle,在新的终端打开:



$ rosbag play<your bagfile>   %需要cd到保存bag文件的目录下。



比如我的是



$ rosbag play2011-02-21-17-06-35.bag 

[ INFO][1298281122.467928564]: Opening 2011-02-21-17-06-35.bag






Waiting 0.2 seconds afteradvertising topics... done.






Hit space to toggle paused, or's' to step.



  [RUNNING]  Bag Time: 1298279593.219138   Duration: 396.463736 / 396.479350      



Done.






我们会看到运行的结果跟我们之前所运行的结果完全一样,在默认的模式下,发送消息时间间隔为2S,时间间隔,可以用 -d 选项来设置。



一般的,/turtle1/command_velocitytopic将被发送,turtle,将在turtlesim运行类似我们已经在teleop程序中运行的模式。运行rosbagplay和turtle移动的间隔时间,应当大致等于原始rosbag record执行的时间和从键盘开始触发。我们也可以使得rosbagplay不从bag文件开始,而是从一些已经开始的间隔中,采用 -s 来设置。最后的选项是 -r,他是用来改变特定发送率的。比如,如果执行下面命令:



$ rosbag play-r 2 <your bagfile>



我们发现turtle执行不同的轨迹,这个轨迹是我们曾经从键盘触发的2倍速度。






1.4,记录数据子集



当运行完整的系统后,比如pr2软件系统,可能有上百个topics被发送。比如视频图像流,潜在的可发送的巨大数据。在这样的系统中,常常需要记录包括所有topics的日志文件保存到硬盘中。rosbagrecord 命令只支持一定的topic保存到bag 文件,运行用户记录感兴趣的topics。



如果turtlesim节点已经退出,重新launch键盘触发节点



$ roscdturtle_teleop



$ roslaunchlaunch/turtle_keyboard.launch



在bag文件路径,运行以下命令:



$ rosbag record-0 subset  /turtle1/command_velocity /turtle1/pose



-O 参数告诉rosbag record 记录的日志文件名为subset.bag,并且topic参数引起rosbag record仅仅subscribe2个topics.触发键盘移动turtle 几秒后,用ctrl+c终止rosbag record。



然后我们查看bagwenj ,(rosbag infosubset.bag)



这是我运行的结果:‘



path:         subset.bag



version:     2.0



duration:     1:44s(104s)



start:       Feb 21 2011 19:59:57.04 (1298289597.04)



end:         Feb 21 2011 20:01:41.27 (1298289701.27)



size:         370.0 KB



messages:     4796



compression: none [1/1 chunks]



types:       turtlesim/Pose     [863b248d5016ca62ea2e895a e5265cf9]



              turtlesim/Velocity[9d5c2dcd348ac8f76ce2a430 7bd63a13]



topics:       /turtle1/command_velocity     44 msgs @   0.6 Hz :turtlesim/Velocity



              /turtle1/pose               4752 msgs@ 64.0 Hz : turtlesim/Pose






1.5,rosbagrecord/play的限制



我们可能发现,对照turtle运行的轨迹和原始轨迹,并不是完全一样的。这是因为turtlesim运行的轨迹,对系统运行时间,非常敏感。rosbag在消息被记录和处理的同时,在消息被rosplay产生和处理的同时,不能精确的复制系统运行的行为。对于turtlesim节点,在当命令消息被处理轻微记时改变时,用户不可能气味完全精确的复制该行为