bag文件是ROS常用的数据存储格式,因此要从bag文件中提取数据就需要了解一点ROS的背景知识。

1. 什么是ROS及其优势

ROS全称Robot Operating System,是BSD-licensed系统用于从PC上控制机器人组件。ROS系统由一系列的独立node组成,彼此间通过publish/subscribe消息传递模式相互沟通。比如某个传感器驱动由某个node执行,将该传感器数据用message stream的形式publish,而这些message则可以在数据处理或者日志节点被使用。

因为ROS的node不需要一定在相同的系统或构架上,也就是说不同的node可以部署到不同平台的机器上(比如传感器publish数据,PC处理数据,Android智能机执行操作),故ROS非常灵活可以适应各种需求。还有一个原因就是ROS是开源的,可以免费使用和修改。

2. ROS的结构

下图举了一个ROS系统的结构:



ROS从ROS master开始,任何node都需要在master进行注册,从而方便node之间进行消息传递。这里,camera node与相机进行交流,publish名为/image_data的主题,其他节点都subscribe这个主题用于获取消息;而机器人上面的计算机有一个processing node对subscribe的图像数据进行处理;而在另一台PC上,有一个image display node对subscribe的数据进行展示。

3. ROS工具的安装

目前ros工具提供c++和python两种API,而正式支持的操作系统只有Ubuntu和Debian(linux大发好,退win保平安)。

1). 设置sources.list

允许本机接受来自packages.ros.org的包,ros kenetic值支持Ubuntu 15.10和16.04以及Debian 8。

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

2). 设置key

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

3). 安装

$ sudo apt-get update
# 由于ros有许多库和工具可供选择,一般默认选这个版本:Desktop-Full Install: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception
$ sudo apt-get install ros-kinetic-desktop-full

4).初始化rosdep

在使用ros之前需要初始化rosdep,rosdep可以使安装编译源所依赖的包变得很方便,也是一些ROS运行一些核心组件所需的。

$ sudo rosdep init
$ rosdep update

5).环境设置

将ROS环境变量添加到环境变量中

# 将命令添加到~/.bashrc文件中可以使每次启动新的session都加载ros变量,非常方便
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

6).安装rosinstall

rosinstall 是在ROS中经常用到的命令行工具。

$ sudo apt-get install python-rosinstall

7).测试安装

在终端中输入rosbag/rostopic --help等命令看是否报错

4. ROS工具使用实例

1). 启动ROS master

只有在启动master之后才能开始ros的其他操作,而由于roscore一直运行,所以执行其他ros命令时需要在另一个终端中进行。

$ roscore

2). rostopic命令

a. 查看当前master下的topic

$ rostopic list # 列出topic名称,具体可用其他rostopic命令进行查看等操作。

PS:在开始的时候都会有以下两个topic:/rosoutrosout_agg。前者用于报道系统的debug消息后者用于整合debug消息。

b. 发布新的topic

$ rostopic pub /hello std_msgs/String “Hello Robot" # /hello 是新的topic名称;后者为topic的类型;最后引号内的"Hello Robot"是具体的消息数据。

c. 输出topic中的数据

$ rostopic echo /hello

d. 查看topic中的数据

$ rostopic info /hello

3).查看正在发布消息的node

$ rosnode list

4).查看node的具体信息

$ rosnode info /rostopic_.... # ...为数字

5. 用ros工具从bag文件中提取图片

1). 首先需要安装一些图片处理依赖的包: MJPEG, ffmpeg

$ sudo apt-get install mjepgtools
$ sudo apt-get install ffmpeg

2). 新建文件夹用于储存提取后的图片,并执行:

$ rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE> # <IMAGETOPICINBAGFILE>为bag文件中储存图片的topic

PS:如果输出的图片数量与rosbag info命令查询得到的数量不符,可以减少_sec_per_frame参数的值。

3). 打开另一个终端,导向岗新建的文件夹,然后执行:

$ rosbag play <BAGFILE> # <BAGFILE>为bag文件的路径

6. 将提取的图片转换成视频

PS:这部分并不涉及ros的操作,可以跳过。

这无非就是将图片压成视频,可以用FFMPEG包或者Mencoder包来执行。

1). 首先决定文件的fps。用rosscore info来确认视频的图片数,然后除以持续的时间即可。

# 用mencoder压制
$ mencoder -nosound mf://*.jpg -mf w=<WIDTH>:h=<HEIGHT>:type=jpg:fps=<FPS> \ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=<BITRATE>\ :mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o\ <OUTPUT>.avi # <WIDTH>为图片的宽度,<HEIGHT>为图片的长度。<FPS>就是每秒所需的图片张数。<BITRATE>决定视频的质量,越大越高,一般1800KBits以上就可以。
# 用FFMPEG压制
$ ffmpeg -r <FPS> -b <BITRATE> -i frame%04d.jpg <OUTPUT>.avi

7. 提取bag文件中的数据并保存为csv格式

