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文件存储

是bag文件,为数据所在的topic

rostopic echo -b  -p    >   .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 ;   回车

 
      
      
      
      
 

注意:

/home/jht/Data/GVINS_data/GPS_Cam_IMU_20hz_second_2022-10-01-13-44-05.bag   // 换成自己 .bag 的  绝对位置

img_right"/>/image_raw  改为想要读取的 topic 名称; rosbag infoGPS_Cam_IMU_20hz_second_2022-10-01-13-44-05.bag

写好后,执行命令

终端1

roscore

终端2

  • mkdir Bag2_image
  • cd Bag2_image
  • 输入如下内容到launch文件
 
      
      
      
      
 

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

 

  • roslaunch bag2image.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

你可能感兴趣的:(ROS系统学习,自动驾驶,人工智能,机器学习)