解析ROSbag图片,点云。
在网上看了一些处理ROSbag文章,简单总结一下放在下面。写于2022.06.06,有点6啊。
第一,针对ROSbag的2D图像数据:
1. 可以写ros .launch直接拿到。参考ros-wiki.
2. 可以用ros python API解析bag拿到。 下面代码可以通过 docker pull leo345/rosbag2info 拿到镜像运行。
1 # ROS bag image, lidar data extraction. 2 # Using next lidar-frame of camera-frame as lidar data output. 3 import cv2 4 import os 5 import rosbag 6 from cv_bridge import CvBridge 7 bag_list = os.listdir('./rosbag') 8 9 10 def main(): 11 # Process bag one by one. 12 for bag_name in bag_list: 13 bag = rosbag.Bag('./rosbag/' + bag_name, "r") 14 bridge = CvBridge() 15 bag_data = bag.read_messages() 16 count = 0 17 timestamp = '0000000000' 18 print('Extracting work starts from ' + os.getcwd()) 19 os.makedirs('./raw_data/%s/pcd' % bag_name[:-4]) 20 os.makedirs('./raw_data/%s/imgs' % bag_name[:-4]) 21 for topic, msg, t in bag_data: 22 # Extract camera info. 23 if topic == '/kitti/camera_color_left/image_raw': 24 count += 1 25 cv_image = bridge.imgmsg_to_cv2(msg, 'rgb8') 26 timestamp = str(msg.header.stamp.to_sec()) 27 img_name = timestamp + '.jpg' 28 cv2.imwrite('./raw_data/%s/imgs/' % bag_name[:-4] + img_name, cv_image) 29 30 # Extract lidar info. 31 if topic == '/kitti/velo/pointcloud': 32 lidar_data_name = timestamp + '.csv' 33 lidar_data_path = os.path.join('./raw_data/%s/pcd/' % bag_name[:-4] + lidar_data_name) 34 with open(lidar_data_path, 'w') as f: 35 f.write(str(msg)) 36 37 print("Extracting ended, And in %s, image total frames num is: " % bag_name[:-4] + str(count)) 38 39 40 if __name__ == '__main__': 41 main()
当然上面代码顺便解析了lidar的数据存下来。
第二,针对ROSbag的3D点云数据:
1. 可以用ros python API解析bag拿到。 (如上面的code)
2. 比较好的一个包 bagpy( without ros env.)
尤其是第二个方法,非常方便。。how to详见GitHub.
That's all!
浙公网安备 33010602011771号