对于非图片数据,大部分情况下都可用csv文件存储。从section 5中我们就可以指导用rostopic echo即可打印topic中的数据。

$ rostopic echo -b <BAGFILE> -p <TOPIC> > <output>.csv # <BAGFILE>是bag文件,<TOPIC>为数据所在的topic

参考:

  1. http://wiki.ros.org/ROS/Tutorials
  2. https://coderwall.com/p/qewf6g/how-to-extract-images-from-a-rosbag-file-and-convert-them-to-video
  3. http://www.clearpathrobotics.com/guides/ros/Practical Example.html
  4. http://answers.ros.org/question/9102/how-to-extract-data-from-bag/

利用ROS工具从bag文件中提取图片的更多相关文章

  1. 从ROS bag文件中提取图像

    从ROS bag文件中提取图像 创建launch文件,如下: export.launch <launch> <node pkg="rosbag" type=&qu ...

  2. 通过wget工具下载指定文件中的URLs对应的资源并保存到指定的本地目录中去并进行文件完整性与可靠性校验

    创建URLs文件在终端输入cd target_directory回车,便把当前文件夹切换到了目标文件夹target_directory,此后创建的文件都会丢它里面在终端输入cat > URLs回 ...

  3. [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    [流媒體]H264—MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012  Email:skyseraph00@163.com 一.MP4格式基本 ...

  4. JSFinder:一个在js文件中提取URL和子域名的脚本

    JSFinder介绍 JSFinder是一款用作快速在网站的js文件中提取URL,子域名的脚本工具. 支持用法 简单爬取 深度爬取 批量指定URL/指定JS 其他参数 以往我们子域名多数使用爆破或DN ...

  5. 利用java从docx文档中提取文本内容

    利用java从docx文档中提取文本内容 使用Apache的第三方jar包,地址为https://poi.apache.org/ docx文档内容如图: 目录结构: 每个文件夹的名称为日期加上来源,例 ...

  6. 使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

  7. [数据科学] 从csv, xls文件中提取数据

    在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...

  8. Intellij Idea 工具在java文件中如何避免 import .*包

    Intellij Idea工具在java文件中怎么避免import java.utils.*这样的导入方式,不推崇导入*这样的做法!Editor->Code Style->Java-> ...

  9. Java 使用PDFBox提取PDF文件中的图片

    今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...

随机推荐

  1. 【Java/Spring】Spring的配置问题,IDEA报错“No mapping found for HTTP request with URI […] in DispatcherServlet”

    从SVN上拷贝下JavaWeb项目,Spring框架的配置文件需要修改.部署好Tomcat后,启动服务,可以进入Web项目主页,但是访问其他URL时直接跳转到404,IDEA报错“No mapping ...

  2. am335x uboot, kernel 编译

    一.设置环境变量 // 写在家目录下面的 .bashrc 里面 export KERNEL_PATH=~/aplex/kernel3.2.0 // kernel 路径 export UBOOT_PAT ...

  3. JavaScript cookie操作实现点赞功能

    JavaScript cookie操作实现点赞功能 参考实现原理,但是代码不够简洁,简洁代码参考:js操作cookie 实现一个点赞功能十分简单,主要问题在于不能重复点赞.  若是一个有用户的网站,可 ...

  4. java json转换

    https://blog.csdn.net/WillJGL/article/details/77866224 SpringBoot中如果需要实现json的序列化和反序列化,我们会使用json解析工具. ...

  5. 【转】JMeter完成一个java请求的压测

    JMeter完成java请求的压力测试详解以及问题总结 原文地址:http://www.cnblogs.com/zhaoxd07/p/4895224.html    作者:KK_Yolanda 这篇文 ...

  6. 如何通过使用窗体身份验证和 Visual C#.NET 对 Active Directory 验证身份

    本分步指南演示如何在 ASP.NET 应用程序如何使用窗体身份验证允许用户使用轻型目录访问协议 (LDAP),对 Active Directory 进行验证.经过身份验证的用户重定向之后,可以使用Ap ...

  7. USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)

    CYPRESS的USB外设控制器CY7C68013A是一款广泛应用于USB打印机,手机,存储设备,USB测试等多个领域的经典产品.该产品符合USB2.0协议规范,支持full speed和high s ...

  8. Axiom3D写游戏:用Overlay实现Mesh浏览.

    从网上找了些资源,大多搜Ogre,Mesh资源,然后为了方便查看各个Mesh,以及对应骨骼动画.为了实用性,考虑放在原游戏窗口里实现.最开始打算窗口新建viewport来实现,后发现这种方式的局限性, ...

  9. Html中怎么用CSS让ul中多个li标签不换行横排显示

    布局 通常有三种方式 { 1. position 2. float: left --> 其次是这个 3. block: inline-block  --> 他们推荐我用这个 } 具体描述 ...

  10. e587. Filling Basic Shapes

    There are two ways to fill basic shapes like lines and rectangles. The first is to use specific draw ...