1.介绍

本文只介绍已知相机内参和外参的前提下,针对激光雷达坐标系到图像坐标系的转换关系做一个详细得解释(针对相机内参和外参的标定,可以私信)。

2.坐标系定义

2.1. 激光雷达坐标系(Lidar Frame,记为L系)

  • 原点:雷达机械旋转轴的物理中心;
  • X轴:正方向为雷达的正前方(机器人/车辆的前进方向);
  • Y轴:正方向为雷达的左侧(右手坐标系:X向前,四指从X向Z弯曲,大拇指指向Y轴正方向);
  • Z轴:正方向为垂直地面向上;
  • 单位:米(m),雷达点云的坐标值均以米为单位。

2.2. 相机坐标系(Camera Frame,记为C系)

针孔相机模型(OpenCV/KITTI通用)的标准定义为准:

  • 原点:相机的光心(镜头的光学中心);
  • X轴:正方向为相机的右侧(与图像的宽度方向一致);
  • Y轴:正方向为相机的下方(与图像的高度方向一致);
  • Z轴:正方向为相机的正前方(光轴方向,朝向拍摄的场景);
  • 单位:米(m),与雷达坐标系单位统一。

2.3. 关键:两个坐标系的核心差异(必记!)

轴方向雷达坐标系(L系)相机坐标系(C系)
正前方X轴正方向Z轴正方向
左右Y轴正方向=左X轴正方向=右
上下Z轴正方向=上Y轴正方向=下

3.坐标系的转换

激光雷达坐标系到图像坐标系之间的转换需要两步来实现,其具体流程为:

3.1 激光雷达 → 相机坐标系(外参)

首先是将激光雷达坐标系到相机坐标系的转换,其计算公式为:

P_{camera}=R\cdot P_{lidar}+T

其中:

  • $P_{lidar} = (X_l, Y_l, Z_l)$:激光雷达坐标系下的3D点

  • $P_{camera} = (X_c, Y_c, Z_c)$:相机坐标系下的3D点

  • $R$:激光雷达到相机的旋转矩阵(3×3 )

  • $T$:激光雷达到相机的平移向量(3×1)

R和T统称为相机的外参矩阵,这是根据外参标定来的。

将上述公式展开为:

\begin{bmatrix} X_{c} \\ Y_{c} \\ Z_{c} \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}\cdot \begin{bmatrix} X_{l} \\ Y_{l} \\ Z_{l} \end{bmatrix}+\begin{bmatrix} t_{x} \\ t_{y} \\ t_{z} \end{bmatrix}

  • 左侧 第一列(Xc​,Yc​,Zc​) :激光雷达点在相机坐标系下的3D坐标。

  • 右侧第一项:旋转矩阵对激光雷达坐标做线性变换。

  • 右侧第二项:激光雷达坐标系的3D点

  • 右侧第三项:平移向量(平移后的旋转坐标系原点)。

举例:

3.1.1. 旋转矩阵

旋转矩阵的每一列表示激光雷达坐标轴在相机坐标系中的方向。

假设激光雷达到相机的外参矩阵为:

\begin{bmatrix} 0.00557177 & -0.999879 & 0.01454 \\ 0.069586 & -0.0141175 & -0.997476 \\ 0.997561 & 0.00656956 & 0.0694988 \end{bmatrix}

将上述公式写成向量的形式为:

R = [c1, c2, c3]

其中:

  • c1 = [0.00557177, 0.069586, 0.997561]ᵀ(激光雷达X轴在相机坐标系中的方向)

  • c2 = [-0.999879, -0.0141175, 0.00656956]ᵀ(激光雷达Y轴在相机坐标系中的方向)

  • c3 = [0.01454, -0.997476, 0.0694988]ᵀ(激光雷达Z轴在相机坐标系中的方向)

其具体的映射关系为:

X轴 (前方)    [0.0056, 0.0696, 0.9976]  → 几乎完全对齐 +Z
Y轴 (左侧)    [-0.9999, -0.0141, 0.0066] → 几乎完全对齐 -X 
Z轴 (上方)    [0.0145, -0.9975, 0.0695]  → 几乎完全对齐 -Y

