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

本文主要是介绍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 CvBridgeErrorpath='/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 etimestr = "%.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 Imubag = 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.xay = msg.linear_acceleration.yaz = msg.linear_acceleration.zwx = msg.angular_velocity.xwy = msg.angular_velocity.ywz = msg.angular_velocity.zcsvwriter.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 shutilfolder1_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 Imubag = 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.xay = msg.linear_acceleration.yaz = msg.linear_acceleration.zwx = msg.angular_velocity.xwy = msg.angular_velocity.ywz = msg.angular_velocity.zcsvwriter.writerow([timestamp, wx, wy, wz, ax, ay, az])bag.close()
csvfile.close()

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

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

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

import csvdef 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 csvdef 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 CvBridgeErrorpath = '要保存的图像序列地址'
txt_file = '时间戳文件的地址(自动创建)'  # Path to the text fileclass ImageCreator():def __init__(self):self.bridge = CvBridge()image_names = []  # List to store image nameswith 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)continuetimestr = "%.9f" % msg.header.stamp.to_sec()image_name = timestr.replace('.', '')  # Remove periods from the timestampcv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG formatimage_names.append(image_name)  # Add image name to the list# Save image names to the text filewith 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 shutildef 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.xay = msg.linear_acceleration.yaz = msg.linear_acceleration.zwx = msg.angular_velocity.xwy = msg.angular_velocity.ywz = msg.angular_velocity.zcsvwriter.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)continuetimestr = "%.9f" % msg.header.stamp.to_sec()image_name = timestr.replace('.', '')  # Remove periods from the timestampcv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG formatimage_names.append(image_name)  # Add image name to the listwith 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)continuetimestr = "%.9f" % msg.header.stamp.to_sec()image_name = timestr.replace('.', '')  # Remove periods from the timestampcv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG formatimage_names.append(image_name)  # Add image name to the listdef 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数据集所需的文件信息。

这篇关于T265录制的rosbag拆包:拆IMU序列和图像序列方法以及如何制作双目euroc、双目tum数据集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667630

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施: