转自:https://blog.csdn.net/ab748998806/article/details/51194019

在使用ROS系统的时候,我们可能会遇到这样的需求——重现机器人在的运行状况或者分析机器人的某些运行数据。这时候我们就十分需要对数据进行记录和备份的功能,好在ROS提供了非常方便的这样的功能。

一、记录数据(通过创建bag文件)

这一节里介绍的是在一个运行中的ROS系统中记录某一个话题的信息,我们以小海龟节点为例,介绍如何在一个bag文件里记录话题发布的信息。

首先运行ROS:

roscore
  • 1

然后在另一个终端里启动小海龟节点:

rosrun turtlesim turtlesim_node 
  • 1

再在另一个终端里启动小海龟键盘键盘控制节点:

rosrun turtlesim turtle_teleop_key
  • 1

启动这个节点后我们会得到这样的信息:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
  • 1
  • 2
  • 3

就像命令行提示的一样,我们按方向键就可以控制海龟移动了。

1、记录当前存在的所有话题

首先在一个新的终端里使用以下命令查看当前存在的所有话题:

rostopic list -v
  • 1

输出类似于:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后我们这样记录上面列表里存在的所有的信息:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a 
  • 1
  • 2
  • 3

我们先创建了一个临时目录,然后使用rosbag record命令记录信息,-a参数则指定了我们要记录当前全部话题的信息。

现在如前面所说的那样,我们用键盘控制小海龟移动,持续10几秒之后,按CTRL C退出record命令。

查看~/bagfiles目录,我们发现里面多了一个这样的文件2016-04-19-20-35-30.bag,文件名的意思是年-月-日-时-分-秒,这个文件里记录了这个文件名所示的时间里所有话题里的所有的信息。

二、使用备份数据重现节点状态

我们使用rosbag命令将数据记录在bag文件之后,还可以利用里面的数据重现我们节点的运行状态。

~/bagfiles目录里执行下面的命令查看文件信息:

rosbag info <your bagfile>
  • 1

这里得到输出类似这样:

path:        2016-04-19-20-35-30.bag
version:     2.0
duration:    2:08s (128s)
start:       Apr 19 2016 20:35:30.97 (1461069330.97)
end:         Apr 19 2016 20:37:39.83 (1461069459.83)
size:        1.1 MB
messages:    16369
compression: none [2/2 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]turtlesim/Color     [353891e354491c51aabe32df673fb446]turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                   19 msgs    : rosgraph_msgs/Log   (2 connections)/rosout_agg               15 msgs    : rosgraph_msgs/Log  /turtle1/cmd_vel         258 msgs    : geometry_msgs/Twist/turtle1/color_sensor   8039 msgs    : turtlesim/Color    /turtle1/pose           8038 msgs    : turtlesim/Pose
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

可以发现列出的文件详情包括信息的数量、类型、记录信息的时间等等。

下一步我们使用这个文件的数据来重现我们小海龟的运行状态。

首先在turtle_teleop_key节点运行着的终端里按CTRL C终止这个节点的运行,然后在~/bagfiles目录例子执行:

rosbag play <your bagfile>
  • 1

得到的输出类似:

[ INFO] [1461070112.371264040]: Opening 2016-04-19-20-35-30.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
  • 1
  • 2
  • 3
  • 4
  • 5

然后查看小海龟窗口,发现它在按照与之前相同的轨迹行进。

默认情况下,rosbag play命令会等待0.2秒之后才开始发布信息,这是为了在发布信息之前通知所有订阅信息的节点,以使它们能够及时地接收到rosbag play发布的信息。这个等待时间可以用-d选项指定。

因为rosbag record记录数据是有延迟的,所以在执行rosbag play最初的一小段时间里小海龟是不会动的,使用-s选项后跟秒数可以跳过bag文件记录的前几秒,从而是小海龟可以马上动起来。

另一个有趣的选项是-r,它可以改变信息发布的速度,比如

rosbag play -r 2 <your bagfile>
  • 1

将会以原来的两部速率发布bag文件内记录的信息,这其实等效于我们用原来两倍的速度来按键盘。

三、记录数据子集

在一个包含数百个话题的大型系统中,经常会发布诸如图像等的大量的信息,把它们都记录到一个文件里是不现实的,好在rosbag record命令提供了仅记录部分话题的能力。

还是在两个终端里分别启动这两个节点:

rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
  • 1
  • 2

然后在~/bagfiles目录里执行:

rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
  • 1

-O选项指定了我们要保存的bag文件的名字,后面的/turtle1/cmd_vel/turtle1/pose则指定了我们要记录信息的话题。

同上面一样,按几下键盘,记录一下10几秒的信息。

接下来在~/bagfiles目录里查看我们刚刚创建的文件的信息:

rosbag info subset.bag
  • 1

得到:

path:        subset.bag
version:     2.0
duration:    1:42s (102s)
start:       Apr 19 2016 21:10:00.97 (1461071400.97)
end:         Apr 19 2016 21:11:43.78 (1461071503.78)
size:        494.3 KB
messages:    6427
compression: none [1/1 chunks]
types:       turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/pose   6427 msgs    : turtlesim/Pose
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以发现,这一次文件内仅保存了/turtle1/poseturtlesim/Pose两个话题的信息。

