这个教程教会告诉怎样将运行的ROS系统上的数据记录到一个.bag文件,然后再重放数据再产生相同的效果.1.1记录数据(创建一个bag文件)这部分将会指导你怎样从一个运行的ROS系统中记录topic的数据.这个topic数据会在一个bag文件中积累.首先,执行下面的命令:roscorerosrunturtlesimturtlesim_noderosrunturtlesimturtle_teleop_key这会创建两个节点-可观则的tuetlesim和一个用方向键键盘控制tuetlesim中的小乌龟的node.如果你选择你启动turtle_keyboard的终端窗口,你会看到:Readingfromkeyboard---------------------------Usearrowkeystomovetheturtle.按下键盘上的方向键就可以控制屏幕上的小乌龟了.注意:必须让你的光标处在运行turtle_teleop_keynode的终端窗口内.1.1.1记录所有发布的topics首先检查一下现在在系统上运行的所有topics的列表.在新的终端中运行:rostopiclsit-v应该输出:Publishedtopics:*/turtle1/color_sensor[turtlesim/Color]1publisher*/turtle1/cmd_vel[geometry_msgs/Twist]1publisher*/rosout[rosgraph_msgs/Log]2publishers*/rosout_agg[rosgraph_msgs/Log]1publisher*/turtle1/pose[turtlesim/Pose]1publisherSubscribedtopics:*/turtle1/cmd_vel[geometry_msgs/Twist]1subscriber*/rosout[rosgraph_msgs/Log]1subscriber这些发布的topic只是可能被记录在数据记录文件上的message文件类型,因为只有发布的messages才能被记录.topic/turtle1/cmd_vel是由teleop_turtle发布的命令message,它被作为turtlesim进程的输入./turtle1/color_sensor和/turtle1/pose是turtlesim发布的messages.我们现在会记录发布的数据.打开新的终端,输入:mkdir~/bagfilescd~/bagfilesrosbagrecord-a这里我们创建了一个临时目录记录数据,运行rosbagrecord命令时带着选项-a暗示所有发布的topics会在一个bag文件中聚集.回到有turtle_teleop的那个窗口使小乌龟运动10秒钟左右.在运行rosbagrecord的窗口摁Ctrl+c退出.现在检验一下目录~/bagfiles中的内容.你会看到一个以年,数据,和时间为名,后缀是.bag的文件.这个bag文件记录了在rosbagrecord运行时任何node发布的topics。1.2检验和回放bag文件既然我们已经用rosbagrecord在一个bag文件中记录了许多数据,我们可以通过命令rosbaginfo和rosbagplay来回放以检验数据。首先,我们看看bag文件中记录了些什么。我们可以用info命令检查bag的内容而不用回放它。在bag文件的目录下执行:rosbaginfoyourbagfile你应该看到:path:2014-12-10-20-08-34.bagversion:2.0duration:1:38s(98s)start:Dec10201420:08:35.83(1418270915.83)end:Dec10201420:10:14.38(1418271014.38)size:865.0KBmessages:12471compression:none[1/1chunks]types:geometry_msgs/Twist[9f195f881246fdfa2798d1d3eebca84a]rosgraph_msgs/Log[acffd30cd6b6de30f120938c17c593fb]turtlesim/Color[353891e354491c51aabe32df673fb446]turtlesim/Pose[863b248d5016ca62ea2e895ae5265cf9]topics:/rosout4msgs:rosgraph_msgs/Log(2connections)/turtle1/cmd_vel169msgs:geometry_msgs/Twist/turtle1/color_sensor6149msgs:turtlesim/Color/turtle1/pose6149msgs:turtlesim/Pose这里显示了topic的名字和类型还有每个topic在bag文件中包含的messages数量。我们可以看到我们在topic输出中看到的被广播的topic,五个中的四个实际上是经过我们的记录间隔发布的。当我们运行带选项-a的rosbagrecord命令时它会记录所有nodes发布的所有messages。下一步是重放bag文件,以在运行系统上产生相同的效果。首先在你运行turtle_teleop_key的终端用Ctrl+c杀死上个部分还在运行的teleop程序。让turtle继续运行。在产生原始bag文件的目录中运行以下命令:rosbagplayyourbagfile你会看到:[INFO][1418271315.162885976]:Opening2014-12-10-20-08-34.bagWaiting0.2secondsafteradvertisingtopics...done.Hitspacetotogglepaused,or's'tostep.在广播每个message之后,在它实际开始发布内容到bag文件按之前,默认rosbag会等待一个特定的时间段(0.2秒)。等待一段时间可以允许messages的订阅者注意到已经被广播了的message和将要被广播的messages。如果rosbagplay广播完messages马上就发布messages,订阅者可能会接受不到前面几个发布的messages。等待可以用-d来特别指定。最后topic/turtle1/cmd_vel会被发布,并且小乌龟会像你之前用键盘遥控的一样去移动。小乌龟移动的时间应该和你用rosbagrecord命令记录的时间相同。你也可以不在bag文件的开头开始返回,而是使用-s参数在不是bag文件开始的其他部分开始回放。最后一个有意思的选项是-r,它允许你通过一个特定的因子改变发布数据的速度。如果你执行:rosbagplay-r2yourbagfile你会看到小乌龟在有点不同的轨道上运动-这个轨道是你以两倍于之前的速度来发出键盘命令时会出现的轨迹。1.3记录数据子集当运行一个复杂的系统时,比如pr2的软件套装,可能会有上百的topics被发布。有些topics,比如摄像头图像流,可能会发布巨大量的数据,在这样的系统中写一个包含所有topics在单一的一个bag文件的日志文件是不实际的。rosbagrecord命令值支持在bag文件中记录一些特定的topics,允许用户值记录它们感兴趣的topics。如果turtlenodes退出了,重启keyboardteleop启动文件:rosrunturtlesimturtlesim_noderosrunturtlesimturtle_teleop_key在你的bag文件目录中运行:rosbagrecord-Osubset/turtle1/cmd_vel/turtle1/pose-O参数告诉rosbagrecord在一个叫做subset。bag的文件中记录,并且topic参数导致rosbagrecord值记录这里两个topics。用键盘方向键控制小乌龟运动几秒钟,然后在ctrl+c结束rosbagrecord。现在检查bag文件的内容(rosbaginfosubset.bag)。你会看到只有两个只有两个指定的topics:path:subset.bagversion:2.0duration:12.6sstart:Dec10201420:20:49.45(1418271649.45)end:Dec10201420:21:02.07(1418271662.07)size:68.3KBmessages:813compression:none[1/1chunks]types:geometry_msgs/Twist[9f195f881246fdfa2798d1d3eebca84a]turtlesim/Pose[863b248d5016ca62ea2e895ae5265cf9]topics:/turtle1/cmd_vel23msgs:geometry_msgs/Twist/turtle1/pose790msgs:turtlesim/Pose1.4rosbagrecord/play的局限在之前的部分你也许注意到小乌龟的路径跟你用键盘控制的路径不是非常准确的吻合,即使大概的形状是一样的,但是小乌龟没有非常完全跟踪那个路径。原因是小乌龟跟踪的路径对系统中时间变化非常敏感。在系统中,在messages被roscore记录和处理时以及使用rosplay产生和处理messages时,rosbag复制运行系统的行为的能力是有限的。对于像turtlesim这样的nodes,在命令messages被处理时,微小的时间改变,都导致敏锐的行为改变。用户不要期望完美的模仿行为。