适用任何自然环境?Galibr:利用地平面和边缘,全自动、无靶标标定LiDAR和相机

适用任何自然环境?Galibr:利用地平面和边缘,全自动、无靶标标定LiDAR和相机

任何环境都能标?

LiDAR和相机的外参标定方法主要分为基于靶标的校准方法 (Target-based)和无靶标的校准方法(Target-less)。前者因为需要手动放置靶标和稳定的校准环境,特别是在自动驾驶中,部署这种基于靶标的方法的实用性受到限制。后者可以细分为基于边缘、基于LiDAR强度、互信息度量、基于豫东的方法、基于深度学习的方法等,先前工作由于不同的局限性,限制了其在不同环境中的实际应用。

image

附赠自动驾驶最全的学习资料和量产经验:链接

本文介绍的Galibr[1] 适应于任何自然环境,包括崎岖地形,并适用于所有地面移动平台。与依赖手动定义或环境特定特征的方法不同,Galibr引入了一种独特的方法,利用稳健的地面平面识别来提供新颖的初始猜测,从而确保了更通用和环境无关的初始校准。此外,Galibr通过实现一种新的边缘匹配方法来推进校准过程,这与现有方法中使用的直接特征比较或互信息度量不同。这种结合地面平面识别和复杂边缘匹配的双阶段过程,标志着现有无靶标校准方法的显著进步,提供了更强的适应性、精度和适用于多种操作环境的能力。

其主要贡献总结如下:

  • 提出了一种新颖的、完全自动化的、无靶标的LiDAR-摄像头外部校准方法,可以在任何自然环境中执行,应用于任何地面车辆平台和各种传感器设置。

  • 为了实现稳健且精确的校准,提出了一种使用地面平面的初始猜测估计算法,称为GP-init。来自地面的相对初始姿态估计提高了Galibr系统的性能。

  • 通过非地面物体的边缘提取和匹配,利用来自LiDAR和摄像头输入的详细边缘数据,提高了校准精度。

  • Galibr在非结构化自然环境中进行了测试,包括KITTI数据集和KAIST四足机器人数据集,展示了其卓越的性能和实用性。

具体方法

Galibr的标定过程要求平台在任何环境中运动以估计每个传感器的姿态。Galibr的整个系统由两个主要步骤组成:

  1. 利用地面平面的初始姿态估计步骤,称为GP-init,以及使用边缘匹配的外部校准步骤,如图2所示。GP-init包含地面特征提取模块和每个传感器从地面进行相对姿态估计的模块。

  2. 外参标定通过匹配从每个传感器提取的边缘来执行。

image

摄像头的GP-init

用于地面车辆姿态估计和地面平面提取的方法:集成了结构光运动(SfM)、基于RANSAC的地面平面估计、垂直对齐和相对姿态估计。

在此过程中,采用了SfM来提取3D地面特征,这对于估计摄像头的自运动是至关重要的。运动方向向量 �� 由标准化的增量位置向量 Δ�� 缩放而成:

image

在摄像头坐标中进行地面平面提取时,利用了通过SfM估计的3D地面特征,并采用RANSAC算法。通过最大化内点共识集,找到最佳平面参数 ��=[��,��,��,��]。

为了将机器人运动与地面平面对齐,使用从时间 ��1 到 ��2 的滑动窗口和阈值 �� 找到地面平面的法向量 ��:

image

此条件确保摄像头系统的运动与地面平面紧密对齐。这对于通过确保摄像头方向向量 �� 与地面平面法向量 �� 的点积保持在某一阈值以下来确认地面平面的平面性是至关重要的。这种方法有助于确认地面平面的平面性,表明摄像头的运动很好地与稳定、平坦的表面对齐。

地面与摄像头之间的相对姿态 ��� 包括缩放的平移 �� 和方位角 ������ 和 ������ℎ:

image

姿态 ��� 表示为 (���,���),其中 ��� 是旋转矩阵,��� 是从地面到摄像头的位置向量。

LiDAR的GP-init

在估计LiDAR相对于地面的相对姿态的方法中,LiDAR里程估计通过使用常速度模型的迭代误差状态卡尔曼滤波器(IESKF)开始。接下来,利用TRAVEL方法(这是最先进的地面和非地面分割方法)进行地面特征提取,从点云中区分地面和非地面点,并对非地面物体进行聚类。然后,使用RANSAC算法估计地面平面,确保LiDAR的运动方向与地面平面对齐。这一步包括在滑动窗口内保持地面平面法向量与LiDAR里程增量位置向量的点积低于预定阈值:

image

其中,�� 是LiDAR的运动方向向量,��=[��,��,��,��] 是LiDAR坐标中的地面平面参数,Δ�� 是LiDAR的增量位置向量,�� 表示对齐阈值。为了确保LiDAR系统的运动与地面平面紧密对齐,在滑动窗口内从时间 ��1 到 ��2 使用阈值 �� 找到地面平面的法向量 ��。使用TRAVEL方法从LiDAR提取的地面特征结果如图3(b)所示。

image

该过程最终通过相对姿态估计确定LiDAR相对于地面平面的姿态。表示LiDAR相对于地面的姿态的变换矩阵 ��� 由从地面到LiDAR的旋转 ��� 和从地面到LiDAR的位置 ��� 组成:

image

