[ROS]using rosbag and rosplay

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

####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 一样的节点,当命令消息处理的时候,监视器的时间改变会微妙的改变行为,所以不要期望会精确的复现行为。

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 115 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • Log4j

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

    20 引用 • 18 回帖 • 43 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 642 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    311 引用 • 1666 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 656 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 605 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 3 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 473 关注
  • 招聘

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

    189 引用 • 1056 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 44 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 43 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 22 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Hibernate

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

    39 引用 • 103 回帖 • 681 关注
  • 工具

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

    273 引用 • 679 回帖 • 1 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 71 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 201 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖
  • 小薇

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

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

    34 引用 • 467 回帖 • 692 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 68 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    172 引用 • 990 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 452 关注