T265录制的rosbag拆包:拆IMU序列和图像序列方法以及如何制作双目euroc、双目tum数据集

目录

1.录制bag包

2.左右目图像的拆解

3.拆IMU数据

4.如何制作eruoc与tum数据集

4.1 eruoc数据集格式

4.2 对齐时间戳

4.3 编写imu.csv文件

4.4 生成索引文件

4.一个脚本完成拆包


1.录制bag包

        这里推荐我的同学的博客,大家可以参考这篇博客录制T265的ros包并解决一些问题:

使用 RealSense T265录制baghttps://blog.csdn.net/weixin_44760904/article/details/130512863?spm=1001.2014.3001.5501

2.左右目图像的拆解

        这里我们先查看录制包的信息,我们用命令查看包名:

rosbag info <包名>

        我们发现有三个信息:

        /fisheye1:对应左目的图像

        /fisheye2:对应右目的图像

        /imu:对应imu的信息

        我们用下面的脚本拆左右目图像:

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='/home/xxxx/Desktop/left/' 
class ImageCreator():
 
 
    def __init__(self):
        self.bridge = CvBridge()
        with rosbag.Bag('/home/xxxx/Desktop/out.bag', 'r') as bag:   
            for topic,msg,t in bag.read_messages():
                if topic == "/fisheye1": 
                        try:
                            cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                        except CvBridgeError as e:
                            print e
                        timestr = "%.6f" %  msg.header.stamp.to_sec()

                        image_name = timestr+ ".jpg" 
                        cv2.imwrite(path+image_name, cv_image) 

 
 
if __name__ == '__main__':
    try:
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

        这里path是你要将图片存放的路径,topic是图像对应的相机话题(/fisheye1、/fisheye2)。%.6f是要把小数点后保留几位数,这个视情况而定。

        我们执行脚本,得到了左右目图像:

3.拆IMU数据

        IMU数据分为时间戳、三个加速度信息、三个角速度信息:

        我们执行下面的脚本就能将其分离出来并组成csv文件:

import rosbag
import csv
from sensor_msgs.msg import Imu


bag = rosbag.Bag('/home/xxxx/Desktop/out.bag')


csvfile = open('imu.csv', 'w')
csvwriter = csv.writer(csvfile)


csvwriter.writerow(['timestamp', 'ax', 'ay', 'az', 'wx', 'wy', 'wz'])


for topic, msg, t in bag.read_messages(topics=['/imu']):

    timestamp = msg.header.stamp.to_nsec()
    ax = msg.linear_acceleration.x
    ay = msg.linear_acceleration.y
    az = msg.linear_acceleration.z
    wx = msg.angular_velocity.x
    wy = msg.angular_velocity.y
    wz = msg.angular_velocity.z
    csvwriter.writerow([timestamp, ax, ay, az, wx, wy, wz])

bag.close()
csvfile.close()

        我们执行完脚本之后,得到了如下的csv文件:

4.如何制作eruoc与tum数据集

4.1 eruoc数据集格式

        照片格式:

        首先,左右目图片时间戳是对齐的。都是19位的。

        其中有文件data.csv,存储着时间戳和图像的关系,其实都是一样的。

        这是IMU的数据。

4.2 对齐时间戳

        我们发现我们录包的时间戳不是对齐的我们需要将其对齐:

        我们需要将时间戳进行对齐,对齐的原则:由于我们使用双目图像主要是使用的左目图像,因此我按照左目图像的时间戳去对齐右目,这样可以将IMU的损失率降到最小。

import os
import os
import shutil

folder1_path = "/home/liuhongwei/Desktop/left"
folder2_path = "/home/liuhongwei/Desktop/right"

output_folder_path = "/home/liuhongwei/Desktop/righti"



folder1_files = sorted(os.listdir(folder1_path))


folder2_files = sorted(os.listdir(folder2_path))


if len(folder1_files) != len(folder2_files):
    print("no")
else:

    for i in range(len(folder2_files)):
        source_path = os.path.join(folder2_path, folder2_files[i])
        target_path = os.path.join(output_folder_path, folder1_files[i])
        shutil.copyfile(source_path, target_path)

    print("yes")

        执行完脚本后我们发现已经对齐了:(提示:有时候双目图片不一样我们需要对右目图像进行删减或用左目图像补齐再执行这个脚本)

4.3 编写imu.csv文件

import rosbag
import csv
from sensor_msgs.msg import Imu


bag = rosbag.Bag('bag包的地址')