其中,��� 和 ��� 分别反映了从地面到LiDAR的旋转和位移组件。由此,GP-init阶段提供了一个初始猜测,包括估计每个传感器距地面的高度和方位角,特别是横滚角和俯仰角。

使用边缘匹配的外部校准

给定从地面到摄像头的变换矩阵 ��� 和从地面到LiDAR的变换矩阵 ���,可以估计从LiDAR到摄像头的初始相对姿态 ���。这是通过首先对从地面到LiDAR的变换进行求逆,以获得从LiDAR到地面的变换,然后将其与从地面到摄像头的变换进行连接来实现的。数学上可以表示为:

image

这个操作有效地链接了相对变换,将姿态从地面框架转换到LiDAR框架,然后从LiDAR框架转换到摄像头框架,从而得到所需的从LiDAR到摄像头的初始相对姿态。

初始相对姿态估计涉及计算变换矩阵 ���,表示LiDAR相对于摄像头的姿态。给定从LiDAR和摄像头到地面的变换矩阵 ��� 和 ���,可以通过以下公式得到 ���:

image

其中 (���)−1 表示从摄像头到地面的变换矩阵的逆,实际上重新定位了参考系,从地面到摄像头框架。

image

对于从LiDAR点云和图像中提取边缘,使用了现有最快的边缘提取方法ELSED进行图像边缘检测,并使用非地面分割的点云进行LiDAR边缘检测。边缘检测的示例如图4所示。LiDAR非地面物体被投影到图像平面上,使用初始相对姿态 ���,从而便于边缘点的识别。在从LiDAR点云中提取边缘时,必须注意图像中实际观测到的边缘可能与LiDAR检测到的边缘不完全对齐,如图5所示。

image

这种差异是因为大多数现有方法使用LiDAR视角中的边缘进行外参标定,这些边缘可能不会直接对应实际的图像边缘。为了解决这一问题,使用初始相对姿态 ��� 将LiDAR非地面物体投影到图像平面上,从而实现LiDAR检测到的边缘与实际图像边缘的更准确对齐和比较。投影公式如下:

image

其中 �� 和 �� 分别表示图像和LiDAR框架中的齐次坐标,� 表示摄像头的内参矩阵。

在外参标定优化过程中,目标是微调初始变换矩阵 ���,使LiDAR和摄像头框架对齐。最小化3D遮挡边缘点 ��� 投影到图像中对应的2D边缘线 ��� 的重投影误差。优化问题被表述为一个PnP(Perspective-n-Point)问题,表示如下:

image

这里,� 表示要优化的外参对应的Lie代数元素,�� 表示从点到线的垂直距离函数,�� 是一个鲁棒代价函数,如Huber核,它有助于减轻离群点的影响。投影 � 使用初始猜测 ��� 和更新后的变换 exp⁡(�) 将3D LiDAR点投影到2D图像平面上。使用Levenberg-Marquardt(LM)算法迭代解决此优化问题,直到收敛标准满足为止。结果是优化后的外部校准矩阵 ���∗,表示LiDAR和摄像头坐标系之间最准确的变换。

实验效果

image

image

image

image

image

总结一下

Galibr是一种基于地面平面初始化的快速且鲁棒的外参标定方法:

  • 特点:在任何环境和任何地面车辆平台上鲁棒性好。

  • 不足:仍然严重依赖于地面特征提取和边缘提取的结果。

因此未来的工作可能是:

  • 将此方法与IMU传感器结合起来,以校准多模态传感器,从而建立更通用和鲁棒的自动外参校准。

  • 通过可能采用自适应滤波等先进技术来增强LiDAR和摄像头的运动估计能力,以及改进匹配技术,以提高我们校准方法的整体性能。

参考

[1] Galibr: Targetless LiDAR-Camera Extrinsic Calibration Method via Ground Plane Initialization

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是圆形非对称靶标相机标定的Python代码,代码中有详细的注释说明: ```python import numpy as np import cv2 # 定义圆形非对称靶标的行列数和每个小格子的大小 rows = 6 cols = 9 square_size = 20 # 单位为毫米 # 生成标定板角点的世界坐标系坐标 objp = np.zeros((rows * cols, 3), np.float32) objp[:, :2] = np.mgrid[0:cols, 0:rows].T.reshape(-1, 2) * square_size # 存储所有的角点坐标 objpoints = [] # 世界坐标系中的坐标 imgpoints = [] # 图像坐标系中的坐标 # 读取所有标定图片并提取角点坐标 images = glob.glob('calibration_images/*.jpg') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 查找角点 ret, corners = cv2.findCirclesGrid(gray, (cols, rows), flags=cv2.CALIB_CB_ASYMMETRIC_GRID) # 如果找到了角点,则添加到objpoints和imgpoints中 if ret == True: objpoints.append(objp) imgpoints.append(corners) # 在图像上绘制角点 cv2.drawChessboardCorners(img, (cols, rows), corners, ret) cv2.imshow('img', img) cv2.waitKey(500) cv2.destroyAllWindows() # 进行相机标定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) # 打印标定结果 print("相机内参矩阵:\n", mtx) print("畸变系数:\n", dist) # 校正图像 img = cv2.imread('calibration_images/test_image.jpg') h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) dst = cv2.undistort(img, mtx, dist, None, newcameramtx) # 显示校正前后的图像 cv2.imshow('original', img) cv2.imshow('corrected', dst) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值