从bag包中提取图片和点云数据为pcd格式点云文件

简介: 从bag包中提取图片和点云数据为pcd格式点云文件

首先说明一下我运行的系统环境:

  • python2
  • Ubuntu18.04
  • ROS melodic

1 开始提取bag包之前的准备工作

1、首先查看一下自己的bag包中,相机和激光雷达的topic

(base) shl@zhihui-mint:~$ rosbag info 2021-03-24-11-01-45.bag
path:        2021-03-24-11-01-45.bag
version:     2.0
duration:    23.7s
start:       Mar 24 2021 11:01:45.46 (1616554905.46)
end:         Mar 24 2021 11:02:09.15 (1616554929.15)
size:        860.0 MB
messages:    474
compression: none [474/474 chunks]
types:       sensor_msgs/Image       [060021388200f6f0f447d0fcd9c64743]
             sensor_msgs/PointCloud2 [1158d486dd51d683ce2f1be655c3c181]
topics:      /usb_cam/image_raw   238 msgs    : sensor_msgs/Image
             /velodyne_points     236 msgs    : sensor_msgs/PointCloud2
(base) shl@zhihui-mint:~$

如上:

  • 我相机的topic为/usb_cam/image_raw
  • 激光雷达的topic为:/velodyne_points

2、由于我相机和激光雷达采集数据的频率都是10Hz,因此提取出之后的数据几乎是每一帧都是保持对齐的!

3、下面提取数据保存的路径

root/
├── images   # 存放提取图片数据,格式jpg
└── pointcloud  # 存放提取的点云数据,格式pcd

2 从bag包中提取图片和点云数据

1、使用rosbag库包提取图片数据

注意:

在提取图片数据的时候,我的rosbag库包是在python2环境下的,因此在运行程序的时候也是使用python2作为解释器进行执行的!

2、把bag包中的点云数据提取为pcd格式点云文件,提取命令:

rosrun pcl_ros bag_to_pcd result.bag /velodyne_points ./pointcloud

  • rosrun pcl_ros bag_to_pcd:前面是指定把bag包提取为pcd格式文件
  • result.bag:是要提取的bag包文件
  • /velodyne_points:是要提取bag包中对应的激光雷达的topic
  • ./pointcloud:是提取的pcd格式的一帧一帧的点云文件

3、下面是完整的代码

#coding:utf-8
'''
env:
- python2
- ros melodic

* pcd格式的单帧点云数据,可以通过 pcl_viewer 20.pcd 的形式进行查看



每个msg中存放的信息:
# print(msg)
header:
  seq: 1769
  stamp:
    secs: 1616554905
    nsecs: 527051435
  frame_id: "usb_cam"
height: 720
width: 1280
encoding: "rgb8"
is_bigendian: 0
step: 3840
data: [146, 205, 228, 144, 203, 226, 149, 189, ...]   # 很长的一个列表


'''

__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"


import os
import rosbag
import cv2
from cv_bridge import CvBridge
from tqdm import tqdm
import time


class ExtractBagData(object):

    def __init__(self, bagfile_path, camera_topic, pointcloud_topic, root):
        self.bagfile_path = bagfile_path
        self.camera_topic = camera_topic
        self.pointcloud_topic = pointcloud_topic
        self.root = root
        self.image_dir = os.path.join(root, "images")
        self.pointcloud_dir = os.path.join(root, "pointcloud")

        #创建提取图片和点云的目录 ./root/images  root/pointcloud
        if not os.path.exists(self.image_dir):
            os.makedirs(self.image_dir)
        if not os.path.exists(self.pointcloud_dir):
            os.makedirs(self.pointcloud_dir)

    def extract_camera_topic(self):
        bag = rosbag.Bag(self.bagfile_path, "r")
        bridge = CvBridge()
        bag_data_imgs = bag.read_messages(self.camera_topic)

        index = 0

        # for topic, msg, t in bag_data_imgs:
        # for topic, msg, t in tqdm(bag_data_imgs):
        pbar = tqdm(bag_data_imgs)
        for topic, msg, t in pbar:
            pbar.set_description("Processing extract image id: %s" % (index+1))
            cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
            # print('\033[31m=\033[0m'*120)
            # print(topic)  # /usb_cam/image_raw
            # print(msg)
            # print(t)  # 1616554905461126311
            #print(type(cv_image))  # <type 'numpy.ndarray'>
            # cv2.imshow("Image window", cv_image)
            # cv2.waitKey(3)
            # 如果你需要使用时间戳对提取的图片命名,可以使用msg.header.stamp.to_sec()获取时间戳
            # timestr = "%.6f" %  msg.header.stamp.to_sec()
            cv2.imwrite(os.path.join(self.image_dir, str(index) + ".jpg"), cv_image)
            index += 1

    def extract_pointcloud_topic(self):
        '''
        # 提取点云数据为pcd后缀文件,默认提取以为时间戳命名
        # 提取命令:rosrun pcl_ros bag_to_pcd result.bag /velodyne_points ./pointcloud
        # 提取点云以时间戳命令:1616554905.476288682.pcd
        :return:
        '''
        cmd = "rosrun pcl_ros bag_to_pcd %s /velodyne_points %s" % (self.bagfile_path, self.pointcloud_dir)
        os.system(cmd)

        # 再读取提取的pcd点云数据,把文件名修改为按照顺序索引名
        pcd_files_list = os.listdir(self.pointcloud_dir)
        # 因为提取的pcd是以时间戳命令的,但是存放到列表中并不是按照时间戳从小到大排列,这里对时间戳进行重新排序
        pcd_files_list_sorted = sorted(pcd_files_list)
        # print(zip(pcd_files_list, pcd_files_list_sorted))

        index = 0
        pbar = tqdm(pcd_files_list_sorted)
        for pcd_file in pbar:
            pbar.set_description("Processing extract poindcloud id: %s" % (index + 1))
            os.rename(os.path.join(self.pointcloud_dir, pcd_file),
                      os.path.join(self.pointcloud_dir, str(index) + ".pcd"))
            print("pcd_file name: ", pcd_file)
            index += 1