注意:

  • 上述矩阵的对应关系为: X→Z, Y→X, Z→Y,这里的对应关系不是固定的,绝对值大的元素才决定对齐到哪个轴。

  • 正负号:决定同向还是反向。

  • 两个小的元素:说明与其他轴垂直。

3.1.2. 平移矩阵

平移向量T是激光雷达坐标系原点(激光雷达中心)指向相机坐标系原点(相机光心)的向量,表示在激光雷达坐标系下的表示。

假设激光雷达到相机的平移矩阵为:

T = [-0.0100033, -1.02251, -0.154385]

其中:

  • X=-0.0100033,表示相机在激光雷达后方1厘米处;

  • Y=-1.02251,表示相机在激光雷达的右侧1.02米处;

  • Z=-0.154385表示相机在激光雷达的下方15.5厘米处。

因为在激光雷达坐标系下X方向向前,负值表示向后,Y方向是向左,负值表示向右,Z方向是向上,负值表示向下。

到此为止,激光雷达到相机的坐标系就转换完成,可能会有人对此有疑问,相机的坐标系和图像的坐标系有什么区别呢?难道相机的坐标系不就是图像的坐标系吗?

这里我做个简单的解释:相机成像的数学本质就是3D到2D的投影。相机拍摄的2D图像丢失了深度信息(Z坐标),所以我们看到的只有2D坐标(x,y)。而相机的3D坐标到2D的投影,就是通过相机的内参来实现转换的。

3.2 相机坐标系→图像坐标系(内参)

相机坐标系到图像坐标系之间的转换,其计算公式为:

\begin{bmatrix} \acute{v} \\ \acute{u} \\ w \end{bmatrix} = K\cdot P_{camera}

其中:

  • P_{camera}是激光雷达到相机的坐标点;

  • K是相机的内参矩阵。

相机内参矩阵的表示格式为:

K = \begin{bmatrix} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{bmatrix}

实际上齐次坐标投影公式为:

\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \frac{1}{Z_{c}}\begin{bmatrix} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X_{c} \\ Y_{c} \\ Z_{c} \end{bmatrix}

将上述公式展开为:

u = f_{x} \cdot \frac{X_{c}}{Z_{c}} + c_{x}

v = f_{y} \cdot \frac{Y_{c}}{Z_{c}} + c_{y}

例:

相机内参矩阵为:

\begin{bmatrix} 1190.436 & 0 & 959.865 \\ 0 & 1190.765 & 539.059 \\ 0 & 0 & 1 \end{bmatrix}

焦距:fx 对应矩阵中 (1,1) 位置的 1190.436,fy 对应矩阵中(2,2) 位置的 1190.765。它们代表了镜头的放大倍率。
主点坐标:cx 对应矩阵中 (1,3) 位置的 959.865,cy 对应矩阵中(2,3) 位置的 539.059。这是相机光轴(可以想象成从镜头中心垂直射出去的那条线)与图像传感器平面的交点。简单说,就是图像上最接近镜头中心点的那个像素的位置。
(1,2) 位置的 0:这代表相机的 x 轴和 y 轴是绝对垂直的,没有扭曲(skew)。现代工业相机这一点都做得很好。
(3,1)、(3,2) 位置的 0 和 (3,3) 位置的 1:这是为了数学计算方便,维持齐次坐标的形式。

假设激光雷达测得一个障碍物,经过旋转平移后,它在相机坐标系下的坐标是(Xc,Yc,Zc)=(1.5,0.8,10)米:
算归一化坐标:Xc/Zc=1.5/10=0.15,Yc/Zc=0.8/10=0.08
代入内参矩阵计算像素位置:
u=1190.44×0.15+959.87=178.57+959.87=1138.44
v=1190.77×0.08+539.06=95.26+539.06=634.32
这个公式告诉你,那个在相机前方 10 米、右边 1.5 米、高 0.8 米的障碍物,会出现在你照片的 (1138, 634) 这个像素附近。

这就是激光雷达坐标系到相机图像坐标系的整体流程。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