当前位置:   article > 正文

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

rosbag转化图像序列

目录

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的信息

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

  1. import roslib
  2. import rosbag
  3. import rospy
  4. import cv2
  5. from sensor_msgs.msg import Image
  6. from cv_bridge import CvBridge
  7. from cv_bridge import CvBridgeError
  8. path='/home/xxxx/Desktop/left/'
  9. class ImageCreator():
  10. def __init__(self):
  11. self.bridge = CvBridge()
  12. with rosbag.Bag('/home/xxxx/Desktop/out.bag', 'r') as bag:
  13. for topic,msg,t in bag.read_messages():
  14. if topic == "/fisheye1":
  15. try:
  16. cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
  17. except CvBridgeError as e:
  18. print e
  19. timestr = "%.6f" % msg.header.stamp.to_sec()
  20. image_name = timestr+ ".jpg"
  21. cv2.imwrite(path+image_name, cv_image)
  22. if __name__ == '__main__':
  23. try:
  24. image_creator = ImageCreator()
  25. except rospy.ROSInterruptException:
  26. pass

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

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

3.拆IMU数据

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

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

  1. import rosbag
  2. import csv
  3. from sensor_msgs.msg import Imu
  4. bag = rosbag.Bag('/home/xxxx/Desktop/out.bag')
  5. csvfile = open('imu.csv', 'w')
  6. csvwriter = csv.writer(csvfile)
  7. csvwriter.writerow(['timestamp', 'ax', 'ay', 'az', 'wx', 'wy', 'wz'])
  8. for topic, msg, t in bag.read_messages(topics=['/imu']):
  9. timestamp = msg.header.stamp.to_nsec()
  10. ax = msg.linear_acceleration.x
  11. ay = msg.linear_acceleration.y
  12. az = msg.linear_acceleration.z
  13. wx = msg.angular_velocity.x
  14. wy = msg.angular_velocity.y
  15. wz = msg.angular_velocity.z
  16. csvwriter.writerow([timestamp, ax, ay, az, wx, wy, wz])
  17. bag.close()
  18. csvfile.close()

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

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

4.1 eruoc数据集格式

        照片格式:

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

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

        这是IMU的数据。

4.2 对齐时间戳

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

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

  1. import os
  2. import os
  3. import shutil
  4. folder1_path = "/home/liuhongwei/Desktop/left"
  5. folder2_path = "/home/liuhongwei/Desktop/right"
  6. output_folder_path = "/home/liuhongwei/Desktop/righti"
  7. folder1_files = sorted(os.listdir(folder1_path))
  8. folder2_files = sorted(os.listdir(folder2_path))
  9. if len(folder1_files) != len(folder2_files):
  10. print("no")
  11. else:
  12. for i in range(len(folder2_files)):
  13. source_path = os.path.join(folder2_path, folder2_files[i])
  14. target_path = os.path.join(output_folder_path, folder1_files[i])
  15. shutil.copyfile(source_path, target_path)
  16. print("yes")

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

