精华内容
下载资源
问答
  • zed2相机简单使用

    2021-06-08 10:37:33
    一、opencv显示zed2相机的左右图片

    一、opencv显示zed2相机图片

      描述:使用opencv显示相机的左右摄像头获取的图片,并实现按键保存图片,我的目的是用于采集左右摄像头包含标定板的图片,最终验证标定准确性。

    import cv2
    import os
    import sys
    import numpy as np
    import pyzed.sl as zed
    
    def zedCamshowLR():
        """
        opencv显示zed摄像头左右图片,并实现zed2相机按键保存图片,
        :return: ss
        """
        cam = zed.Camera()
        input_type = zed.InputType()
        init = zed.InitParameters(input_t=input_type)
        init.camera_resolution = zed.RESOLUTION.HD720  # HD720,HD1080,HD2K
        init.coordinate_units = zed.UNIT.MILLIMETER
        cam.open(init)
    
        image_size = cam.get_camera_information().camera_resolution
        image_zed = zed.Mat(image_size.width, image_size.height, zed.MAT_TYPE.U8_C4)
    
        num_l = 1
        num_r = 1
        while True:
            cam.grab()
            image_sl_left = zed.Mat()  # left_img
            cam.retrieve_image(image_sl_left, zed.VIEW.LEFT)
            image_cv_left = image_sl_left.get_data()
            image_sl_right = zed.Mat()  # right_img
            cam.retrieve_image(image_sl_right, zed.VIEW.RIGHT)
            image_cv_right = image_sl_right.get_data()
    
            image_cv_left = cv2.cvtColor(image_cv_left, 1)
            image_cv_right = cv2.cvtColor(image_cv_right, 1)
    
            cv2.imshow("left", image_cv_left)
            cv2.imshow("right", image_cv_right)
            key = cv2.waitKey(1)
            if key & 0xFF == ord('l'):
                savePath = os.path.join("./images", "L{:0>3d}.png".format(num_l))  # 注意根目录是否存在"./images"文件夹
                cv2.imwrite(savePath, image_cv_left)
                num_l = num_l + 1
            if key & 0xFF == ord('r'):
                savePath = os.path.join("./images", "R{:0>3d}.png".format(num_r))
                cv2.imwrite(savePath, image_cv_right)
                num_r = num_r + 1
            if key & 0xFF == 27:
                break

    二、封装zed2摄像头

    封装一下zed2摄像头方便使用

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time        :2021/6/10 上午10:00
    # @Author      :weiz
    # @ProjectName :zed-samples
    # @File        :CameraZed2.py
    # @Description :封装一下zed摄像头
    import cv2
    import os
    import time
    import pyzed.sl as zed
    import shutil
    import math
    
    
    class CameraZed2:
        def __init__(self, resolutionRatio=None, depthMode=None):
            self.cam = zed.Camera()
            self.input_type = zed.InputType()
            self.camInit = zed.InitParameters(input_t=self.input_type)
    
            # 设置分辨率
            if resolutionRatio == "HD2K":
                self.camInit.camera_resolution = zed.RESOLUTION.HD2K
            elif resolutionRatio == "HD1080":
                self.camInit.camera_resolution = zed.RESOLUTION.HD1080
            else:
                self.camInit.camera_resolution = zed.RESOLUTION.HD720
            # 设置获取深度信息的模式
            if depthMode == "PERFORMANCE":
                self.camInit.depth_mode = zed.DEPTH_MODE.PERFORMANCE
            elif depthMode == "QUALITY":
                self.camInit.depth_mode = zed.DEPTH_MODE.QUALITY
            else:
                self.camInit.depth_mode = zed.DEPTH_MODE.ULTRA
            self.camInit.coordinate_units = zed.UNIT.MILLIMETER  # 单位毫米
            err = self.cam.open(self.camInit)
            if err != zed.ERROR_CODE.SUCCESS:
                print(repr(err))
                self.cam.close()
                exit(1)
    
            self.image_size = self.cam.get_camera_information().camera_resolution
            self.image_zed = zed.Mat(self.image_size.width, self.image_size.height, zed.MAT_TYPE.U8_C4)
    
            # Set runtime parameters after opening the camera
            self.runtime = zed.RuntimeParameters()
            self.runtime.sensing_mode = zed.SENSING_MODE.STANDARD
    
        def dataStreamRunning(self):
            """
            用于获取摄像头的数据流
            :return:
            """
            image_zed_left = zed.Mat()  # left_img
            image_zed_right = zed.Mat()  # right_img
            depth_image = zed.Mat(self.image_size.width, self.image_size.height, zed.MAT_TYPE.U8_C4)
            self.point_cloud = zed.Mat()
            self.depth_map = zed.Mat()
    
            while True:
                self.cam.grab(self.runtime)
    
                # 左图
                self.cam.retrieve_image(image_zed_left, zed.VIEW.LEFT)
                image_cv_left = image_zed_left.get_data()
    
                # 右图
                self.cam.retrieve_image(image_zed_right, zed.VIEW.RIGHT)
                image_cv_right = image_zed_right.get_data()
    
                # 深度信息和点云
                self.cam.retrieve_image(depth_image, zed.VIEW.DEPTH, zed.MEM.CPU, self.image_size)
                self.cam.retrieve_measure(self.point_cloud, zed.MEASURE.XYZRGBA, zed.MEM.CPU, self.image_size)
                self.cam.retrieve_measure(self.depth_map, zed.MEASURE.DEPTH)
    
                self.image_cv_left = cv2.cvtColor(image_cv_left, 1)
                self.image_cv_right = cv2.cvtColor(image_cv_right, 1)
                self.image_depth = depth_image.get_data()
    
                yield
    
        def showImage(self):
            while True:
                next(self.dataStreamRunning())
    
                cv2.imshow("left", self.image_cv_left)
                cv2.imshow("right", self.image_cv_right)
                cv2.imshow("depth", self.image_depth)
                if cv2.waitKey(1) & 0xFF == 27:
                    break
    
        def getMatImage(self, lr=None):
            """
            获取opencv格式的图片
            :param lr:获取左图或右图的标识位
            :return:
            """
            next(self.dataStreamRunning())
    
            if lr == "right":
                return self.image_cv_right
            else:
                return self.image_cv_left
    
        def getDepthValue(self, x, y):
            """
            获得某个像素点的深度信息
            :param x:
            :param y:
            :return:
            """
            next(self.dataStreamRunning())
            _, value = self.depth_map.get_value(x, y)
            return value
    
        def getPointCloud(self, x, y):
            """
            获得某个像素点的点云信息
            :param x:
            :param y:
            :return: [x, y, z, color],离左摄像头的距离
            """
            next(self.dataStreamRunning())
            _, point3D = self.point_cloud.get_value(x, y)
            distance = math.sqrt(point3D[0]*point3D[0] + point3D[1]*point3D[1] + point3D[2]*point3D[2])
            return point3D, distance
    
        def saveImageOfKey(self, savePath=None):
            """
            根据按键信息保存图片
            :param savePath:
            :return:
            """
            if savePath == None:
                savePath = "./zed2ImagesOfKey"
                if os.path.exists(savePath):
                    shutil.rmtree(savePath)
                os.mkdir(savePath)
            else:
                if os.path.exists(savePath):
                    shutil.rmtree(savePath)
                os.mkdir(savePath)
    
            num_l = 1
            num_r = 1
            while True:
                next(self.dataStreamRunning())
    
                cv2.imshow("left", self.image_cv_left)
                cv2.imshow("right", self.image_cv_right)
                key = cv2.waitKey(1)
                if key & 0xFF == ord('l'):
                    tmSavePath = os.path.join(savePath, "L{:0>3d}.png".format(num_l))
                    cv2.imwrite(tmSavePath, self.image_cv_left)
                    num_l = num_l + 1
                if key & 0xFF == ord('r'):
                    tmSavePath = os.path.join(savePath, "R{:0>3d}.png".format(num_r))
                    cv2.imwrite(tmSavePath, self.image_cv_right)
                    num_r = num_r + 1
                if key & 0xFF == 27:
                    break
    
        def saveImage(self, img, savePath=None, imageName=None):
            """
            保存图片,注意每秒只能保存一张图片
            :param savePath:
            :param imageName:
            :return:
            """
            if savePath == None:
                savePath = "./zed2Images"
            if imageName == None:
                imageName = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    
            if not os.path.exists(savePath):
                os.mkdir(savePath)
            savePath = os.path.join(savePath, imageName + ".png")
    
            cv2.imwrite(savePath, img)
    
    
    if __name__ == "__main__":
        cam = CameraZed2(depthMode="PERFORMANCE")
        #cam.showImage()
    
        # while True:
        #     img = cam.getMatImage()
        #     cv2.imshow("img", img)
        #     if cv2.waitKey(1) & 0xFF == 27:
        #         break
    
        # cam.saveImageOfKey("./abc")
    
        # img = cam.getMatImage()
        # cam.saveImage(img)
    
        print(cam.getDepthValue(100, 100))
    
        print(cam.getPointCloud(100, 100))

     

    展开全文
  • ZED2相机标定及运行VINS-mono 复古蓝 2020-11-12 13:18:14 640 收藏 5 分类专栏: Ubuntu 文章标签: ZED2相机标定 ZED2 VINS 版权 一、ZED2相机+IMU标定 1、标定工具安装 Kalibr的安装参见我的另外一篇博客...

    转载自:https://blog.csdn.net/weixin_44401286/article/details/109641268

    ZED2相机标定及运行VINS-mono

    复古蓝 2020-11-12 13:18:14 640 收藏 5

    分类专栏: Ubuntu 文章标签: ZED2相机标定 ZED2 VINS

    版权

    一、ZED2相机+IMU标定

    1、标定工具安装

    Kalibr的安装参见我的另外一篇博客Kalibr安装及相机+IMU标定
    (需要注意的是Kalibr的安装需要网络能用google,否则网络问题会导致安装不成功,如需可以找我copy相关安装所需文件)
    接下来是imu_utils的安装,参考github上的安装要求即可,且依赖于code_utils,需要先安装code_utils,然后创建catkin工作空间,必须先把code_utils放进去catkin_make,然后再把imu_utils文件放入工作空间中catkin_make,否则会报错找不到code_utils。

    2、ZED2标定数据录制

    我根据需求修改了ZED2的分辨率,在ZED2_WS/src/zed-ros-wrapper/zed_wrapper/params文件夹下找到common.yaml,设置resolution为3,即VGA模式,实际分辨率大小为672*376.

    然后打开ZED2相机开启数据录制:

    roslaunch zed_wrapper zed2.launch
    

    启用左右摄像头可视化功能,以确保将标定板保持在相机范围内。

    rosrun image_view image_view image:=/zed2/zed_node/left/image_rect_color & rosrun image_view image_view image:=/zed2/zed_node/right/image_rect_color 
    

    kalibr在处理标定数据的时候要求图像的频率不可过高,降低图像数据到20HZ,IMU数据至200HZ.

    rosrun topic_tools throttle messages /zed2/zed_node/imu/data_raw  200 /zed2/zed_node/imu/data_raw2
    rosrun topic_tools throttle messages /zed2/zed_node/left/image_rect_color 20 /zed2/zed_node/left/image_rect_color2
    rosrun topic_tools throttle messages /zed2/zed_node/right/image_rect_color 20 /zed2/zed_node/right/image_rect_color2
    

    录制数据

    rosbag record -O Kalib_data_vga.bag /zed2/zed_node/imu/data_raw2 /zed2/zed_node/left/image_rect_color2 /zed2/zed_node/right/image_rect_color2
    

    3、开始相机标定

    这里使用的是棋盘格标定板,对应的checkboard.yaml文件内容为:

    target_type: 'checkerboard' #gridtype
    targetCols: 8               #number of internal chessboard corners
    targetRows: 11               #number of internal chessboard corners
    rowSpacingMeters: 0.03      #size of one chessboard square [m]
    colSpacingMeters: 0.03      #size of one chessboard square [m]
    

    执行标定:

    单目情况

    kalibr_calibrate_cameras --bag /home/ipsg/ZED2_WS/Kalib_data_vga.bag --topics /zed2/zed_node/left/image_rect_color2 --models pinhole-radtan  --target /home/ipsg/dataset/checkboard.yaml --bag-from-to 5 140 --show-extraction --approx-sync 0.04
    

    双目情况:

    kalibr_calibrate_cameras --bag /home/ipsg/ZED2_WS/Kalib_data_vga.bag --topics /zed2/zed_node/left/image_rect_color2 /zed2/zed_node/right/image_rect_color2 --models pinhole-radtan  pinhole-radtan --target /home/ipsg/dataset/checkboard.yaml --bag-from-to 5 140 --show-extraction --approx-sync 0.04
    

    左目标定结果为:

    cam0:
      cam_overlaps: []
      camera_model: pinhole
      distortion_coeffs: [-0.04146142113155779, 0.040207379741452436, 0.00058191919155336,
        2.6184399452903757e-05]
      distortion_model: radtan
      intrinsics: [264.1544476767924, 265.6303085861438, 357.12188690735223, 167.47999407549506]
      resolution: [672, 376]
      rostopic: /zed2/zed_node/left/image_rect_color2
    

    注意:

    在最初运行标定时有报错,一直卡在提取角点这一步

    Initializing cam0:
        Camera model:      pinhole-radtan
        Dataset:          Kalib_data_vga.bag 
        Topic:            /zed2/zed_node/left/image_rect_color2
        Number of images: 1980
    Extracting calibration target corners
      Progress 19 / 1980     Time remaining: 9m
    

    解决办法为:

    单、双目:
    修改kalibr_calibrate_cameras.py文件中的多线程标签multithreading=multithreading改为multithreading=False

    observations = kc.extractCornersFromDataset(cam.dataset, cam.ctarget.detector,
    
                                                                                      multithreading=False, clearImages=False,
    
                                                                                      noTransformation=True)
    

    联合标定:

    修改IccSensors.py文件中的多线程标签multithreading=multithreading改为multithreading=False

    self.targetObservations = kc.extractCornersFromDataset(self.dataset, self.detector, multithreading=False)
    

    在执行单目标定、单目+IMU联合表定时会报错如下:

    Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance.
    Traceback (most recent call last):
      File "/home/ipsg/tool/kalibr_ws/devel/bin/kalibr_calibrate_cameras", line 15, in <module>
        exec(compile(fh.read(), python_script, 'exec'), context)
      File "/home/ipsg/tool/kalibr_ws/src/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 447, in <module>
        main()
      File "/home/ipsg/tool/kalibr_ws/src/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 204, in main
        graph.plotGraph()
      File "/home/ipsg/tool/kalibr_ws/src/aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/MulticamGraph.py", line 311, in plotGraph
        edge_label=self.G.es["weight"],
    KeyError: 'Attribute does not exist'
    
    

    解决办法:

    找到工作空间下src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras中的如下代码,然后注释掉

    if not graph.isGraphConnected(): 
        obsdb.printTable() 
        print "Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance." 
        graph.plotGraph() 
        sys.exit(-1)
    

    注释掉之后便可以得出标定结果。

    修改以上信息之后,便可以顺利运行。

    4、IMU参数标定

    单独录制IMU数据,数据包录制我录制了两个多小时,录制过程中必须保持相机静止不动。

     rosbag record -O imu_calibration /zed2/zed_node/imu/data_raw
    
    

    根据imu_utils文件夹里面的A3.launch改写ZED2标定启动文件:ZED2_calibration.launch注意,max_time_min对应的参数,默认是120,意味着两个小时,如果数据录制时间超过两小时可以不用修改,如果不足,这个时间值要改为略小于真实时间。我的内容如下:

    <launch>
        <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
            <param name="imu_topic" type="string" value= "/zed2/zed_node/imu/data_raw"/>
            <param name="imu_name" type="string" value= "ZED2"/>
            <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
            <param name="max_time_min" type="int" value= "120"/>
            <param name="max_cluster" type="int" value= "200"/>
        </node>
    </launch>
    

    启动标定:

    roslaunch imu_utils ZED2_calibration.launch
    
    

    回访数据包,以200Hz的速率回放:

    rosbag play -r 200 imu_calibration.bag  
    
    

    最后可以得到标定结果文件:/home/ipsg/tool/utils_ws/src/imu_utils/data/ZED2_imu_param.yaml

    %YAML:1.0
    ---
    type: IMU
    name: ZED2
    Gyr:
       unit: " rad/s"
       avg-axis:
          gyr_n: 1.8222305208357593e-03
          gyr_w: 3.7133721747382378e-05
       x-axis:
          gyr_n: 2.1821037744825752e-03
          gyr_w: 4.3929681760916831e-05
       y-axis:
          gyr_n: 1.6623543812424751e-03
          gyr_w: 4.1416410773020793e-05
       z-axis:
          gyr_n: 1.6222334067822277e-03
          gyr_w: 2.6055072708209496e-05
    Acc:
       unit: " m/s^2"
       avg-axis:
          acc_n: 1.9690445544535126e-02
          acc_w: 5.2966882234280319e-04
       x-axis:
          acc_n: 2.0618609665773655e-02
          acc_w: 5.4447136705058940e-04
       y-axis:
          acc_n: 1.7485637447877407e-02
          acc_w: 6.3371577751311896e-04
       z-axis:
          acc_n: 2.0967089519954317e-02
          acc_w: 4.1081932246470108e-04
    

    5、执行相机+IMU联合标定

    利用步骤2中录制的数据包,执行标定,需要准备cam.yaml及imu.yaml文件,cam.yaml为单双目输出的标定文件,本次标定仅对左目标定,使用如下:

    cam0:
      cam_overlaps: []
      camera_model: pinhole
      distortion_coeffs: [-0.04146142113155779, 0.040207379741452436, 0.00058191919155336,
        2.6184399452903757e-05]
      distortion_model: radtan
      intrinsics: [264.1544476767924, 265.6303085861438, 357.12188690735223, 167.47999407549506]
      resolution: [672, 376]
      rostopic: /zed2/zed_node/left/image_rect_color2
    

    imu.yaml信息由步骤4中的IMU标定结果得出,取标定结果Acc及Gyr的平均值填入imu.yaml文件,得如下内容:

    #Accelerometers
    accelerometer_noise_density: 1.96e-02   #Noise density (continuous-time)
    accelerometer_random_walk:   5.29e-04   #Bias random walk
    
    #Gyroscopes
    gyroscope_noise_density:     1.82e-03   #Noise density (continuous-time)
    gyroscope_random_walk:       3.71e-05   #Bias random walk
    
    rostopic:                    /zed2/zed_node/imu/data_raw2   #the IMU ROS topic
    update_rate:                 200.0      #Hz (for discretization of the values above)
    

    除了使用自己标定的IMU参数信息,也可以直接使用官网上提供的该参数,经验证,标定过后也是可以在系统中运行的,其给定的参数为(IMU rate及topic需要修改):

    #Accelerometers
    accelerometer_noise_density: 1.4e-03   #Noise density (continuous-time)
    accelerometer_random_walk:   8.0e-05   #Bias random walk
     
    #Gyroscopes
    gyroscope_noise_density:     8.6e-05   #Noise density (continuous-time)
    gyroscope_random_walk:       2.2e-06   #Bias random walk
     
    rostopic:                    /zed2/zed_node/imu/data_raw      #the IMU ROS topic
    update_rate:                 400.0     #Hz (for discretization of the values above)
    

    执行联合标定:

    kalibr_calibrate_imu_camera \
        --target /home/ipsg/dataset/checkboard.yaml \
        --bag /home/ipsg/ZED2_WS/Kalib_data_vga.bag \
        --bag-from-to 10 130 \
        --cam /home/ipsg/tool/kalibr_ws/cam.yaml \
        --imu /home/ipsg/tool/kalibr_ws/imu.yaml \
        --imu-models scale-misalignment \
        --timeoffset-padding 0.1
    

    可得标定结果为camchain-imucam-homeipsgZED2_WSKalib_data_vga.yaml,如下:

    cam0:
      T_cam_imu:
      - [0.010461959926441555, -0.9997613415836004, -0.019178302048279805, 0.0261061220321363]
      - [-0.04841582739273925, 0.01865039796109419, -0.9986531281249599, 0.004580655437468762]
      - [0.9987724741162884, 0.011376402368514227, -0.04820915283196389, -0.06740069267783835]
      - [0.0, 0.0, 0.0, 1.0]
      cam_overlaps: []
      camera_model: pinhole
      distortion_coeffs: [-0.04146142113155779, 0.040207379741452436, 0.00058191919155336,
        2.6184399452903757e-05]
      distortion_model: radtan
      intrinsics: [264.1544476767924, 265.6303085861438, 357.12188690735223, 167.47999407549506]
      resolution: [672, 376]
      rostopic: /zed2/zed_node/left/image_rect_color2
      timeshift_cam_imu: 0.001248879099353284
    

    二、使用ZED2运行VINS-mono

    修改realsense_color_config.yaml文件
    1、订阅topics修改

    imu_topic: "/zed2/zed_node/imu/data_raw"
    image_topic: "/zed2/zed_node/left/image_rect_color"
    

    2、左目相机内参修改

    model_type: PINHOLE
    camera_name: camera
    image_width: 672
    image_height: 376
    distortion_parameters:
       k1: 0
       k2: 0
       p1: 0
       p2: 0
    projection_parameters:
       fx: 264.154447
       fy: 265.630308
       cx: 357.121886
       cy: 167.479994
    

    这里使用的是校正后的图像,故设置畸变系数均为0;

    3、IMU至cam的变换矩阵,参数修改为2,使用在线标定(设置为0,使用已有的标定参数也是可以运行的):

    # Extrinsic parameter between IMU and Camera.
    estimate_extrinsic: 2   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                            # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
                            # 2  Don't know anything about extrinsic parameters. You don't need to give R,T. We will try to calibrate it. Do some rotation movement at beginning.                        
    #If you choose 0 or 1, you should write down the following matrix.
    
    

    4、IMU参数,使用VINS-mono中给定的参数

    #imu parameters       The more accurate parameters you provide, the better performance
    acc_n: 0.2          # accelerometer measurement noise standard deviation. #0.2
    gyr_n: 0.05         # gyroscope measurement noise standard deviation.     #0.05
    acc_w: 0.02         # accelerometer bias random work noise standard deviation.  #0.02
    gyr_w: 4.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5
    g_norm: 9.80       # gravity magnitude
    
    

    5、不需要在线估计同步时差

    #unsynchronization parameters
    estimate_td: 0                      # online estimate time offset between camera and imu
    td: 0.000                           # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)
    
    

    6、相机改为全局曝光

    #rolling shutter parameters
    rolling_shutter: 0                      # 0: global shutter camera, 1: rolling shutter camera
    rolling_shutter_tr: 0               # unit: s. rolling shutter read out time per frame (from data sheet). 
    
    

    7、开始运行

    roslaunch zed_wrapper zed2.launch
    roslaunch vins_estimator realsense_live.launch 
    roslaunch vins_estimator vins_rviz.launch
    

    结果如下:
    在这里插入图片描述

    参考链接:
    https://blog.csdn.net/u011178262/article/details/83316968
    https://blog.csdn.net/fb_941219/article/details/104709049
    https://blog.csdn.net/u010590316/article/details/89297324
    https://zhuanlan.zhihu.com/p/268825840
    https://blog.csdn.net/weixin_44580210/article/details/89789416

    展开全文
  • 标定ZED2相机

    2020-11-14 21:22:42
    标定ZED2相机 1.安装kalibr 参考:https://github.com/ethz-asl/kalibr/wiki/installation. 2.配置ros source devel/setup.bash 3.标定ZED2 打开终端,启动ZED2摄像头。 roslaunch zed_wrapper zed2.launch 再...

    标定ZED2相机

    1.安装kalibr

    参考:https://github.com/ethz-asl/kalibr/wiki/installation.

    2.配置ros

       source devel/setup.bash
    

    3.标定ZED2

    打开终端,启动ZED2摄像头。

       roslaunch zed_wrapper zed2.launch
    

    再打开一个终端,启动左右摄像头可视化功能,以确保将标定板保持在相机范围内。

       rosrun image_view image_view image:=/zed2/zed_node/left/image_rect_color & rosrun image_view image_view image:=/zed2/zed_node/right/image_rect_color 
    

    再打开一个终端,kalibr处理标定数据时要求图像的频率合适,所以降低图像数据到20HZ。

    rosrun topic_tools throttle messages /zed2/zed_node/left/image_rect_color 20 /zed2/zed_node/left/image_rect_color2
    rosrun topic_tools throttle messages /zed2/zed_node/right/image_rect_color 20 /zed2/zed_node/right/image_rect_color2
    

    再打开一个终端,然后用ZED2录制要标定的数据(视频)。

       rosbag record -O Kalibr_cyx_data.bag /zed2/zed_node/imu/data_raw /zed2/zed_node/left/image_rect_color /zed2/zed_node/right/image_rect_color
    

    查看记录的数据。

    rosbag info Kalibr_cyx_data.bag
    

    获取相机参数。

    kalibr_calibrate_cameras --bag Kalibr_cyx_data.bag --topics /zed2/zed_node/left/image_rect_color /zed2/zed_node/right/image_rect_color --models pinhole-radtan pinhole-radtan --target checkboard.yaml
    

    checkboard.yaml文件要根据标定板去看哦。下面是我这边的标定板的参数,你可以对应修改(行数、列数、每个个小方块的边长)。

    target_type: 'checkerboard' #gridtype
    targetCols: 8               #number of internal chessboard corners
    targetRows: 11               #number of internal chessboard corners
    rowSpacingMeters: 0.03      #size of one chessboard square [m]
    colSpacingMeters: 0.03      #size of one chessboard square [m]
    

    最后,将会得到camchain-Kalibr_cyx_data.yaml和校准结果的完整PDF报告,完毕。

    展开全文
  • 远程工控机ip:192.168.8.146 nvidia agx ip:192.168.8.125 目的使用工控机远程连接nvidia agx使用ZED2相机 <p>1、使用SSH增加图形界面 根据网上的步骤设置服务端和客户端的SSH配置文件 <p><img alt="" height=...
  • ZED2相机标定

    2021-05-01 11:43:16
    这里参考ZED2相机标定及运行VINS-mono 先打开一个终端 roscore 第二个终端,准备接收话题,注意这里接收的话题不是zed_wrapper发布的话题。录制结果保存在终端所在文件夹,结果文件名为Kalib_data_vga.bag。 这里...

    一、概述

    在运行视觉SLAM程序时,总会要求输入一个校正文件。这次的目的就是要把里头的参数全部填满。需要标定的参数包括:相机内参fx,fy,cx,cy;相机镜头畸变k1,k2,p1,p2;IMU陀螺仪偏移,加速度计偏移;大概就这些。

    二、录制数据集

    这里使用的相机是zed-sdk相机。
    标定流程:
    1、打印标定板
    标定板可以找合适的下载。标定板下载地址

    2、录制视频
    用zed相机自带tools,录制一段视频,视频会保存为svo文件。

    3、安装Kalibr
    zed相机自带标定程序(ubuntu默认在/usr/local/zed/tools里),这里是想和kalibr对比效果。Kalibr下载地址

    4、安装zed-ros-wrapper
    下载地址

    5、视频打包
    这里是指把zed录好的svo文件打成bag包,方便处理。
    这里参考ZED2相机标定及运行VINS-mono
    先打开一个终端

    roscore
    

    第二个终端,准备接收话题,注意这里接收的话题不是zed_wrapper发布的话题。录制结果保存在终端所在文件夹,结果文件名为Kalib_data_vga.bag。
    这里还有一点,就是zed相机里有几个话题和原始图像对应,比如:
    /zed2/zed_node/left/image_rect_color,这个话题也可以使用:分辨率没有发生变化,但是是对原始图像进行边缘裁剪后拉伸,这可能会导致丢失信息。

    rosbag record -O Kalib_data_vga.bag \
    /zed2/zed_node/imu/data_raw2 \
    /zed2/zed_node/left_raw/image_raw_color2 \
    /zed2/zed_node/right_raw/image_raw_color2
    

    第三个终端,意外发现,原因不明,总之是为了让程序发布imu数据,不用imu可以无视。

    rosrun rviz rviz
    

    打开rviz以后,添加PointCloud2,Topic填为

    /zed2/zed_node/point_cloud/cloud_registered
    

    订阅了这个话题以后,就能正常接收imu数据了。还可以添加Image之类的,确保正常录制。

    第四、五、六个终端,修改消息发布频率。
    因为zed相机通常以60Hz左右的频率进行录制,而kalibr标定又要求频率不能过高,因此要降低原话题发布频率,参考降低图像数据到20Hz,IMU数据至200Hz,ros的做法是先订阅,然后重新发布。

    rosrun topic_tools throttle messages /zed2/zed_node/imu/data_raw  200 /zed2/zed_node/imu/data_raw2
    rosrun topic_tools throttle messages /zed2/zed_node/left/image_rect_color 20 /zed2/zed_node/left/image_rect_color2
    rosrun topic_tools throttle messages /zed2/zed_node/right/image_rect_color 20 /zed2/zed_node/right/image_rect_color2
    

    第七个终端,zed_wrapper发布话题,因为要用到imu,所以运行zed2.launch,等待录制完毕。

    roslaunch zed_wrapper zed2.launch svo_file:=/path/to/xx.svo
    

    用我的电脑一般需要重复录制两三遍,才能确认流畅录制,原因不明。

    三、相机标定

    在kalibr文件夹下,执行单目标定,其中的checkboard.yaml表示同标定板一起下下来的参数文件。
    第一个终端

    roscore
    

    第二个终端

    source devel/setup.bash
    
    kalibr_calibrate_cameras \ 
    --bag /path/to/xxx.bag \
    --topics /zed2/zed_node/left/image_rect_color2 \
    --models pinhole-radtan  \
    --target /path/to/checkboard.yaml
    

    四、IMU标定

    1、安装imu_utils
    下载地址

    2、录制IMU数据
    这里按照默认值需要录制两个小时的IMU数据,imu也不能动。参考ZED2相机标定及运行VINS-mono,录制结果保存在终端所在文件夹,结果文件名为imu_calibration.bag。

    rosbag record -O imu_calibration /zed2/zed_node/imu/data_raw
    

    3、标定
    在imu_utils文件夹下打开终端,这里的ZED2_calibration.launch通过需要修改A3.launch得到。

    source devel/setup.bash
    roslaunch imu_utils ZED2_calibration.launch
    

    这里表示按照0.5倍速播放bag,可以按照需要修改,不过尽量保证播放频率为400Hz。

    rosbag play -r 0.5 imu_calibration.bag 
    

    五、相机IMU联合标定

    这里会用到之前标定的结果,总之需要把相机和IMU的标定结果填到两个yaml文件里,文件格式参考https://github.com/ethz-asl/kalibr/wiki/yaml-formats
    不过相机的yaml文件可以直接用,文件在kalibr文件夹下;imu_utils得到的结果直接用avg-axis就可以。
    执行联合标定

    kalibr_calibrate_imu_camera \
        --target /path/to/checkboard.yaml \
        --bag /path/to/xxx.bag \
        --cam /path/to/cam.yaml \
        --imu /path/to/imu.yaml \
    

    顺便一提,–imu-models scale-misalignment表示在bias+noise的模型基础上考虑scale和misalignment参数,zed相机可能用不上,参考【泡泡传感器评测】小觅双目摄像头D1000-IR-120/Color模组评测(中)

    展开全文
  • ubuntu18.04 ZED2相机标定

    2021-04-27 11:11:06
    参考:Ubuntu下ZED2 SDK使用及开发环境配置\ 1.1 驱动下载 cuda 11.1下载 安装cuda11.1 我第一次是按照教程安装的cuda10.2,但是报错了,在后面启动相机的时候ERROR,经查询可能是cuda版本问题。 wget ...
  • yolov4使用zed2相机问题

    2021-06-05 21:55:46
    <p style="text-align:center"><img...利用zed-yolo提供的代码可以进行实时的目标检测但是没办法使用gpu,还有就是没有办法读取.svo文件,只要读取文件便会出现上图的错误。希望可以有大佬帮忙解决一下</p>
  • 标定ZED2的过程中发现IMU的发布频率不稳定,而且在用display_zed2.launch时深度图开启与否严重影响IMU的发布频率。与官方的客服进行沟通后得到的解释如下: The IMU data is always published at maximum frequency...
  • 1、下载orbslam2 git clone https://github.com.cnpmjs.org/raulmur/ORB_SLAM2.git 2、下载数据集 链接: https://pan.baidu.com/s/1cmPaJF84NNNPMXosds70Zg 提取码: fpje 3、配置环境 pangolin安装方法 先安装依赖 ...
  • 数据记录 启动zed2相机 roslaunch zed_wrapper zed2.launch 启用左右摄像头可视化功能,以确保将标定板保持在相机范围内。参考Youtube视频:...
  • ZED双目相机开发

    千次阅读 2019-06-02 16:40:13
    平台环境硬件 Jetson TX2 Ubuntu16.04 ROS-Kinetic ZED双目相机 一、UbuntuSDK安装与运行 ...ros与深度相机入门教程-在ROS使用zed双目相机 编译报错,上一步提示有最新版本,安装最新版SDK后编译通过 ...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 166
精华内容 66
关键字:

zed2相机