ROS 中 bag、txt、csv 格式文件的详细转换 和 图片的提取

一、包(.bag)是怎么得到的 ?

rosbag record 命令是用于在ros系统中录取系统中其他ros节点发出来的 topic 的message。录取的的包可以使用 rosbag play  命令来回放,订阅这些消息的node节点就可以收到这些消息,进而执行对应的程序。
1.1 录制所有话题的包
 

rosbag   record   -a

1.2 录制指定话题,设置 bag 包名为:bag_name

rosbag record  -O  bag_name.bag /topic1_name /topic2_name /xxx

1.3 录制包不设置 包名称,默认按照录制结束时间命名

rosbag record /topic1_name /topic2_name /xxx

例如:录制 topic 为 image_raw , 名字为 pylon_camera 的包

rosbag  record  -O   pylon_camera.bag/image_raw

二、回放
2.1 直接回放

rosbag play pylon_camera.bag


2.2  设置以 0.5 倍速回放,也就是以录制频率的一半回放:

rosbag play   -r   0.5   pylon_camera.bag

此时,包内的 信息 以 topic 为 image_raw 不断地读出来; 运行rviz, 选择 topic 为 image_raw; 便可以出来图像

三、 显示包文件内容的可读摘要,包括开始和结束时间,主题及其类型,消息计数、频率以及压缩统计信息

rosbag    info   pylon_camera.bag

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

对于非图片数据,大部分情况下都可用csv文件存储
# <BAGFILE>是bag文件,<TOPIC>为数据所在的topic

rostopic echo -b <BAGFILE> -p <TOPIC>   >   <output>.csv  


例如上面:

rostopic echo   -b   pylon_camera.bag   -p   image_raw  >  pylon_camera.csv

五、提取bag文件中的数据并保存为 txt 格式

就是举个例子,图片转化成 txt  不太合理; 可以是IMU的数据

rostopic echo   -b   pylon_camera.bag   -p   image_raw  >  pylon_camera.txt

    备注:csv 转换成 txt格式

    在那个文件上右键单击,选择打开方式-记事本打开,再另存为txt各式就行了。

六、图片的bag文件 提取出 图片

方法一
1、创建文件 export.launch; vim export.launch;   i ;   Esc  ;   :wq ;   回车

   <launch>
          <node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/hltt3838/vins/Dates/MH_01_easy.bag"/>
          <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
            <remap from="image" to="/cam0/image_raw"/>
          </node>
     </launch>`

注意:
home/hltt3838/vins/Dates/MH_01_easy.bag  换成自己 .bag 的  绝对位置

<remap from="image" to="/img_right"/>中 /cam0/image_raw 

改为想要读取的 topic 名称; rosbag info MH_01_easy.bag
写好后,执行命令

终端1

roscore

终端2

roslaunch export.launch

注意:这一步骤可能会出现问题,不是内容的问题,而是 export.launch 排版可能不对
如下图所示,正在提取:

结束标志:

所提取的图片在~/.ros路径下,先查看如下图所示:

终端3

cd ~/.ros

那么已经提取成功的图像存储在你 home文件夹下的  .ros  文件夹下,一般是隐藏的文件夹,使用 crtl+h 可显示出来。

将其移到你的目标文件中,标红的为新建的目录

mv ~/.ros/*.jpg /home/hltt3838/vins/Dates/bag_picture        

执行结果:运行成功,没有差错

优点:操作简单,使用ros即可;
缺点:提取信息与原始录制的信息并不完全一致,主要体现在提取的图片数量和ros录制的时候的信息数量不一致,会少。此外,不含有时间戳;

方法二

ROS-从rosbag中提取图像(by python2)

通过编写   Python程序 按照我们想要的信息及方式来提取,在与bag文件同级目录下建立.py文件(方便操作,若不是同级目录,下面代码中要写绝对路径)---  默认电脑上安装了 opencv 和 python
打开终端 1
查看 opencv 的版本

pkg-config --modversion opencv        //我的是3.4.1


查看python2安装版本

python2 --version                                        //2.7.17


查看python2安装版本

python3 --version                                       //3.6.9


打开终端 2

cd vins/Dates

mkdir cam0

mkdir cam1

vim read_bag.py

i   ->  拷贝   ->   Esc   ->   :wq    ->   回车

   

 # coding:utf-8
    #!/usr/bin/python
         
    # Extract images from a bag file.
    import roslib; #roslib.load_manifest(PKG)
    import rosbag
    import rospy
    import cv2
    from sensor_msgs.msg import Image
    from cv_bridge import CvBridge
    from cv_bridge import CvBridgeError
         
    #Reading bag filename from command line or roslaunch parameter.
    #import os
    #import sys
         
    cam0_path  = '/home/hltt3838/vins/Dates/cam0/'     # 已经建立好的存储cam0 文件的目录
    cam1_path  = '/home/hltt3838/vins/Dates/cam1/'
         
    class ImageCreator():
        def __init__(self):
            self.bridge = CvBridge()
            with rosbag.Bag('MH_01_easy.bag', 'r') as bag:  #要读取的bag文件;
                for topic,msg,t in bag.read_messages():
                    if topic == "/cam0/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+ ".jpg" #图像命名:时间戳.jpg
                            cv2.imwrite(cam0_path + image_name, cv_image)  #保存;
                    elif topic == "/cam1/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+ ".jpg" #图像命名:时间戳.jpg
                            cv2.imwrite(cam1_path + image_name, cv_image)  #保存;
     
         
    if __name__ == '__main__':
            #rospy.init_node(PKG)
        try:
            image_creator = ImageCreator()
        except rospy.ROSInterruptException:
            pass

运行
 

python read_bag.py

可能报错,原因1:
解决:python是一种对缩进非常敏感的语言,最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分别的。

原因2:ImportError: No module named roslib

解决:没有解决,哪位大什么看到了告诉我一下呀, 找到问题了,python2和python3不要乱使用, 可以看我的博客怎么换回到python2
最后的程序是运行成功的;学会了这个要举一反三,订阅其他话题的时候,比如激光雷达和IMU应该怎么弄?

优点:
没有信息损失,完全按照你录制的数据完整提取,且具有时间戳。
缺点:
使用python2,不依赖ros,依赖OpenCV;最好 3.x版本

订阅话题,保存图片

rosbag文件中提取图像--分别通过cam/image_raw和cam/image_raw/compressed方话题_m_zhangJingDong的博客-CSDN博客

ros下 同步保存双目数据 raw image_haha074的博客-CSDN博客

参考:激光雷达 + 相机 , 两个一起转转化的

【学习笔记】使用python带时间戳提取rosbag中的图像和雷达数据_拔刀吧TensorFlow!-CSDN博客_python读取rosbag数据

ROS中使用Python3的注意事项

https://blog.csdn.net/handsome_for_kill/article/details/819479

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值