记录数据(创建一个bag文件)
从一个运行的ROS系统中记录topic数据,并存储到bag文件中。
首先,打开一个Terminal窗口,运行roscore。
roscore
打开第二个Terminal窗口,运行turtlesim包中的turtlesim_node节点:
rosrun turtlesim turtlesim_node
打开第三个Terminal窗口,运行turtlesim包中的turtle_teleop_key节点,能够接收键盘的输入:
rosrun turtlesim turtle_teleop_key
返回下述值:
Reading from keyboard --------------------------- Use arrow keys to move the turtle. 'q' to quit.
这样就可以通过键盘上的方向键控制小乌龟的移动。(注意必须是在turtle_teleop_key窗口输入,而不是在小乌龟显示窗口)。
记录所有发布的topic
打开一个新的Terminal窗口,输入下述命令,查看当前所有的topic。
rostopic list -v
返回下述中的topic:
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
上述列表中的published topic列表是唯一可能被记录在log数据文件中的消息类型。/turtle1/cmd_vel话题是由teleop_turtle发布的,/turtle1/color_sensor 和 /turtle1/pose是turtlesim发布的。
我们现在将要记录这些发布的数据,创建一个新的文件夹bagfiles,然后切换到新建的文件夹,记录数据到bag文件。
mkdir ~/bagfiles cd ~/bagfiles rosbag record -a
上述命令中我们创建了一个临时文件夹,然后在这个文件夹下使用rosbag record 进行记录数据到bag文件,“-a”代表了记录所有的published topic。
下面,在turtle_teleop_key窗口中用方向键控制小乌龟移动。然后用Ctrl + C 命令退出,切换来到刚才创建的文件夹,查看是否存在一个以 日期 时间命名的bag文件:
$ ls 2021-11-17-15-29-40.bag
这个bag文件记录了在运行rosbag record之后的时间中任意节点发布的所有topic。
测试和回放bag文件中的数据
我们在上一节中使用rosbag record命令记录了一个.bag文件。下面呢,我们就通过rosbag info和rosbag play两个命令分别来查看bag文件的信息以及回放数据。
使用rosbag info命令
首先,我们使用rosbag info查看此bag文件中记录了什么信息。在bag文件所在的文件夹中执行此命令,用法如下:
rosbag info <your bagfile>
对于我们的bag文件命令变为如下形式:
rosbag info 2021-11-17-15-29-40.bag
返回结果:
path: 2021-11-17-15-29-40.bag version: 2.0 duration: 1:00s (60s) start: Nov 17 2021 15:29:40.61 (1637134180.61) end: Nov 17 2021 15:30:40.62 (1637134240.62) size: 521.8 KB messages: 7486 compression: none [1/1 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 16 msgs : geometry_msgs/Twist /turtle1/color_sensor 3733 msgs : turtlesim/Color /turtle1/pose 3733 msgs : turtlesim/Pose
这告诉了我们topic的名称及类型,以及每个topic在bage文件中message的数量。我们能够看到其中记录了rostopic list中5个topic中的四个。这是因为我们使用了“-a”命令。
使用rosbag play命令
下一步是回放bag文件,以在运行的ROS系统中重现上述记录的内容。首先终止上一节运行的teleop程序,即在turtle_teleop_key的终端中使用Ctrl + C,结束命令。
然后,使用下面的命令清除已有的轨迹:
rosservice call /clear
接着使用rosbag play命令,回放数据:
rosbag play 2021-11-17-15-29-40.bag
可以看到小乌龟按照之前录制过程中的行驶轨迹进行回放:
[ INFO] [1637137724.569364284]: Opening 2021-11-17-15-29-40.bag Waiting 0.2 seconds after advertising topics... done. Hit space to toggle paused, or 's' to step. [RUNNING] Bag Time: 1637134180.611523 Duration: 0.000000 / 60.010978 [RUNNING] Bag Time: 1637134180.612333 Duration: 0.000810 / 60.010978 [RUNNING] Bag Time: 1637134180.712481 Duration: 0.100958 / 60.010978 ... ... [RUNNING] Bag Time: 1637134240.557778 Duration: 59.946255 / 60.010978 [RUNNING] Bag Time: 1637134240.573918 Duration: 59.962395 / 60.010978 [RUNNING] Bag Time: 1637134240.573929 Duration: 59.962406 / 60.010978 [RUNNING] Bag Time: 1637134240.590156 Duration: 59.978633 / 60.010978 Done.
如果rosbag play在广播发布后立即发布消息,订阅者可能不会收到前几条发布的消息。我们可以使用 -d 选项指定等待时间。
最后,将发布话题 /turtle1/cmd_vel,并且小乌龟应该开始按照类似于我们曾经通过teleop_key模式输入的那样进行移动。
我们还可以有一些其他的操作,比如说使用rosbag play 的 “-s”参数,让bag包不是从开始的位置播放而是经过了一些时间之后再播放。此外,还有一个“-r”参数,能够让我们改变播放bag文件的频率。比如说我们想要设置 2倍速 播放,命令如下:
rosbag play -r 2 2021-11-17-15-29-40.bag
需要注意的是,这样会导致我们所看到的轨迹略有不同。
记录数据的子集
当我们在一个复制的系统下使用上述命令时,可能发布了上百个topic,其中一些类似于是图像流的topic会有大量的数据,这样的话直接记录所有的topic到硬盘中的bag文件是不太实际的。因此,rosbag record命令支持将特定的topic记录到bag文件中,允许用户只记录他们所感兴趣的topic。
比如说,我们只需要记录/turtle1/cmd_vel 和 /turtle1/pose两个topic:
rosbag record -o subset /turtle1/cmd_vel /turtle1/pose
上述命令“-o subuset” 是对.bag文件进行命名为subset,然后后面的/turtle1/cmd_vel 和 /turtle1/pose是要记录的两个topic名称。
执行之后,稍等一会儿,使用Ctrl + C 结束。
接着,使用rosbag info查看记录了bag文件信息:
rosbag info subset_2021-11-17-16-59-22.bag
返回结果:
path: subset_2021-11-17-16-59-22.bag version: 2.0 duration: 17.7s start: Nov 17 2021 16:59:22.31 (1637139562.31) end: Nov 17 2021 16:59:39.99 (1637139579.99) size: 92.5 KB messages: 1123 compression: none [1/1 chunks] types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a] turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9] topics: /turtle1/cmd_vel 17 msgs : geometry_msgs/Twist /turtle1/pose 1106 msgs : turtlesim/Pose
可以看到,bag文件中只有我们所记录的/turtle1/cmd_vel 和 /turtle1/pose两个topic。
我们可能已经注意到海龟的路径可能没有精确映射到原始键盘输入,跟踪相同的路径。(粗略的形状应该是相同的)这是因为turtlesim跟踪的路径对系统中的时间变化非常敏感,而rosbag在rosbag record记录和处理消息的时间以及使用rosbag play生成和处理消息的时间方面精确复制系统行为的能力有限。对于turtlesim这样的节点,处理命令消息时的微小时间变化会微妙地改变行为,我们不应该期望能够完全模仿行驶轨迹。