ROS学习-记录和回放数据

本文涉及的产品
资源编排,不限时长
简介: ROS学习-记录和回放数据

记录数据(创建一个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这样的节点,处理命令消息时的微小时间变化会微妙地改变行为,我们不应该期望能够完全模仿行驶轨迹。

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
2月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
2月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
机器学习/深度学习 机器人 中间件
ubuntu16.04下ROS操作系统学习笔记(五)gazebo物理仿真环境搭建、加载服务端模型数据减少报错
ubuntu16.04下ROS操作系统学习笔记(五)gazebo物理仿真环境搭建、加载服务端模型数据减少报错
202 0
|
C++
ROS学习-写一个tf broadcaster(C++)
ROS学习-写一个tf broadcaster(C++)
190 0
ROS学习-写一个tf broadcaster(C++)
|
数据可视化 Ubuntu 机器人
ROS学习-tf介绍
ROS学习-tf介绍
269 0
ROS学习-tf介绍
|
存储
ROS学习-写一个简单的Publisher和Subscriber
ROS学习-写一个简单的Publisher和Subscriber
171 0
ROS学习-写一个简单的Publisher和Subscriber
|
XML 数据格式
ROS学习-使用rqt_console 和 roslaunch
ROS学习-使用rqt_console 和 roslaunch
182 0
ROS学习-使用rqt_console 和 roslaunch
|
存储
ROS学习-理解ROS Services 和 Parameters
ROS学习-理解ROS Services 和 Parameters
280 0
ROS学习-理解ROS Services 和 Parameters
ROS学习-理解ROS话题
ROS学习-理解ROS话题
551 0
ROS学习-理解ROS话题
|
C++ Python
ROS学习-理解ROS节点
ROS学习-理解ROS节点
580 0
ROS学习-理解ROS节点

推荐镜像

更多