四、rosbag record/play的局限

我们可以发现,尽管我们记录了小海龟的运行数据并且重新使用了它们,但是小海龟运动的形状同以前并不完全相同。

这是因为,对于小海龟运动这类动作,极小的时间上的差别就会产生不同的结果,而rosbag记录时间的精度又是有限的,我们不可能完全重现小海龟的状态。所以要记住这一点——我们默认rosbag record/play无法完美重现系统的状态。

ROS中记录数据与回放相关推荐

  1. vspy怎么增加保存的报文条数_美国英特佩斯控制系统 » VSpy3中记录数据的方法...

    方法一 在message界面点击Save按钮 注:可以通过ArbID或Description等过滤,例如输入7*, 或者输入 'Eng'来筛选一批报文.也可以把message view的缓冲设置大些. ...

  2. qt中记录数据的一次接收处理方法

    引言 在udp通信中,发送请求后,等待接收端的响应,有时一个回应被分割成好几次发送,这种反馈的形式出现带有随机性,正常的情况下是一次反馈所有的数据,但是会出现一次反馈被分成好几次反馈.像下面这样: 请 ...

  3. 电脑表格日期怎么修改原有日期_如何在Excel表中自动生成记录数据的日期和时间...

    几天前有人问我: 在Excel表格中输入信息时,如何在日期单元格中自动生成日期和时间? 输入表格时,我们经常需要输入时间,而不是填写存储时间,为了减少输入工作量,您可以将日期设置为自动生成. 例如,当 ...

  4. 基于paddledetection在ROS中搭建红绿灯检测控制车模运动(2)—— 数据集制作以及训练

    前言 第一节: 基于paddledetection在ROS中搭建红绿灯检测控制车模运动(1)-- 环境搭建准备以及软件安装 第二节: 基于paddledetection在ROS中搭建红绿灯检测控制车模 ...

  5. ROS中使用Eigen库[不定期更新]

    前期说明 ROS中的数据操作需要线性代数,Eigen库是C++中的线性代数计算库. Eigen库独立于ROS,但是在ROS中可以使用. Eigen库可以参见http://eigen.tuxfamily ...

  6. ROS学习-记录和回放数据

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

  7. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

  8. ROS+雷达 运行数据记录

    先测试一下雷达,记录数据.方便接下来分析源码. 1.roslaunch robot_navigation lidar.launch @robot:~$ roslaunch robot_navigati ...

  9. ROS学习记录(二)阿克曼转向车运动学模型及在gazebo中搭建仿真环境

    前言:该篇是ROS学习记录的第二篇,如果还没关注过之前文章的读者,如有需要可以通过下方传送门去看之前的文章: ROS学习记录(一) Plugin插件 这两天关注了古月老师的公众号,看到了其中一篇课程推 ...

  10. kafka查看topic中的数据_实战!Kafka Manager能统计出Topic中的记录条数吗?

    问题描述 今天现场实施同事说Kafka Manager上显示有3500w条记录,但使用我们的平台落地后,一统计发现只有2200w条记录,这是不是说明我们的平台存在丢数据的可能. 经了解,对接方是通过如 ...

最新文章

  1. Visual Studio2005奇怪的bug及解决【月儿原创】
  2. HttpClient4.4 登录知乎(详细过程)
  3. 关于批量修改AD域用户的脚本
  4. 【Android Developers Training】 104. 接受地点更新
  5. 【yarn】INFO ipc.Client Retrying connect to server xxx 8032 Already tried 0 time(s)
  6. 从 1.9 到 1.11,聊聊 PyFlink 的核心功能演进(附 Demo 代码)
  7. fiddler 改成中文版的_fiddler中文版
  8. 快速批量创建文件夹的方法
  9. 无法启动此程序 因为计算机中丢失msvcr71.dll,msvcr71.dll丢失怎样修复?计算机中丢失msvcr71.dll的解决方法...
  10. 正则表达式详解及示例
  11. 微信H5 用户调整微信字体 导致使用rem的页面错乱
  12. MMdetection中backbone的实现-MobileNetV2
  13. 谷歌浏览器小恐龙作弊无敌代码
  14. Java面向对象之简单项目制作(DVD管理系统)
  15. 测试如何与开发人员进行沟通
  16. 地理位置查询——elasticsearch
  17. visa基本函数操作
  18. ArcGIS教程:检查空间自相关和方向变化
  19. 安装一下openEuler ,看看菊厂多厉害
  20. [bzoj 5042]LWD的分科岛

热门文章

  1. Mybatis传递多个参数
  2. Python-UDP编程
  3. asp.net 配置 X-Frame-Options
  4. Fragment中添加ListView而不使用ListFragment
  5. 细数那些不能直视的IE6BUG
  6. 2008R2Win7管理八DNS新功能及常规管理
  7. java的main方法中的String[]args
  8. oracle查询sql保留小数点前0,去掉小数位后末尾的0
  9. JS获取浏览器高度、屏幕高度、宽屏
  10. 全国计算机三级数据库技术选择题,全国计算机三级数据库技术备考练习题