csvfile = open('imu1.csv', 'w')
csvwriter = csv.writer(csvfile)


csvwriter.writerow(['timestamp [ns]', 'w_RS_S_x [rad s^-1]', 'w_RS_S_y [rad s^-1]', 'w_RS_S_z [rad s^-1]', 'a_RS_S_x [rad m s^-2]', 'a_RS_S_y [rad m s^-2]', 'a_RS_S_z [rad m s^-2]'])


for topic, msg, t in bag.read_messages(topics=['/imu']):

    timestamp = msg.header.stamp.to_nsec()
    ax = msg.linear_acceleration.x
    ay = msg.linear_acceleration.y
    az = msg.linear_acceleration.z
    wx = msg.angular_velocity.x
    wy = msg.angular_velocity.y
    wz = msg.angular_velocity.z
    csvwriter.writerow([timestamp, wx, wy, wz, ax, ay, az])

bag.close()
csvfile.close()

        执行脚本后我们生成了csv文件。我们查看一下:

        至此,我们IMU文件也生成了。

        在tum数据集中,需要将其转换成txt格式。我们执行下面的脚本,会把以csv保存的IMU信息转化成txt格式:

import csv

def csv_to_txt(csv_file, txt_file):
    with open(csv_file, 'r') as file:
        reader = csv.reader(file)
        with open(txt_file, 'w') as output_file:
            writer = csv.writer(output_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
            for row in reader:
                writer.writerow(row)

csv_file = 'csv文件的地址'
txt_file = '转换保存的txt文件地址'
csv_to_txt(csv_file, txt_file)

        我们执行脚本,可以看到保存IMU信息的csv文件被保存为txt文件格式(TUM数据集格式)了:

4.4 生成索引文件

        我们利用如下脚本文件生成图像的索引文件:

import os
import csv

def create_image_csv(folder_path, csv_file_path):
    with open(csv_file_path, 'wb') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['TimeStamp', 'Image Name'])

        for filename in os.listdir(folder_path):
            if filename.endswith('.jpg') or filename.endswith('.png'):
                image_name = os.path.splitext(filename)[0]
                writer.writerow([image_name, filename])

folder_path = '/home/liuhongwei/Desktop/right'  
csv_file_path = '/home/liuhongwei/Desktop/right.csv'  

create_image_csv(folder_path, csv_file_path)

        生成完后如图,这是左右目对应的时间戳和它们的索引文件:

        至此,我们的文件就生成完毕啦!我们将我们所做的东西打包成euroc数据集的格式就可以了。

        对于TUM数据集,我们需要生成图像的时间戳文件,我们通过下面的脚本去生成图像序列和对应的时间戳文件:

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 = '要保存的图像序列地址'
txt_file = '时间戳文件的地址(自动创建)'  # Path to the text file

class ImageCreator():
    def __init__(self):
        self.bridge = CvBridge()
        image_names = []  # List to store image names

        with rosbag.Bag('录制的bag包地址', 'r') as bag:
            for topic, msg, t in bag.read_messages():
                if topic == "/fisheye1":
                    try:
                        cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8")
                    except CvBridgeError as e:
                        print(e)
                        continue

                    timestr = "%.9f" % msg.header.stamp.to_sec()
                    image_name = timestr.replace('.', '')  # Remove periods from the timestamp
                    cv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG format
                    image_names.append(image_name)  # Add image name to the list

        # Save image names to the text file
        with open(txt_file, 'w') as f:
            f.write('\n'.join(image_names))

if __name__ == '__main__':
    try:
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

        我们可以看到生成了tum数据集所需的时间戳信息:

4.一个脚本完成拆包

        执行下面的脚本,自动拆左右目图像,自动生成IMU的csv信息和txt信息,对齐时间戳、生成左目图像的时间戳。

# -*- coding: utf-8 -*-

import rosbag
import csv
from sensor_msgs.msg import Imu
import os
import roslib
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
import shutil

def CreateDIR():
    folder_name = 'bag_tum'
    subfolders = ['left', 'righti']

    if not os.path.exists(folder_name):
        os.makedirs(folder_name)

    # 在主文件夹下创建子文件夹
    for subfolder in subfolders:
        subfolder_path = os.path.join(folder_name, subfolder)
        if not os.path.exists(subfolder_path):
            os.makedirs(subfolder_path)


