从rosbag中提取图片和数据

目录

从rosbag中提取图片和数据

本文只针对rosbag中包含了图片和数字(可以有多个topic),并需要分别提取不同的数据的情况。提取图片和数据分别介绍两种方法,一种是比较麻烦的方法,一种是利用Python写脚本直接提取。

1 提取图片

1.1 用launch文件提取图片

这种方法比较麻烦,提取后图片名是序号。这部分内容可以参考以下链接:
https://blog.csdn.net/tlglove326/article/details/105385208

1.1.1 安装工具(一般不需要)

   roscd image_view
   rosmake image_view
   sudo apt-get install mjpegtools

1.1.2 直接创建roslaunch文件

先cd到rosbag所在文件夹,查看topic名称:

   rosbag info xx.bag

创建ros laungh 文件,例如本文命名为:export.launch,文件内容如下:

    <launch>
         <node pkg="rosbag" type="play" name="rosbag" args="-d 2 $(find image_view)/test.bag"/>
         <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
           <remap from="image" to="/camera/image_raw"/>
         </node>
    </launch>

注意只有两个地方需要修改:
(1)$(find image_view)/test.bag处修改为rosbag的路径
(2)camera/image_raw是查看的topic的名字

1.1.3 运行launch文件

打开一个终端运行

   roscore

打开另一个终端,cd到export.launch所在路径下,运行:

   roslaunch export.launch

1.1.4 转移提取的文件

所提取的图片在~/.ros路径下,将其转移到目标文件中,如:

   cd ~
   mkdir image
   mv ~/.ros/*.jpg ~/image

1.1.5 批量修改文件名

提取之后图片的名字都是按照帧的顺序进行命名的,需要修改一下,这个网上有很多方法,这里不再赘述。

1.2 用Python提取图片

这种方法一步到位,操作简单
直接运行下面链接中的Python代码即可:
https://blog.csdn.net/qq_22059843/article/details/103018216?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-3-103018216.nonecase
注意代码中有三个地方需要修改,包的地址/包的名称/目标文件夹。具体代码如下:

#coding:utf-8

import roslib;  
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError

path='image/' #存放图片的位置
class ImageCreator():


   def __init__(self):
       self.bridge = CvBridge()
       with rosbag.Bag('stat.bag', 'r') as bag:   #要读取的bag文件;
           for topic,msg,t in bag.read_messages():
               if topic == "/usb_cam/image_raw":  #图像的topic;
                       try:
                           cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                       except CvBridgeError as e:
                           print e
                       timestr = "%.6f" %  msg.header.stamp.to_sec()
                       #%.6f表示小数点后带有6位,可根据精确度需要修改;
                       image_name = timestr+ ".png" #图像命名:时间戳.jpg
                       cv2.imwrite(path+image_name, cv_image)  #保存;


if __name__ == '__main__':

   #rospy.init_node(PKG)

   try:
       image_creator = ImageCreator()
   except rospy.ROSInterruptException:
       pass

2 提取数据为csv或txt格式

这个比较简单,两种方法都很简单

2.1 命令行提取

2.1.1 查看topic信息

rosbag info xx.bag

2.1.2 转换为csv格式

rostopic echo -b xxx.bag -p /topic > xxx.csv(或.txt)都可以

【注意】/topic是话题名称,xxx.csv是被转换成的名称,这两个地方需要修改

2.2 使用Python一次性从rosbag中提取多个csv文件

具体参考下面的链接:
https://zhuanlan.zhihu.com/p/97148509

3 关于同步

注意,上述方法只能从原rosbag文件中提取出原本的topic,但是实际使用的过程中发现,尤其是当rosbag中包含多个topic的时候(比如多传感器数据),我们实际关心的是如何能够直接提取出同步好的图片和数据。这个需要用到Ros自带的时间同步滤波器,具体参见我的Github和另一篇博客:
github : https://github.com/KatelynLiu/SynMultiSensors
博客 : https://blog.csdn.net/weixin_43977894/article/details/108423854

转载请声明出处

    原文作者:洋葱老妖
    原文地址: https://blog.csdn.net/weixin_43977894/article/details/108412661
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