首页 >> 大全

ROS学习-记录和回放数据

2023-07-30 大全 31 作者:考证青年

本博客将介绍怎么使用ROS系统来记录数据到一个.bag文件中,然后回放数据,在运行系统中产生类似的效果。

记录数据(创建一个bag文件)

从一个运行的ROS系统中记录topic数据,并存储到bag文件中。

首先,打开一个窗口,运行。

roscore

打开第二个窗口,运行包中的节点:

rosrun turtlesim turtlesim_node

打开第三个窗口,运行包中的节点,能够接收键盘的输入:

rosrun turtlesim turtle_teleop_key

返回下述值:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle. 'q' to quit.

这样就可以通过键盘上的方向键控制小乌龟的移动。(注意必须是在窗口输入,而不是在小乌龟显示窗口)。

记录所有发布的topic

打开一个新的窗口,输入下述命令,查看当前所有的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 publisherSubscribed topics:* /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber* /rosout [rosgraph_msgs/Log] 1 subscriber

上述列表中的 topic列表是唯一可能被记录在log数据文件中的消息类型。//话题是由发布的,// 和 //pose是发布的。

我们现在将要记录这些发布的数据,创建一个新的文件夹,然后切换到新建的文件夹,记录数据到bag文件。

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a

上述命令中我们创建了一个临时文件夹,然后在这个文件夹下使用 进行记录数据到bag文件,“-a”代表了记录所有的 topic。

下面,在窗口中用方向键控制小乌龟移动。然后用Ctrl + C 命令退出,切换来到刚才创建的文件夹,查看是否存在一个以 日期 时间命名的bag文件:

$ ls2021-11-17-15-29-40.bag

这个bag文件记录了在运行 之后的时间中任意节点发布的所有topic。

测试和回放bag文件中的数据

我们在上一节中使用 命令记录了一个.bag文件。下面呢,我们就通过 info和 play两个命令分别来查看bag文件的信息以及回放数据。

使用 info命令

首先,我们使用 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文件中的数量。我们能够看到其中记录了 list中5个topic中的四个。这是因为我们使用了“-a”命令。

使用 play命令

下一步是回放bag文件,以在运行的ROS系统中重现上述记录的内容。首先终止上一节运行的程序,即在的终端中使用Ctrl + C,结束命令。

然后,使用下面的命令清除已有的轨迹:

rosservice call /clear

接着使用 play命令,回放数据:

rosbag play 2021-11-17-15-29-40.bag

可以看到小乌龟按照之前录制过程中的行驶轨迹进行回放:

[ INFO] [1637137724.569364284]: Opening 2021-11-17-15-29-40.bagWaiting 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.

如果 play在广播发布后立即发布消息,订阅者可能不会收到前几条发布的消息。我们可以使用 -d 选项指定等待时间。

最后,将发布话题 //,并且小乌龟应该开始按照类似于我们曾经通过模式输入的那样进行移动。

我们还可以有一些其他的操作,比如说使用 play 的 “-s”参数,让bag包不是从开始的位置播放而是经过了一些时间之后再播放。此外,还有一个“-r”参数,能够让我们改变播放bag文件的频率。比如说我们想要设置 2倍速 播放,命令如下:

rosbag play -r 2 2021-11-17-15-29-40.bag

需要注意的是,这样会导致我们所看到的轨迹略有不同。

记录数据的子集

当我们在一个复制的系统下使用上述命令时,可能发布了上百个topic,其中一些类似于是图像流的topic会有大量的数据,这样的话直接记录所有的topic到硬盘中的bag文件是不太实际的。因此, 命令支持将特定的topic记录到bag文件中,允许用户只记录他们所感兴趣的topic。

比如说,我们只需要记录// 和 //pose两个topic:

rosbag record -o subset /turtle1/cmd_vel /turtle1/pose

上述命令“-o ” 是对.bag文件进行命名为,然后后面的// 和 //pose是要记录的两个topic名称。

执行之后,稍等一会儿,使用Ctrl + C 结束。

接着,使用 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文件中只有我们所记录的// 和 //pose两个topic。

我们可能已经注意到海龟的路径可能没有精确映射到原始键盘输入,跟踪相同的路径。(粗略的形状应该是相同的)这是因为跟踪的路径对系统中的时间变化非常敏感,而在 记录和处理消息的时间以及使用 play生成和处理消息的时间方面精确复制系统行为的能力有限。对于这样的节点,处理命令消息时的微小时间变化会微妙地改变行为,我们不应该期望能够完全模仿行驶轨迹。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了