博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用ROS工具从bag文件中提取图片
阅读量:7029 次
发布时间:2019-06-28

本文共 3474 字,大约阅读时间需要 11 分钟。

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系统的结构:

947235-20170406233120222-518752112.png
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_.... # ...为数字

947235-20170418222738196-1863443210.png

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:=
#
为bag文件中储存图片的topic

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

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

$ rosbag play 
#
为bag文件的路径

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

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

这无非就是将图片压成视频,可以用FFMPEG包或者Mencoder包来执行。
1). 首先决定文件的fps。用rosscore info来确认视频的图片数,然后除以持续的时间即可。

# 用mencoder压制$ mencoder -nosound mf://*.jpg -mf w=
:h=
:type=jpg:fps=
\ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=
\ :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\
.avi #
为图片的宽度,
为图片的长度。
就是每秒所需的图片张数。
决定视频的质量,越大越高,一般1800KBits以上就可以。# 用FFMPEG压制$ ffmpeg -r
-b
-i frame%04d.jpg
.avi

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

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

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

参考:

转载于:https://www.cnblogs.com/arkenstone/p/6676203.html

你可能感兴趣的文章
云中气象 有备而来
查看>>
4.dubbo-demo+简易监控中心安装+管理控制台安装
查看>>
读书笔记《集体智慧编程》Chapter 4 : Searching and Ranking
查看>>
jquery form 插件 分类: JavaScript ...
查看>>
php二维数组访问
查看>>
用Shell实现俄罗斯方块代码(Tetris.sh)
查看>>
[zz]Ubuntu Hadoop HDFS 配置
查看>>
上市后Avaya锣鼓全开,加速战略布局规划
查看>>
日调度5万亿次,腾讯云发布企业级微服务中间件TSF
查看>>
海外侨胞建言四川对外开放:加强内陆省份竞争力成关键
查看>>
2019款奥迪Q7上市 配置增加/69.98万元起售
查看>>
策划求婚、陪挑婚纱,新郎不是我,仍感谢你来过|在百度遇见你
查看>>
从零单排学Redis【铂金一】
查看>>
如何处理Express异常
查看>>
Cycle.js 状态管理模型
查看>>
[译]Effective Kotlin系列之考虑使用原始类型的数组优化性能(五)
查看>>
为什么我从 Google 辞职而为自己工作
查看>>
技术问答集锦(四)
查看>>
针对虚拟机搭建centos7不能上网问题处理方法
查看>>
React 源码分析
查看>>