利用ROS工具从bag文件中提取图片
2017-04-18 22:37
597 查看
bag文件是ROS常用的数据存储格式,因此要从bag文件中提取数据就需要了解一点ROS的背景知识。
因为ROS的node不需要一定在相同的系统或构架上,也就是说不同的node可以部署到不同平台的机器上(比如传感器publish数据,PC处理数据,Android智能机执行操作),故ROS非常灵活可以适应各种需求。还有一个原因就是ROS是开源的,可以免费使用和修改。
ROS从ROS master开始,任何node都需要在master进行注册,从而方便node之间进行消息传递。这里,camera node与相机进行交流,publish名为/image_data的主题,其他节点都subscribe这个主题用于获取消息;而机器人上面的计算机有一个processing node对subscribe的图像数据进行处理;而在另一台PC上,有一个image display node对subscribe的数据进行展示。
1). 设置sources.list
允许本机接受来自packages.ros.org的包,ros kenetic值支持Ubuntu 15.10和16.04以及Debian 8。
2). 设置key
3). 安装
4).初始化rosdep
在使用ros之前需要初始化rosdep,rosdep可以使安装编译源所依赖的包变得很方便,也是一些ROS运行一些核心组件所需的。
5).环境设置
将ROS环境变量添加到环境变量中
6).安装rosinstall
rosinstall 是在ROS中经常用到的命令行工具。
7).测试安装
在终端中输入rosbag/rostopic --help等命令看是否报错
只有在启动master之后才能开始ros的其他操作,而由于roscore一直运行,所以执行其他ros命令时需要在另一个终端中进行。
2). rostopic命令
a. 查看当前master下的topic
PS:在开始的时候都会有以下两个topic:
b. 发布新的topic
c. 输出topic中的数据
d. 查看topic中的数据
3).查看正在发布消息的node
4).查看node的具体信息
2). 新建文件夹用于储存提取后的图片,并执行:
PS:如果输出的图片数量与
3). 打开另一个终端,导向岗新建的文件夹,然后执行:
这无非就是将图片压成视频,可以用FFMPEG包或者Mencoder包来执行。
1). 首先决定文件的fps。用
https://coderwall.com/p/qewf6g/how-to-extract-images-from-a-rosbag-file-and-convert-them-to-video
http://www.clearpathrobotics.com/guides/ros/Practical%20Example.html
http://answers.ros.org/question/9102/how-to-extract-data-from-bag/
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:
/rosout和
rosout_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
参考:
http://wiki.ros.org/ROS/Tutorialshttps://coderwall.com/p/qewf6g/how-to-extract-images-from-a-rosbag-file-and-convert-them-to-video
http://www.clearpathrobotics.com/guides/ros/Practical%20Example.html
http://answers.ros.org/question/9102/how-to-extract-data-from-bag/
相关文章推荐
- 利用MATLAB对Rosbag中数据的进行提取(特别是当bag中存在图片信息的时候)
- 利用Mxnet自带的工具,进行数据转化,读取图片文件
- ROS从bag文件中导出图片
- KRSReader酷狗音乐歌词写真图片提取工具(提取KRS文件中的图片)
- javaWeb项目springMVC框架下利用ITextpdf 工具打印PDF文件的方法(打印表单、插入图片)
- ROS-从rosbag中提取图像(by launch文件)
- 提取QQ2009表情数据文件中的图片
- 用id3lib提取mp3文件中的图片信息的实例
- 数据文件中图片下载小工具
- 利用文件读写,完成载入图片功能(可以局部的载入)
- Flex中如何利用Repeater组件载入XML并显示图片文件
- 利用资源头文件和动态语言库,提取动态语言库串表中的各项数据显示在Excel中
- 用taglib提取mp3文件中的图片和一些其它信息的实例
- Delphi提取网页文件图片地址示例源码
- 用Visual Studio 2005/2008提取EXE文件中的资源[图片|htm|光标文件]
- 用Visual Studio 2005/2008提取EXE文件中的资源[图片|htm|光标文件]
- C#中利用ADO.NET存储图片、文件等二进制数据
- 提取WORD中的所有InlineShape图片并保存成文件
- 利用textcopy ,SQL Server存储图片,音乐等文件
- 利用RequestDispatcher实现文件下载,支持下载工具