[ROS]using rosbag and rosplay

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 24 关注
  • OpenCV
    15 引用 • 36 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 5 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 703 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖 • 1 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 3 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 542 回帖 • 1 关注
  • 996
    13 引用 • 200 回帖 • 2 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 548 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 668 关注
  • Google

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

    49 引用 • 192 回帖
  • Hibernate

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

    39 引用 • 103 回帖 • 724 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 176 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 408 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 104 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 29 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 183 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖
  • 叶归
    5 引用 • 16 回帖 • 10 关注
  • HBase

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

    17 引用 • 6 回帖 • 60 关注
  • Markdown

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

    170 引用 • 1529 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • 创造

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

    184 引用 • 1015 回帖 • 1 关注
  • RemNote
    2 引用 • 16 回帖 • 7 关注