if __name__ == '__main__':
    # bagfile_path = "/home/shl/extract_rosbag_data/0324_bags/plycal_calib/2021-03-24-11-01-45.bag"
    # camera_topic = "/usb_cam/image_raw"
    # pointcloud_topic = "/velodyne_points"
    # extract_bag = ExtractBagData(bagfile_path, camera_topic, pointcloud_topic,  "root")
    # extract_bag.extract_camera_topic()
    # extract_bag.extract_pointcloud_topic()



    bagfile_path = "/home/shl/Desktop/calibrate_data/2021_05_06-17_21_40.bag"
    camera_topic = "/image"
    pointcloud_topic = "/velodyne_points"
    extract_bag = ExtractBagData(bagfile_path, camera_topic, pointcloud_topic,  "/home/shl/Desktop/calibrate_data/extract_data")
    extract_bag.extract_camera_topic()
    extract_bag.extract_pointcloud_topic()
目录
相关文章
|
存储 传感器 自动驾驶
几种常见的点云格式数据解析与在线预览
3D模型在线转换网站支持pcd、pts、xyz、las、laz、asc、ply等点云格式文件在线预览,同时支持将点云格式在线转换为ply、xyz等模型格式。
6717 1
|
存储 数据采集 传感器
一文多图搞懂KITTI数据集下载及解析
一文多图搞懂KITTI数据集下载及解析
15556 3
一文多图搞懂KITTI数据集下载及解析
|
数据采集 数据可视化 Ubuntu
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
该功能包提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
|
4月前
|
JSON JavaScript 前端开发
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发送数据时,保证网络稳定性也是重要的。以上步骤为建立基本的WebSocket传输提供了框架,并可以根据实际需求进行调整和优化。
393 0
|
Linux Windows
Nomachine 最简安装与使用指南
这是一篇2022年Nomachine软件的极简安装与使用指南,包括Windows和Linux系统下的安装步骤,以及如何在Windows系统上通过Nomachine远程控制Linux系统的方法。
Nomachine 最简安装与使用指南
|
传感器 自动驾驶 机器人
大疆Livox Mid360 使用指南
本文是大疆Livox Mid-360激光雷达的使用指南,包括Livox Viewer 2的安装与使用、Livox SDK2的安装与演示、Livox ROS的配置与启动,以及一些使用时的注意事项。文章还提供了关于Livox Mid-360的详细特点、接线信息、尺寸信息、主控端IP设置、修改Livox Mid 360的IP方法、坐标系定义和IMU内参的介绍。此外,还提供了官方资料和软件下载的链接。
6633 2
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
3911 1
|
算法 数据可视化 定位技术
基于PCL库的通过ICP匹配多幅点云方法
基于PCL库的通过ICP匹配多幅点云方法
基于PCL库的通过ICP匹配多幅点云方法
|
传感器 算法 Linux
查看 PCD 点云 windows
在Linux系统查看PCD 点云有许多方法,但发现在windows下的工具比较少,这里分享两个思路,一个是使用MATLAB工具编程,另一个是下载CloudCompare软件进行查看点云。
12405 0
查看 PCD 点云 windows