\quad
\quad
\quad
\quad
\quad
\quad
\quad
General, Single-shot, Target-less, and Automatic LiDAR-Camera Extrinsic Calibration Toolbox
\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad Author : Dr. Kenji Koide
\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad Github:koide3/direct_visual_lidar_calibration
全自动无目标单次拍摄通用激光雷达-相机外参标定工具箱
摘要
\quad \quad 本文提出了一款开源的LiDAR-相机标定工具箱,该工具箱适用于各种LiDAR和相机投影模型,仅需一次LiDAR和相机数据配对,无需标定目标,并且实现了完全自动化。为实现自动初始猜测估计,我们采用了SuperGlue图像匹配流程,在LiDAR和相机数据之间找到2D-3D对应关系,并通过RANSAC估计LiDAR-相机的变换矩阵。基于初始猜测,我们利用基于归一化信息距离(一种基于互信息的跨模态距离度量)的直接LiDAR-相机配准来优化变换矩阵估计。为了方便标定过程,我们还提供了多种辅助功能(如动态LiDAR数据集成和用于手动创建2D-3D对应关系的用户界面)。实验结果表明,该工具箱能够标定任意组合的旋转扫描和非重复扫描LiDAR以及针孔相机和全向相机,并在标定精度和鲁棒性方面优于现有的基于边缘对齐的标定方法。
I. 引言
\quad
\quad
LiDAR-相机外参标定是估计LiDAR与相机坐标系之间变换矩阵的任务。这是实现LiDAR-相机传感器融合的必要步骤,并广泛应用于自动驾驶车辆定位、环境建图以及周边物体识别等领域。
\quad
\quad
尽管在过去十年间,LiDAR-相机标定得到了广泛研究,但机器人学界仍然缺乏一款便捷且全面的LiDAR-相机标定工具箱。现有的标定框架往往需要准备一个标定目标(这一过程有时难以实现)[1],需要多次采集LiDAR-相机数据(增加了工作量)[2],或必须选择几何特征丰富的环境[3]。此外,这些框架通常无法支持多种LiDAR和相机投影模型,如旋转扫描和非重复扫描的LiDAR,以及超广角和全向投影相机。我们认为,缺乏易于使用的LiDAR-相机标定方法,长期以来阻碍了LiDAR-相机传感器融合系统的开发。
\quad \quad 为服务于机器人学界,我们提出了一款全新的全面LiDAR-相机标定工具箱,具有以下特点:
- 通用性:该工具箱独立于传感器模型,可处理各种LiDAR和相机投影模型,包括旋转扫描、非重复扫描的LiDAR,以及针孔、鱼眼和全向投影相机(如图1(a)所示)。
- 无标靶:无需标定目标,而是利用环境结构和纹理进行标定。
- 单次采集:标定最低仅需一次LiDAR点云与相机图像的配对,用户也可选择使用多个数据对以提高标定精度。
- 自动化:系统集成了基于SuperGlue [4]的跨模态2D-3D对应匹配算法,用于初始猜测估计,实现全自动标定过程。
- 精准且鲁棒:采用像素级的直接LiDAR-相机配准算法,即使在几何特征不丰富的环境中(传统的基于边缘对齐的算法[3]可能失败),只要LiDAR与相机数据之间存在互信息,该方法也能稳健且精准地完成标定。
\quad \quad 据我们所知,目前尚无开源实现能够同时具备上述特性。我们相信,这款工具箱的发布将对机器人学界带来重要益处。
本文的主要贡献如下:
- 提出了一种基于2D-3D对应估计的稳健初始猜测算法。借助基于图神经网络的图像匹配技术[4],我们通过虚拟相机生成LiDAR强度图像,并在LiDAR强度图像与相机图像之间找到对应关系。随后,利用RANSAC和重投影误差最小化估计LiDAR-相机变换。
- 为实现稳健且精确的标定,我们结合了基于归一化信息距离(NID,一种基于互信息的跨模态距离度量)的直接LiDAR-相机精细配准算法,以及视图基准的隐藏点移除算法,用于过滤掉从相机视角不可见的点。
- 整个系统的设计充分考虑了LiDAR与相机投影模型的通用性,能够适应各种传感器模型。
- 将所开发方法的代码开源,以造福学术社区。 Github:koide3/direct_visual_lidar_calibration
II. 相关工作
\quad \quad LiDAR-相机外参标定方法可分为三类:1)基于标定目标的方法;2)基于运动的方法;3)基于场景的方法。
A. 基于标定目标的标定
\quad
\quad
与广为人知的相机内参标定过程类似,基于标定目标的方法是进行LiDAR-相机外参标定的最自然途径。一旦获得了标定目标上的3D点坐标及其在图像中的2D投影坐标,就可以通过解决Perspective-n-Point问题轻松估计LiDAR-相机的变换矩阵。然而,设计和制作能够被LiDAR和相机同时稳健且精确检测的标定目标往往很困难。一些研究使用了三维结构的标定目标,但这些目标并不像棋盘格图案那样容易制作[5][6]。尽管有些研究采用了容易制作的平面图案,但它们需要对LiDAR数据进行手动标注[7],并且需要多次数据采集,增加了大量工作量[8]。
B. 基于运动的标定
\quad
\quad
类似于手眼标定问题(Hand-Eye Calibration Problem),可以根据刚体上两个坐标系的运动估计它们之间的变换矩阵[9]。这种方法能够轻松处理异质传感器,并且不需要传感器之间有重叠区域[10]。然而,这种方法需要精确的时间同步,而在使用经济型网络摄像头等设备时,这并非总是可行。此外,为了获得更好的标定结果,还需要尽可能准确地估计每个传感器的运动。
C. 基于场景的标定
\quad
\quad
基于场景的方法通过分析LiDAR点云与相机图像对之间的一致性来估计LiDAR-相机变换矩阵。LiDAR点被投影到图像空间,随后利用某些度量标准计算它们与像素值之间的一致性。
\quad \quad 类似于视觉里程计估计问题,LiDAR-相机数据一致性评估有两种主要方法:间接方法和直接方法。
\quad \quad 间接方法首先从相机和LiDAR数据中提取特征点(如边缘点),然后计算2D-3D对应点之间的重投影误差[3][11][12]。尽管这种方法依赖于辨别性强的特征和稳健的对应关系创建,因此具有良好的收敛性,但它需要几何特征丰富的环境来提取足够的特征点。此外,由于这种方法丢弃了环境表面的大部分纹理信息,其精度不及直接方法。
\quad \quad 直接方法则直接比较像素和点的强度值。然而,由于LiDAR和相机的强度分布通常非常不同,简单地比较它们的差异在实际中并不可行。为了克服这种模态差异,基于互信息(MI)的度量被用于LiDAR-相机数据比较[13][14]。这种方法不直接比较LiDAR和图像强度值的差异,而是考虑它们的共现性,从而可以稳健地测量LiDAR与相机强度值之间的一致性。按照[15][16],我们使用了从MI导出的归一化信息距离(NID)度量,使其满足度量空间公理,比MI更为鲁棒[15]。
III. 方法
A. 概述
\quad
\quad
图2展示了提出的LiDAR-相机标定工具箱的总体框架。
\quad
\quad
为了用统一的处理流程处理不同的LiDAR模型,我们首先通过合并多个LiDAR帧创建一个密集点云。对于非重复扫描LiDAR(如Livox Avia),通过累积点数据来增强点云密度;对于旋转扫描LiDAR(如Velodyne和Ouster LiDAR),则使用基于连续时间ICP的动态点云集成技术[17]。
\quad
\quad
接下来,从配对的密集点云和相机图像中,通过SuperGlue [4]估计的2D-3D对应关系获得LiDAR-相机初步变换矩阵估计。为了安全起见,还提供了直观的用户界面,用于手动创建对应关系。在获取2D-3D对应关系后,通过RANSAC和重投影误差最小化计算LiDAR-相机初始变换矩阵。
\quad
\quad
在初始估计基础上,我们应用基于视角的隐藏点移除,去除相机视角不可见的LiDAR点。随后,使用基于归一化信息距离(NID)的精确LiDAR-相机配准进一步优化变换矩阵估计。
B. 符号说明
\quad \quad 我们的目标是通过配对的LiDAR点云 P i = [ L p 1 , ⋯ , L p N ] \boldsymbol{P}_{i} = [{}^{L}\boldsymbol{p}_{1}, \cdots, {}^{L}\boldsymbol{p}_{N}] Pi=[Lp1,⋯,LpN] (带有对应点强度 L i = [ l 1 , ⋯ , l N ] \mathcal{L}_{i} = [l_{1}, \cdots, l_{N}] Li=[l1,⋯,lN])和相机图像 I i ( x j ) = y j \mathcal{I}_{i}(\boldsymbol{x}_{j}) = y_{j} Ii(xj)=yj(其中 x j ∈ R 2 \boldsymbol{x}_{j} \in \mathbb{R}^{2} xj∈R2 是像素坐标, y j y_{j} yj 是像素强度)来估计LiDAR和相机坐标系之间的变换矩阵 C T L {}^{C}\boldsymbol{T}_{L} CTL。LiDAR坐标系中的点 L p j {}^{L}\boldsymbol{p}_{j} Lpj 通过 C T L {}^{C}\boldsymbol{T}_{L} CTL 变换到相机坐标系中的点 C p j = C T L L p j {}^{C}\boldsymbol{p}_{j} = {}^{C}\boldsymbol{T}_{L} {}^{L}\boldsymbol{p}_{j} Cpj=CTLLpj,并使用投影函数 π \pi π 投影到图像空间; x j = π ( C p j ) \boldsymbol{x}_{j} = \pi({}^{C}\boldsymbol{p}_{j}) xj=π(Cpj)。在本文中,我们主要采用了传统径向畸变针孔相机模型以及全向等距矩形相机模型 [18] 作为投影函数。注意,其他主要相机模型,包括 ATAN [19]、鱼眼相机模型 [20] 和统一全向相机模型 [21],已经在工具箱中实现并提供支持。
C. 预处理
\quad
\quad
旋转式 LiDAR(例如 Ouster OS1-64)展现出稀疏且重复的扫描模式,仅通过单次扫描很难提取有意义的几何和纹理信息(见图 3 (a))。对于这样的 LiDAR,我们通过上下方向移动 LiDAR 几秒钟,并在补偿视点变化和点云失真的同时累积点云数据。
\quad
\quad
为了估计 LiDAR 的运动,我们使用CT-ICP 算法,该算法通过最小化当前 LiDAR 扫描与参考点云之间的距离,联合优化扫描起点和终点的 LiDAR 位姿。为了高效地利用过去的观测数据创建目标点云,我们采用了线性 iVox [22] 结构,它通过为每个体素(voxel)线性存储点云数据来简化操作。基于估计的扫描起点和终点的 LiDAR 位姿,我们对输入点云进行运动失真校正,并将所有点累积到第一个扫描的坐标系中,生成一个稠密点云。图 3 (b) 展示了应用该动态 LiDAR 点云集成过程后得到的稠密点云。可以看到,稠密点云呈现出丰富的几何和纹理信息,而这些信息在单次扫描的点云中难以观察到。
\quad
\quad
对于具有非重复扫描机制的 LiDAR(例如 Livox Avia),我们简单地将所有扫描累积到一个坐标系中,从而得到一个稠密点云,如图 1 (b) 所示。
\quad
\quad
对于稠密点云和相机图像,我们应用直方图均衡化,因为在精细配准步骤中使用的 NID 指标在均匀强度分布的条件下效果最佳。
D. 初始估计
\quad
\quad
为了粗略估计LiDAR-相机变换矩阵,我们首先从输入图像和点云中提取2D-3D对应关系,然后通过RANSAC和重投影误差最小化估计LiDAR-相机变换。
\quad
\quad
为了利用基于图神经网络的图像匹配流程[4],我们通过虚拟相机模型从密集点云生成LiDAR强度图像。为选择最佳投影模型以渲染整个点云,我们首先利用Quickhull算法[23]提取输入点云的凸包,并通过暴力搜索找到凸包中角度距离最大的点对。如果LiDAR的估计视场(FoV)小于150°,则使用针孔投影模型创建虚拟相机;否则,使用等距矩形投影模型创建虚拟相机。利用虚拟相机,我们将点云渲染为强度图像(如图4所示)。同时生成点索引图,以便在后续的位姿估计步骤中高效查找像素级的3D坐标。虽然每个点的渲染过程中未进行插值和填补空隙,但由于点云的高密度累积,渲染结果具有良好的外观质量。
\quad
\quad
虚拟相机建模(图4):使用虚拟相机渲染的 LiDAR 强度图像(由于空间限制,图像被裁剪)。根据 LiDAR 的视场角(FoV),选择针孔投影模型或等矩长方形投影模型。
\quad
\quad
为了在LiDAR和相机强度图像之间找到对应关系,我们使用SuperGlue流程[4]。SuperGlue首先使用SuperPoint[24]在图像上检测关键点,然后通过图神经网络在关键点之间找到对应关系。本研究中使用了在MegaDepth数据集上预训练的权重。虽然SuperGlue可以在不同模态的图像之间找到对应关系,但我们发现匹配阈值需要设置得非常低(例如0.05),以获得足够数量的对应关系。然而,在此设置下,我们观察到许多错误对应关系的生成(如图5所示)。
\quad
\quad
SuperGlue匹配(图5):SuperGlue 能够在不同模态的 LiDAR 图像和相机图像之间找到对应关系,即使在非常低的匹配阈值设置下也可以。然而,结果中包含许多错误的对应关系,这些需要在位姿估计之前进行过滤。(绿色:内点,红色:外点)
\quad
\quad
给定二维关键点坐标
K
=
[
x
1
K
,
…
,
x
M
K
]
\mathcal{K} = \left[ x_1^K, \dots, x_M^K \right]
K=[x1K,…,xMK] 和对应的在 LiDAR 坐标系中的三维坐标
D
=
[
L
p
1
K
,
…
,
L
p
M
K
]
\mathcal{D} = \left[ {}^L\!p_1^K, \dots, {}^L\!p_M^K \right]
D=[Lp1K,…,LpMK],我们首先执行仅旋转的 RANSAC(在算法 1 中描述),以稳健地处理异常对应关系。将估计的旋转矩阵作为初始值,我们随后通过最小化所有关键点的重投影误差,使用 Levenberg-Marquardt 优化器获得 6 自由度的 LiDAR-相机变换矩阵
C
T
~
L
{}^C\!\tilde{T}_L
CT~L。
\quad \quad 其中, ( ρ ) (\rho) (ρ)是Cauchy鲁棒核函数。
E. 基于NID的直接LiDAR-相机配准
\quad
\quad
由于视点的差异,LiDAR 点云中的一些点可能会被遮挡而无法从相机中看到。如果我们简单地投影所有 LiDAR 点,这些点可能会导致错误的对应关系,从而影响标定结果,如文献 [3] 所讨论。为了避免这个问题,我们应用了一种基于视点的高效隐藏点移除方法,用于过滤出从相机视点不可见的 LiDAR 点。利用当前估计的 LiDAR-相机变换矩阵,我们将 LiDAR 点投影到图像中,并对每个像素仅保留具有最小距离的点(即深度缓冲测试)。从仅保留相机可见点的投影图像中,我们获取一个 3D 点云,并将其用于精细配准。
\quad
\quad
随后,我们基于 NID 指标 [15] 执行直接 LiDAR-相机配准。为了计算 NID,我们将 LiDAR 点
L
p
j
∈
P
i
L_{p_j} \in P_i
Lpj∈Pi 转换到相机坐标系中,并将其投影到图像空间
x
j
=
π
(
C
T
L
L
p
j
)
x_j = \pi(C_T^L L_{p_j})
xj=π(CTLLpj)。通过 LiDAR 点的强度
l
j
l_j
lj 和对应像素的强度
I
i
(
x
j
)
I_i(x_j)
Ii(xj),我们构建了
P
(
L
i
)
P(L_i)
P(Li)、
P
(
I
i
)
P(I_i)
P(Ii) 和
P
(
L
i
,
I
i
)
P(L_i, I_i)
P(Li,Ii),分别表示 LiDAR 和像素强度的边缘直方图以及联合直方图,并计算它们的熵
H
(
L
i
)
H(L_i)
H(Li)、
H
(
I
i
)
H(I_i)
H(Ii) 和
H
(
L
i
,
I
i
)
H(L_i, I_i)
H(Li,Ii),公式如下:
H ( X ) = − ∑ x ∈ X p ( x ) log p ( x ) , (2) H(X) = - \sum_{x \in X} p(x) \log p(x), \tag{2} H(X)=−x∈X∑p(x)logp(x),(2)
\quad \quad 其中 x x x 是直方图中的每个区间(bin)。然后, L i L_i Li 和 I i I_i Ii 的 NID 定义如下:
N I D ( L i , I i ) = H ( L i , I i ) − M I ( L i ; I i ) H ( L i , I i ) , (3) NID(L_i, I_i) = \frac{H(L_i, I_i) - MI(L_i; I_i)}{H(L_i, I_i)}, \tag{3} NID(Li,Ii)=H(Li,Ii)H(Li,Ii)−MI(Li;Ii),(3)
M I ( L i ; I i ) = H ( L i ) + H ( I i ) − H ( L i , I i ) , (4) MI(L_i; I_i) = H(L_i) + H(I_i) - H(L_i, I_i), \tag{4} MI(Li;Ii)=H(Li)+H(Ii)−H(Li,Ii),(4)
\quad \quad 其中 M I ( L i ; I i ) MI(L_i; I_i) MI(Li;Ii) 是 L i L_i Li 和 I i I_i Ii 之间的互信息。通过使用 Nelder-Mead 优化器,我们找到能够最小化公式 (3) 的 LiDAR-相机变换矩阵。
\quad \quad 由于从相机可见的LiDAR点会随着LiDAR-相机变换矩阵的更新而变化,因此我们反复进行基于视图的隐藏点移除和基于NID的LiDAR-相机配准,直到变换矩阵更新的位移收敛。
IV. 实验
A. 实验设置
\quad \quad 我们测试了提出的标定工具箱,分别对旋转扫描和非重复扫描LiDAR(Ouster OS1-64和Livox Avia)与针孔和全向相机(Omron Sentech STC-MBS202POE和Kodak PixPro 4KVR360)的四种组合进行实验(见图6)。每种组合下,在室内和室外环境中采集了15对LiDAR点云和相机图像,逐对运行标定过程(即单次标定)。
\quad
\quad
为了获得参考,我们使用高反射率球形标靶进行标定(见图7)。通过手动标注标靶的2D和3D位置,估计LiDAR-相机的变换,从而最小化标靶重投影误差。经目视检查,确认估计的变换能够很好地描述相机投影。该估计结果作为“伪”地面真值。
B. 实验结果
- 针孔相机与Ouster LiDAR的标定
\quad \quad 表1总结了Ouster LiDAR和针孔相机的标定结果。初始估计的成功标准为平移误差小于0.5 m,旋转误差小于1.0°。实验中,提出的方法对15个数据对中的12个提供了合理的初始估计。对于初始估计失败的数据对(如数据集02,见图8),由于环境结构平坦且重复性高,导致对应关系包含许多错误匹配。对于失败的初始估计,我们手动标注了2D-3D对应关系,并重新估计了变换以评估精配准算法。精配准算法在所有数据对上表现良好,平均标定误差为0.043 m和0.374°,优于现有基于边缘对齐的标定方法[3],其误差为0.236 m和1.329°。
- 针孔相机与Livox LiDAR的标定
\quad \quad 如表2所示,提出的方法对所有数据对提供了成功的初始估计,精配准算法平均标定误差为0.069 m和0.724°,显著优于基于边缘对齐方法[3](0.323 m和3.497°)。
- 全向相机的标定
\quad \quad 表3总结了全向相机的标定结果。对于Ouster LiDAR,全向相机的初始估计成功率为100%(15/15),平均标定误差为0.069 m和0.724°。然而,对于Livox LiDAR,全向相机的初始估计成功率较低(10/15),平均标定误差为0.101 m和0.807°。这是由于LiDAR和相机的视场(FoV)差异较大,仅使用了相机图像的一小部分。此外,图像分辨率不足以在有限FoV内表现细微的环境细节。我们认为,通过使用更高分辨率或多张图像可以提高标定精度。
- 多数据标定
\quad \quad 我们对所有数据对进行了多数据标定,表4总结了结果。即使是视场差异较大的Livox和全向相机组合,标定误差也达到较好的水平(0.011 m和0.400°)。Ouster LiDAR与针孔相机的组合实现了最佳标定精度(0.010 m和0.132°),因为其视场相似,大部分输入数据被用于标定,而其他组合因视场差异导致部分点云和图像区域未被使用。
- 处理时间
\quad \quad 表5展示了每个标定步骤的处理时间。根据LiDAR和相机模型的组合,标定时间从74秒到249秒不等。Ouster LiDAR与全向相机组合由于两者均有360°视场,需投影大部分点云,因此耗时较长,但对于离线标定仍属合理范围。
C. 总结
\quad \quad 实验结果表明,提出的标定工具箱能够在各种传感器组合下实现高精度和高鲁棒性的标定,且优于现有的基于边缘对齐的方法,尤其是在视场不匹配或环境特征不足的情况下表现突出。
V. 结论
\quad \quad 我们开发了一款通用的LiDAR-相机标定工具箱。为了实现全自动标定过程,我们采用了基于图像匹配的初始估计方法,随后通过基于归一化信息距离(NID)的直接LiDAR-相机配准算法对初始估计进行优化。实验结果表明,该工具箱能够精准标定旋转扫描和非重复扫描LiDAR与针孔相机及全向相机之间的变换矩阵。
参考文献
声明:
\quad \quad Kenji Koide 博士是日本产业技术综合研究所(AIST)数字架构研究中心高级研究员
\quad \quad Dr. Kenji Koide及其团队成员是该论文的作者
\quad
\quad
本人通过RMUC 2024青工会首次认识到该LiDAR-相机联合标定工具,并在详细阅读思考该论文和开源项目后使用该标定工具完成了多次标定,实践证明了该标定工具相对于现有联合标定方法的绝对优越性,完美解决了传统标定方法的绝大多数痛点。在这期间也遇到了很多困难,查阅相关资料时发现该方法仍然鲜为人知,相关资料十分有限无法满足开发者快速上手的需求,特别是对于相关知识较为薄弱的开发者。
\quad
\quad
为了有更多从事相关工作的开发者了解到这种十分便捷有效的激光雷达相机联合标定方法,本人将该论文进行了准确翻译,然而本人水平有限可能无法做到绝对准确,如果您在阅读时发现了错误请及时联系我进行修改,您也可以查阅论文原文以获得绝对准确的指导。
\quad \quad 该译文已经征得Dr. Kenji Koide认可,相关问题本人已经向Dr. Kenji Koide进行过求证。
\quad \quad 如果您想转载该文章请务必声明Dr. Kenji Koide及其团队成员是原论文作者或引用原论文,以尊重Dr. Kenji Koide及其团队成员的研究成果。
\quad \quad 后续将为该标定工具以及标定过程撰写详细完整的教程。
\quad \quad 最后: