python 解析bag文件(不用安装ros系统)

  • Post author:
  • Post category:python


在网上找了很多教程都是安装ros系统之后再通过ros自带的包来解析bag文件,但我并不想安装ros系统,之前我也是通过安装ros系统在来解析bag文件,我觉得不是很方便,主要有两点原因,(1)安装ros需要root用户权限(2)ros系统只支持Python2的接口,一般我都是Python3的conda环境,这样每次调用rosbag时都需要先把当前的conda环境注释掉,不然会报错,然后使用完毕在回到conda环境

ros本身是提供了C++和Python的接口,因为我目前的诉求就只是解析bag文件,我想肯定有办法不用安装ros系统直接调用Python的包就可以对bag文件进行解析,下面就介绍一下如何通过Python接口实现对bag文件进行解析

先介绍下我的环境:

Python:miniconda3 python 3.7.6

操作系统:Ubuntu 16.04

1.安装roslz4

conda install -c conda-forge ros-roslz4

不然会出现下面的报错

Failed to load Python extension for LZ4 support. LZ4 compression will not be availabl

2.安装rosbag

pip install --extra-index-url https://rospypi.github.io/simple/ rospy rosbag

这个是可以在Python3环境下运行的版本

3.利用rosbag包对bag文件进行解析

import rosbag
import sys
from PIL import Image
import os
import numpy as np
import cv2


if __name__ == '__main__':
    bag_dir = sys.argv[1]
    img_dir = os.path.join(bag_dir, 'image2')
    if not os.path.exists(img_dir):
        os.makedirs(img_dir)
    bag_file = os.path.join(bag_dir, 'shopping_street_1_seq1.bag')
    bag = rosbag.Bag(bag_file)
    index = 0
    imgname = os.path.join(img_dir, '{:0>5d}.jpg')
    for topic, msg, t in bag.read_messages(topics='/cam0/image_raw'):
        header = msg.header
        header_seq = header.seq 
        stamp_sec = header.stamp.secs
        stamp_nsec = header.stamp.nsecs
        data = msg.data #bytes
        img = np.frombuffer(data, dtype=np.uint8) #转化为numpy数组
        img = img.reshape(msg.height, msg.width)
        cv2.imwrite(imgname.format(index), img) #保存为图片
        print('{:0>5d} {} {} {}'.format(index, header_seq, stamp_sec, stamp_nsec))
        index += 1
        

大功告成



版权声明:本文为sabrinalx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。