步遥情感网
您的当前位置:首页ROSBAG解析bag包教程

ROSBAG解析bag包教程

来源:步遥情感网

一. 软件安装教程
1. 安装rosbag:https://www.cnblogs.com/arkenstone/p/6676203.html
2. 安装mjepgtools和ffmpeg
$ sudo apt-get install mjepgtools
$ sudo apt-get install ffmpeg

 

二. 数据解析教程
1. 打开命令行,输入roscore,保持窗口不动
2. 打开第二个命令行窗口,输入rosbag info $.bag(bag的路径),获取信息如下,记住topic中的信息。    /image_raw对应图片topic;/points_raw对应点云的topic;

path:        /home/cuicuizhang/Downloads/orign-data/data2/2020-07-29-15-58-56.bag
version:     2.0
duration:    2.9s
start:       Jul 29 2020 15:58:56.38 (1596009536.38)
end:         Jul 29 2020 15:58:59.26 (1596009539.26)
size:        221.5 MB
messages:    102
compression: none [102/102 chunks]
types:       sensor_msgs/Image       [060021388200f6f0f447d0fcd9c743]
             sensor_msgs/PointCloud2 [1158d486dd51d683ce2f1be655c3c181]
topics:      /image_raw    73 msgs    : sensor_msgs/Image      
             /points_raw   29 msgs    : sensor_msgs/PointCloud2


3. 解析图片:
    3.1 将命令行窗口路径切换到图片保存的目录下         

cd /home/cuicuizhang/Downloads/orign-data/data1/image

    3.2 在该命令行下输入:rosrun pcl_ros pointcloud_to_pcd input:=<topic>

example:rosrun pcl_ros pointcloud_to_pcd input:=/image_raw

    3.3 新开第三个命令行窗口,输入:rosbag play $.bag      

example: rosbag play /home/cuicuizhang/Downloads/orign-data/data2/2020-07-29-15-58-56.bag

    3.4 图片数据已经保存在/home/cuicuizhang/Downloads/orign-data/data1/image目录下

 

4. 解析pcd:
    4.1 将命令行窗口路径切换到图片保存的目录下         

 cd /home/cuicuizhang/Downloads/orign-data/data1/pcd

    4.2 在该命令行下输入:rosrun pcl_ros pointcloud_to_pcd input:=<topic>          

example:rosrun pcl_ros pointcloud_to_pcd input:=/points_raw

    4.3 新开第三个命令行窗口,输入:rosbag play $.bag          

example: rosbag play /home/cuicuizhang/Downloads/orign-data/data2/2020-07-29-15-58-56.bag

    4.4 图片数据已经保存在/home/cuicuizhang/Downloads/orign-data/data1/pcd目录下

 

5. 解析跟pcd对应的图片:

 5.1 提取带时间戳的图片

# 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 = '/media/cuicuizhang/hold/2020.8.14bag/pics/01/img/'  # 存放图片的位置
 
 
class ImageCreator():
 
    def __init__(self):
        self.bridge = CvBridge()
        with rosbag.Bag('/media/cuicuizhang/hold/2020.8.14bag/01.bag', 'r') as bag:  # 要读取的bag文件;
            for topic, msg, t in bag.read_messages():
                if topic == "/image_raw":  # 图像的topic;
                    try:
                        cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8")
                    except CvBridgeError as e:
                        print e
                    timestr = "%.9f" % msg.header.stamp.to_sec()
                    # %.6f表示小数点后带有6位,可根据精确度需要修改;
                    image_name = timestr + ".jpg"  # 图像命名:时间戳.jpg
                    print (path + image_name)
                    cv2.imwrite(path + image_name, cv_image)  # 保存;
 
 
if __name__ == '__main__':
 
    # rospy.init_node(PKG)
 
    try:
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

  5.2 找到与pcd最近的时间戳的图片,重命名

import numpy as np
 
img_path_list = "/media/cuicuizhang/hold/2020.8.14bag/pics/06/jpg.txt"
pcd_path_list = "/media/cuicuizhang/hold/2020.8.14bag/pics/06/pcd.txt"
img_to_pcd_list = "/media/cuicuizhang/hold/2020.8.14bag/pics/06/jp.sh"
 
img_list = []
pcd_list = []
with open(img_path_list) as fimg:
    lines = fimg.readlines()
    for line in lines:
        img_list.append(line.strip().split('.jpg')[0])
 
with open(pcd_path_list) as fpcd:
    lines = fpcd.readlines()
    for line in lines:
        pcd_list.append(line.strip().split('.pcd')[0])
 
 
with open(img_to_pcd_list,'w') as fw:
 
    for pcd in pcd_list:
        print("pcd:", pcd)
        idx = np.searchsorted(img_list, pcd) - 1
        mask = idx >= 0
        if idx + 1 < len(img_list) and abs(float(img_list[idx])-float(pcd))>abs(float(img_list[idx+1])-float(pcd)):
            mask = idx+1
        else:
            mask = idx
        print("img:",img_list[mask])
        fw.write("cp img/")
        fw.write(img_list[mask])
        fw.write('.jpg ')
        fw.write('img_correct/')
        fw.write(pcd)
        fw.write(".jpg")
        fw.write('\n')


 

因篇幅问题不能全部显示,请点此查看更多更全内容