4.3 编写imu.csv文件

  1. import rosbag
  2. import csv
  3. from sensor_msgs.msg import Imu
  4. bag = rosbag.Bag('bag包的地址')
  5. csvfile = open('imu1.csv', 'w')
  6. csvwriter = csv.writer(csvfile)
  7. 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]'])
  8. for topic, msg, t in bag.read_messages(topics=['/imu']):
  9. timestamp = msg.header.stamp.to_nsec()
  10. ax = msg.linear_acceleration.x
  11. ay = msg.linear_acceleration.y
  12. az = msg.linear_acceleration.z
  13. wx = msg.angular_velocity.x
  14. wy = msg.angular_velocity.y
  15. wz = msg.angular_velocity.z
  16. csvwriter.writerow([timestamp, wx, wy, wz, ax, ay, az])
  17. bag.close()
  18. csvfile.close()

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

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

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

  1. import csv
  2. def csv_to_txt(csv_file, txt_file):
  3. with open(csv_file, 'r') as file:
  4. reader = csv.reader(file)
  5. with open(txt_file, 'w') as output_file:
  6. writer = csv.writer(output_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
  7. for row in reader:
  8. writer.writerow(row)
  9. csv_file = 'csv文件的地址'
  10. txt_file = '转换保存的txt文件地址'
  11. csv_to_txt(csv_file, txt_file)

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

4.4 生成索引文件

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

  1. import os
  2. import csv
  3. def create_image_csv(folder_path, csv_file_path):
  4. with open(csv_file_path, 'wb') as csvfile:
  5. writer = csv.writer(csvfile)
  6. writer.writerow(['TimeStamp', 'Image Name'])
  7. for filename in os.listdir(folder_path):
  8. if filename.endswith('.jpg') or filename.endswith('.png'):
  9. image_name = os.path.splitext(filename)[0]
  10. writer.writerow([image_name, filename])
  11. folder_path = '/home/liuhongwei/Desktop/right'
  12. csv_file_path = '/home/liuhongwei/Desktop/right.csv'
  13. create_image_csv(folder_path, csv_file_path)

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

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

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

  1. import roslib
  2. import rosbag
  3. import rospy
  4. import cv2
  5. from sensor_msgs.msg import Image
  6. from cv_bridge import CvBridge
  7. from cv_bridge import CvBridgeError
  8. path = '要保存的图像序列地址'
  9. txt_file = '时间戳文件的地址(自动创建)' # Path to the text file
  10. class ImageCreator():
  11. def __init__(self):
  12. self.bridge = CvBridge()
  13. image_names = [] # List to store image names
  14. with rosbag.Bag('录制的bag包地址', 'r') as bag:
  15. for topic, msg, t in bag.read_messages():
  16. if topic == "/fisheye1":
  17. try:
  18. cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8")
  19. except CvBridgeError as e:
  20. print(e)
  21. continue
  22. timestr = "%.9f" % msg.header.stamp.to_sec()
  23. image_name = timestr.replace('.', '') # Remove periods from the timestamp
  24. cv2.imwrite(path + image_name + '.png', cv_image) # Save as PNG format
  25. image_names.append(image_name) # Add image name to the list
  26. # Save image names to the text file
  27. with open(txt_file, 'w') as f:
  28. f.write('\n'.join(image_names))
  29. if __name__ == '__main__':
  30. try:
  31. image_creator = ImageCreator()
  32. except rospy.ROSInterruptException:
  33. pass

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

4.一个脚本完成拆包

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

  1. # -*- coding: utf-8 -*-
  2. import rosbag
  3. import csv
  4. from sensor_msgs.msg import Imu
  5. import os
  6. import roslib
  7. import rospy
  8. import cv2
  9. from sensor_msgs.msg import Image
  10. from cv_bridge import CvBridge
  11. from cv_bridge import CvBridgeError
  12. import shutil
  13. def CreateDIR():
  14. folder_name = 'bag_tum'
  15. subfolders = ['left', 'righti']
  16. if not os.path.exists(folder_name):
  17. os.makedirs(folder_name)
  18. # 在主文件夹下创建子文件夹
  19. for subfolder in subfolders:
  20. subfolder_path = os.path.join(folder_name, subfolder)
  21. if not os.path.exists(subfolder_path):
  22. os.makedirs(subfolder_path)
  23. def CreateIMUCSV(umpackbag):
  24. csvfile = open('imudata.csv', 'w')
  25. csvwriter = csv.writer(csvfile)
  26. 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]'])
  27. for topic, msg, t in umpackbag.read_messages(topics=['/imu']):
  28. timestamp = msg.header.stamp.to_nsec()
  29. ax = msg.linear_acceleration.x
  30. ay = msg.linear_acceleration.y
  31. az = msg.linear_acceleration.z
  32. wx = msg.angular_velocity.x
  33. wy = msg.angular_velocity.y
  34. wz = msg.angular_velocity.z
  35. csvwriter.writerow([timestamp, wx, wy, wz, ax, ay, az])
  36. #umpackbag.close()
  37. csvfile.close()
  38. def TransIMUdatatotxt():
  39. csv_file = './imudata.csv'
  40. txt_file = './imudata.txt'
  41. with open(csv_file, 'r') as file:
  42. reader = csv.reader(file)
  43. with open(txt_file, 'w') as output_file:
  44. writer = csv.writer(output_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
  45. for i, row in enumerate(reader):
  46. if i == 0:
  47. writer.writerow(['#' + cell for cell in row]) # 添加#号
  48. else:
  49. writer.writerow(row)
  50. def SaveImageFishereyeleft(umpackbag):
  51. path = './bag_tum//left/'
  52. txt_file = './timestamp.txt'
  53. bridge = CvBridge()
  54. image_names = []
  55. with rosbag.Bag(bagname, 'r') as bag:
  56. for topic, msg, t in umpackbag.read_messages():
  57. if topic == "/fisheye1":
  58. try:
  59. cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
  60. except CvBridgeError as e:
  61. print(e)
  62. continue
  63. timestr = "%.9f" % msg.header.stamp.to_sec()
  64. image_name = timestr.replace('.', '') # Remove periods from the timestamp
  65. cv2.imwrite(path + image_name + '.png', cv_image) # Save as PNG format
  66. image_names.append(image_name) # Add image name to the list
  67. with open(txt_file, 'w') as f:
  68. f.write('\n'.join(image_names))
  69. def SaveImageFishereyeright(umpackbag):
  70. path = './bag_tum//righti/'
  71. bridge = CvBridge()
  72. image_names = []
  73. with rosbag.Bag(bagname, 'r') as bag:
  74. for topic, msg, t in umpackbag.read_messages():
  75. if topic == "/fisheye2":
  76. try:
  77. cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
  78. except CvBridgeError as e:
  79. print(e)
  80. continue
  81. timestr = "%.9f" % msg.header.stamp.to_sec()
  82. image_name = timestr.replace('.', '') # Remove periods from the timestamp
  83. cv2.imwrite(path + image_name + '.png', cv_image) # Save as PNG format
  84. image_names.append(image_name) # Add image name to the list
  85. def dealwithTimeStamp():
  86. folder1_path = './bag_tum//left/'
  87. folder2_path = './bag_tum//right/'
  88. output_folder_path = './bag_tum//righti/'
  89. folder1_files = sorted(os.listdir(folder1_path))
  90. folder2_files = sorted(os.listdir(folder2_path))
  91. if len(folder1_files) != len(folder2_files):
  92. print("录制包时左右目图像数量不一致,请手动处理")
  93. else:
  94. for i in range(len(folder2_files)):
  95. source_path = os.path.join(folder2_path, folder2_files[i])
  96. target_path = os.path.join(output_folder_path, folder1_files[i])
  97. shutil.copyfile(source_path, target_path)
  98. print("图像序列生成完毕")
  99. if os.path.exists(folder2_path):
  100. shutil.rmtree(folder2_path)
  101. # Press the green button in the gutter to run the script.
  102. if __name__ == '__main__':
  103. bagname = './road.bag'
  104. umpackbag = rosbag.Bag(bagname)
  105. CreateDIR()
  106. CreateIMUCSV(umpackbag)
  107. TransIMUdatatotxt()
  108. SaveImageFishereyeleft(umpackbag)
  109. SaveImageFishereyeright(umpackbag)
  110. dealwithTimeStamp()

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/59613
推荐阅读
相关标签
  

闽ICP备14008679号