def CreateIMUCSV(umpackbag):
    csvfile = open('imudata.csv', 'w')
    csvwriter = csv.writer(csvfile)
    csvwriter.writerow(['timestamp [ns]', 'w_RS_S_x [rad s^-1]', 'w_RS_S_y [rad s^-1]', 'w_RS_S_z [rad s^-1]', 'a_RS_S_x [rad m s^-2]', 'a_RS_S_y [rad m s^-2]', 'a_RS_S_z [rad m s^-2]'])
    for topic, msg, t in umpackbag.read_messages(topics=['/imu']):
        timestamp = msg.header.stamp.to_nsec()
        ax = msg.linear_acceleration.x
        ay = msg.linear_acceleration.y
        az = msg.linear_acceleration.z
        wx = msg.angular_velocity.x
        wy = msg.angular_velocity.y
        wz = msg.angular_velocity.z
        csvwriter.writerow([timestamp, wx, wy, wz, ax, ay, az])
    #umpackbag.close()
    csvfile.close()

def TransIMUdatatotxt():
    csv_file = './imudata.csv'
    txt_file = './imudata.txt'
    with open(csv_file, 'r') as file:
        reader = csv.reader(file)
        with open(txt_file, 'w') as output_file:
            writer = csv.writer(output_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
            for i, row in enumerate(reader):
                if i == 0:
                    writer.writerow(['#' + cell for cell in row])  # 添加#号
                else:
                    writer.writerow(row)

def SaveImageFishereyeleft(umpackbag):
    path = './bag_tum//left/'
    txt_file = './timestamp.txt'
    bridge = CvBridge()
    image_names = []

    with rosbag.Bag(bagname, 'r') as bag:
        for topic, msg, t in umpackbag.read_messages():
            if topic == "/fisheye1":
                try:
                    cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
                except CvBridgeError as e:
                    print(e)
                    continue

                timestr = "%.9f" % msg.header.stamp.to_sec()
                image_name = timestr.replace('.', '')  # Remove periods from the timestamp
                cv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG format
                image_names.append(image_name)  # Add image name to the list
    with open(txt_file, 'w') as f:
        f.write('\n'.join(image_names))

def SaveImageFishereyeright(umpackbag):
    path = './bag_tum//righti/'
    bridge = CvBridge()
    image_names = []

    with rosbag.Bag(bagname, 'r') as bag:
        for topic, msg, t in umpackbag.read_messages():
            if topic == "/fisheye2":
                try:
                    cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
                except CvBridgeError as e:
                    print(e)
                    continue

                timestr = "%.9f" % msg.header.stamp.to_sec()
                image_name = timestr.replace('.', '')  # Remove periods from the timestamp
                cv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG format
                image_names.append(image_name)  # Add image name to the list

def dealwithTimeStamp():
    folder1_path = './bag_tum//left/'
    folder2_path = './bag_tum//right/'
    output_folder_path = './bag_tum//righti/'
    folder1_files = sorted(os.listdir(folder1_path))
    folder2_files = sorted(os.listdir(folder2_path))
    if len(folder1_files) != len(folder2_files):
        print("录制包时左右目图像数量不一致,请手动处理")
    else:
        for i in range(len(folder2_files)):
            source_path = os.path.join(folder2_path, folder2_files[i])
            target_path = os.path.join(output_folder_path, folder1_files[i])
            shutil.copyfile(source_path, target_path)
        print("图像序列生成完毕")
    if os.path.exists(folder2_path):
        shutil.rmtree(folder2_path)


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    bagname = './road.bag'
    umpackbag = rosbag.Bag(bagname)
    CreateDIR()
    CreateIMUCSV(umpackbag)
    TransIMUdatatotxt()
    SaveImageFishereyeleft(umpackbag)
    SaveImageFishereyeright(umpackbag)
    dealwithTimeStamp()

        我们执行下面的脚本后,在脚本的同名文件夹下生成了TUM数据集以及EUROC数据集所需的文件信息。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: kitti数据集是一个用于自动驾驶研究的开放数据集,包含一系列从车辆上收集的图像、点云数据和其他传感器数据。它以其高分辨率、丰富的注释和多种场景类型而著称。这个数据集主要用于研究视觉SLAM、目标检测和语义分割等问题。 Euroc数据集是机械视觉组织(MVGroup)发布的惯导和摄像头数据集,用于传感器融合和相机位姿估计研究。它提供了高质量的图像序列和精确的姿态信息,主要用于定位和导航算法的评估和对比。 TUM数据集是由慕尼黑理工大学(Technical University of Munich)的计算机视觉组发布的数据集。它包括了室内、室外和日常场景的RGB-D图像序列,提供了精确的相机位姿、语义标签和跟踪信息。TUM数据集适用于SLAM算法的评估、三维重建和语义分割等研究领域。 Cityscapes数据集是用于城市场景理解的大规模数据集。它包含来自50个不同城市的高分辨率图像,标注了道路、行人、车辆等成分的语义分割标签。Cityscapes数据集以其精细的注释和多样的城市场景类型而闻名,并成为语义分割、实例分割和目标检测算法的基准数据集。 综上所述,每个数据集都有其独特的特点和适用领域。Kitti数据集适用于自动驾驶和视觉SLAM研究,Euroc数据集适用于传感器融合和相机位姿估计研究,TUM数据集适用于SLAM和语义分割研究,Cityscapes数据集适用于城市场景理解研究。这些数据集在各自领域中都提供了宝贵的资源,为算法研究和性能评估提供了重要支持。 ### 回答2: 1. KITTI数据集:KITTI数据集是一个广泛用于自动驾驶研究的数据集,包含了从车辆上采集的真实世界图像和激光雷达数据。主要特点包括: - 包含大量的RGB图像、激光雷达数据、相机标定数据和地面真实标注数据。 - 数据集内容多样,包括城市街景、高速公路等多种场景。 - 提供了多种任务的标注信息,包括物体检测、语义分割、立体视觉等,适用于不同的研究领域。 2. Euroc数据集Euroc数据集是一个用于视觉惯性里程计(Visual-Inertial Odometry, VIO)研究的数据集,提供了来自IMU和相机的数据。其特点包括: - 数据集内容包括IMU数据和相机图像,以及精确的相机和IMU标定信息。 - 数据集中涵盖了不同的场景,包括室内和室外,适用于室内导航和机器人定位等领域的研究。 - 标定信息的准确性对于VIO算法的性能至关重要,Euroc数据集提供了准确的标定信息,便于研究者开展精度评估和改进算法。 3. TUM数据集TUM数据集也是一个用于VIO研究的数据集,提供了相机和IMU数据。其特点包括: - 数据集包含IMU数据和相机图像,并提供了精确的时间同步信息和准确的标定参数。 - 数据集中包含了多种场景,如室内、室外、运动过程中等,适用于多种导航和定位研究需求。 - 数据集提供了多种任务的评估指标,如位置误差、旋转误差等,便于研究者评估算法性能。 4. Cityscapes数据集:Cityscapes数据集是一个用于城市场景理解研究的数据集,包含了来自车载摄像头的高分辨率图像和语义分割标注信息。其特点包括: - 数据集包含大量的城市街景图像,通过车载摄像头采集,图像分辨率较高。 - 数据集提供了详细的城市场景标注信息,包括道路、建筑物、车辆等语义分割标注,适用于车辆行驶场景理解相关研究。 - 数据集还提供了不同天气和时间条件下的图像,丰富数据多样性,便于研究算法的鲁棒性和普适性评估。 ### 回答3: kitti数据集是用于自动驾驶领域研究的一个主要数据集,包含在城市环境下的高分辨率立体图像和激光雷达数据。kitti数据集提供了包括车辆检测、行人检测、语义分割等多个任务的标注数据,同时还提供了车辆的位姿和深度信息等。其特点是数据质量高、场景真实、标注准确,适用于研究车辆感知和定位方面的问题。 euroc数据集是一个用于视觉和惯导算法评估的数据集,包含了在室内环境下的单目和双目图像IMU数据、真实的相机位姿和场景深度信息等。euroc数据集提供了高质量的图像和传感器数据,并提供了真实的相机运动轨迹作为参考。其特点是数据的精度和稳定性较高,适用于研究SLAM、图像跟踪等方面的问题。 tum数据集是一个用于视觉SLAM算法评估的数据集,包含了在室内和室外环境下的RGB-D图像IMU数据和三维点云数据。tum数据集提供了相机和IMU的精确同步数据,并提供了标定参数和相机位姿信息。其特点是数据质量较高、包含了多种不同的环境和场景,适用于研究RGB-D SLAM、场景重建等方面的问题。 Cityscapes数据集是一个用于语义分割和场景理解研究的数据集,包含了在城市街景中的高分辨率图像、像素级别的标注和相机位姿信息。Cityscapes数据集提供了多类别的像素级别标注,并包括了道路、建筑物、车辆等多种目标。其特点是数据规模庞大、注释详细、场景多样,适用于研究语义分割、目标检测等方面的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

APS2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值