[ROS]using rosbag and rosplay

本贴最后更新于 2797 天前,其中的信息可能已经时异事殊

####1.记录数据(创建 bag 文件)

本教程将指导如何记录正在 ROS 系统中运行的主题的数据。主题的数据将保存在 bag 文件中。
首先,执行以下命令:

roscore
rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

上述命令将启动 2 个节点,turtlesim 仿真窗口和键盘方向控制窗口。如果你选择启动 turtle_keyboard 的窗口,可以看到下面的内容:

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

在 turtle_keyboard 窗口按下方向键将看到小乌龟在移动。注意要选择键盘控制的窗口。
#####1.1 记录所有的主题

首先检查下当前系统已经发布的主题有那些。执行:

rostopic list -v

可以看到下面的内容:

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

列出来的已发布的主题是仅有的潜在的能被记录到数据日志文件的数据类型,同时发布的数据也会记录。teleop_turtle 发布的/turtle1/cmd_vel 命令数据是作为 turtlesim 进程的输入。/turtle1/color_sensor 和/turtle1/pose 是 turtlesim 输出的数据。
现在,我们将记录发布的数据。打开一个新的命令行窗口。执行:

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

这里我们这是创建了一个临时的目录用来保存数据,然后运行 rosbag record -a,-a 表示保存所有的已发布的主题的数据到一个 bag 文件里。

返回 turtle_teleop 窗口,移动小乌龟 10S 左右。

在运行 rosbag 的窗口按下 ctrl+c。现在,检查下 ~/bagfiles 目录下的内容。你可以看到一个以年、数据、时间、后缀为.bag 为名字的文件。这个文件保存了 rosbag record 执行期间所有已任意节点发布主题的数据。

####2.检验和播放 bag 文件

前文通过 rosbag record 命令已经将数据保存到了 bag 文件,现在我们通过 rosbag info 和 rosbag play 文件来检查和回放数据。首先查看 bag 文件保存了什么。可以使用 rosbag info 来查看,这个命令将检查 bag 文件的内容而不用回放。在 bag 文件的目录下执行:

rosbag info <bag文件名>

可以看到类似的信息:

path:        2014-12-10-20-08-34.bag
version:     2.0
duration:    1:38s (98s)
start:       Dec 10 2014 20:08:35.83 (1418270915.83)
end:         Dec 10 2014 20:10:14.38 (1418271014.38)
size:        865.0 KB
messages:    12471
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         169 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   6149 msgs    : turtlesim/Color    
             /turtle1/pose           6149 msgs    : turtlesim/Pose

上面显示了主题的名字,类型,以及包含在 bag 文件中的每一种消息的数目。我们可以看到在 rostopic 输出里广播的主题,五分之四的主题在我们记录间隔里实际发布。通过 rosbag record -a 命令将记录所有节点发布的所有消息。

接下来的教程将回放 bag 文件,重现系统运行时的行为。首先你停止 turtle_teleop 窗口,保持 turtlesim 窗口运行。在命令行窗口,在 bag 文件的目录下运行:

rosbag play <your bagfile>

可以看到类似:

[ INFO] [1418271315.162885976]: Opening 2014-12-10-20-08-34.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.

rosbag play 的默认模式下将等待 0.2 秒之后才开始播放 bag 文件的内容。等待的这一段时间允许消息的任意订阅者提示接下来将发布的消息以及接下来的具体的消息。如果 rosbag play 立马发布消息,订阅将收不到一开始发布的消息。具体要等待多久可以通过-d 选项来设置。
最终,回放的效果跟实际通过鼠标控制的效果是一样的。也可以通过-s 选项来选择开始播放的时间点。-r 选项是选择播放的速度:

rosbag play -r 2 <your bagfile>

可以看到运行的效果跟之前的不一样,这是因为回放是以 2 倍的速度去点击键盘的。

####3.保存数据的子集

当运行复杂系统的时候,比如 pr2 软件集,将有成百的主题发布。对于一些主题,比如摄像头图片流,有可能发布大量的数据。这样的系统写入所有主题的日志文件到一个单独的 bag 文件是不可行的。rosbag record 命令支持部分主题的日志输出,仅仅只记录用户关注的主题。
执行:

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

在 bag 文件的目录下执行:

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

-O 选项指定保存日志到 subset.bag 文件,topic 参数指定了需要记录的两个主题。通过键盘的方向键移动小乌龟,然后按下 Ctrl+c 终止记录。

现在通过使用 rosbag info subset.bag 来检查 bag 文件的内容。可以看到类似的:

path:        subset.bag
version:     2.0
duration:    12.6s
start:       Dec 10 2014 20:20:49.45 (1418271649.45)
end:         Dec 10 2014 20:21:02.07 (1418271662.07)
size:        68.3 KB
messages:    813
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel    23 msgs    : geometry_msgs/Twist
             /turtle1/pose      790 msgs    : turtlesim/Pose

####4.rosbag record/play 的限制

在之前的教程中可以看到小乌龟的运行路径不是很准确的跟着原始的键盘输入运行,大概的形状可能看起来一样,但是小乌龟的运行的不是准确的路径。造成这样的原因是:小乌龟的运行路径对系统时间小的改变敏感,rosbag 不能很精确的记录系统运行时的行为,比如消息被 roscord 记录和处理,被 rosplay 产生和处理。对于像 turtlesim 一样的节点,当命令消息处理的时候,监视器的时间改变会微妙的改变行为,所以不要期望会精确的复现行为。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 3 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 41 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    275 引用 • 682 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6554 引用 • 29428 回帖 • 246 关注
  • OnlyOffice
    4 引用 • 23 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    163 引用 • 1450 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 423 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖 • 1 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 623 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 685 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 245 关注
  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖 • 1 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 793 回帖