一句话理解坐标系统

坐标系统 = 给自动驾驶的每一个传感器和空间定义一个"原点在哪、xyz 朝哪"的共识规则,让不同来源的数据能在同一个空间里对齐。

自动驾驶车辆上通常有 612 个摄像头、13 个 LiDAR、若干个毫米波雷达。每个传感器都在自己的"小坐标系"里感知世界——摄像头看到的是像素,LiDAR 看到的是点云。要把这些数据融合到一起、做统一感知和规划,就必须建立一套坐标系统变换链


🎯 自动驾驶中的六大坐标系

1. 世界坐标系(World / Global Coordinate)

世界坐标系是全局统一的参考系,通常采用**东北天(ENU)地心地固(ECEF)**坐标系:

  • ECEF:原点在地球质心,$+x$ 指向本初子午线与赤道交点,$+z$ 指向北极,$+y$ 按右手系确定。用于全球导航。
  • ENU:以局部点为原点,$+x$ 向东,$+y$ 向北,$+z$ 向上(天)。更常用在自动驾驶局部场景中。

在自动驾驶系统中,世界坐标通常来自 GPS + IMU 组合导航的定位结果。车辆在高精地图上的位置就是用世界坐标表示的。

2. 自车坐标系(Ego-Vehicle / Body Coordinate)

自车坐标系以车辆本身为原点,是感知和规划的默认工作空间

  • $+x$:车辆前进方向(车头)
  • $+y$:车辆左侧
  • $+z$:垂直向上(车顶方向)
  • 原点通常位于后轴中心在地面的投影点,或车辆几何中心

几乎所有感知算法的输出(目标位置、速度、朝向)都是在自车坐标系中给出的。规划模块输出的轨迹点也是自车坐标系下的 $(x, y, \theta)$。

3. 相机坐标系(Camera Coordinate)

相机坐标系以**相机光心(optical center)**为原点:

  • $z$:沿光轴指向正前方(看的方向)
  • $x$:向右(图像水平方向)
  • $y$:向下(图像垂直方向)
  • 这是一个右手系,但 $y$ 向下与图像像素坐标的 $v$ 轴方向一致

这个定义意味着:相机看到的点 $(X_c, Y_c, Z_c)$ 中,$Z_c$ 就是深度(到光心的距离沿光轴的分量)。

4. LiDAR 坐标系

LiDAR 坐标系以激光雷达的扫描中心为原点:

  • $+x$:指向 LiDAR 正前方(与车头方向对齐)
  • $+y$:指向左侧
  • $+z$:指向上方

注意不同厂商的坐标系约定可能有差异:

厂商$x$$y$$z$说明
通用约定右手系,与自车坐标系一致
部分 Velodyne同上
某些机械式 LiDAR需要旋转 180° 对齐
ROS REP-105标准 ROS 约定

在部署时,务必查阅传感器手册确认其坐标系定义。将 LiDAR 点云对齐到自车坐标系是融合的第一步。

5. BEV 坐标系(Bird’s Eye View)

BEV 坐标系本质上是自车坐标系的俯视投影,去掉 $z$ 轴信息:

  • $+x$:车辆前进方向(通常对应 BEV 网格上方)
  • $+y$:车辆左侧(对应 BEV 网格左方)
  • 范围:前方 $[-30m, 60m]$,左右 $[-30m, 30m]$(典型值)

BEV 网格通常表示为 $H \times W$ 的栅格,每个格子的大小(resolution)如 $0.5m$。坐标系原点对应网格的中心(自车位置)。

6. 图像像素坐标系

像素坐标 $(u, v)$ 是最终的 2D 输出:

  • $u$:水平方向(向右),单位:像素
  • $v$:垂直方向(向下),单位:像素
  • 原点在图像左上角

这是唯一离散的坐标系,所有 3D 信息最终都要投影到这里才能被人或感知网络看到。


🔧 坐标变换:连接所有坐标系

外参:传感器 → 自车

外参(Extrinsics)描述了传感器坐标系到自车坐标系的刚体变换

$$ \begin{bmatrix} X_{\text{ego}} \\ Y_{\text{ego}} \\ Z_{\text{ego}} \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} X_{\text{sensor}} \\ Y_{\text{sensor}} \\ Z_{\text{sensor}} \\ 1 \end{bmatrix} $$

其中 $R$ 是 $3\times3$ 旋转矩阵,$t$ 是 $3\times1$ 平移向量。外参在车辆出厂时标定,并在使用中定期校验。

内参:相机坐标系 → 像素坐标系

内参矩阵 $K$ 将相机坐标系中的 3D 点投影到 2D 像素平面:

$$ K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} $$$$ s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} $$

其中 $s = Z_c$ 是深度。展开后:

$$ u = f_x \frac{X_c}{Z_c} + c_x, \quad v = f_y \frac{Y_c}{Z_c} + c_y $$

完整变换链:世界 → 像素

一个世界点 $P_w$ 到图像像素的完整投影为:

$$ s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \cdot T_{\text{cam}\to\text{ego}}^{-1} \cdot T_{\text{ego}\to\text{world}}^{-1} \cdot P_w $$

在实际系统中,通常简化为离线算好的联合投影矩阵。


🔄 3D ↔ 2D 投影

3D → 2D:前向投影(Forward Projection)

已知 3D 空间点(如 LiDAR 点云中的点),找到它在图像上的对应像素。

流程:

  1. 将 LiDAR 点 $(x_l, y_l, z_l)$ 通过外参变换到自车坐标系
  2. 再通过相机外参变换到相机坐标系
  3. 通过内参 $K$ 投影到像素坐标

这是多模态融合(如 LiDAR-Camera 融合)的基础操作——将点云投影到图像上获取语义标签。

Lift-Splat(LSS)视角变换

LSS(Lift-Splat-Shoot)是 BEV 感知中经典的视角变换方法:

  1. Lift:为每个像素预测一个深度分布(Depth Distribution),将 2D 图像特征"抬升"到 3D 空间
  2. Splat:将 3D 空间中的特征点池化(sum pooling)到 BEV 网格上

数学上,LSS 完成的是:

$$ F_{\text{BEV}}(x, y) = \sum_{i} \sum_{d} w_{i,d} \cdot f_i \cdot \mathbb{1}[\pi^{-1}(u_i, v_i, d) = (x, y, z)] $$

其中 $\pi^{-1}$ 是逆投影,$f_i$ 是像素 $i$ 的特征,$w_{i,d}$ 是深度 $d$ 的权重。

Lift-Splat 在 BEVFormer 中的演进

BEVFormer 使用 Transformer 的 cross-attention 替代 LSS 的显式深度预测:

  1. 定义 BEV Queries:每个 BEV 网格位置 $(x, y)$ 对应一个可学习 query
  2. 对每个 query,在 3D 空间中采样若干个参考点(沿 $z$ 轴和高度方向)
  3. 通过 cross-attention 从多相机特征图中聚合信息

BEVFormer 的一个关键创新是空间注意力(Spatial Cross-Attention, SCA)

$$ \text{SCA}(Q_p, F) = \sum_{i=1}^{N_{\text{cam}}} \sum_{j=1}^{N_{\text{ref}}} \text{DeformAttn}(Q_p, \mathcal{P}(p, i, j), F_i) $$

这里 $\mathcal{P}(p, i, j)$ 将 BEV 网格点 $p$ 投影到第 $i$ 个相机的第 $j$ 个参考点的像素位置——本质就是坐标变换的跨视图应用。

2D → 3D:逆投影(Inverse Projection)

给定一个像素 $(u, v)$ 和对应的深度 $d$,可以反投影到相机坐标系:

$$ \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = d \cdot K^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} $$

但单张图像的单目深度估计是病态问题——同一个像素可以对应 3D 空间中一整条射线上的任意点。因此:

  • 单目 3D 检测:网络必须从图像外观线索(尺寸先验、遮挡关系、地面接触点)隐式估计深度
  • 多目立体:通过左右视图的视差计算深度(三角测量)
  • LiDAR + 相机:LiDAR 提供精确深度,相机提供语义

深度估计方法对比

方法深度来源精度密度成本
单目深度估计网络隐式回归低(~30% 相对误差)密集
双目立体匹配视差计算中(~10% 相对误差)密集
LiDAR 直接测量ToF高(±2cm)稀疏
多传感器融合综合密集

🔗 为什么理解坐标系统如此重要

很多刚接触自动驾驶的同学会被论文中的"将点云投影到图像空间"、“在 BEV 空间采样”、“使用逆透视映射(IPM)“等描述搞混。这背后的核心就是坐标变换链

几个关键教训:

  1. 所有传感器标定误差最终都会变成感知误差:外参偏了 1°,30 米外的目标会偏移 0.5 米——这足以让车道级定位失效
  2. 不同数据集使用不同的坐标约定:nuScenes 使用 $(x_{\text{前}}, y_{\text{左}}, z_{\text{上}})$,KITTI 使用 $(x_{\text{右}}, y_{\text{下}}, z_{\text{前}})$,做跨数据集实验时务必检查
  3. BEV 感知的核心就是坐标变换:LSS 和 BEVFormer 的区别本质上是如何实现"图像 → BEV” 的坐标变换
  4. 部署中坐标系统是常见 bug 源:很多时候模型在训练集上指标很好,但上车就出问题——排查下来往往是坐标变换链中某个环节的符号反了

📚 延伸阅读

  1. Hartley, R. & Zisserman, A. “Multiple View Geometry in Computer Vision.” Cambridge University Press, 2nd Ed.
  2. Zhang, Z. “A flexible new technique for camera calibration.” IEEE TPAMI, 2000.
  3. Philion, J. & Fidler, S. “Lift, Splat, Shoot: Encoding Camera from Arbitrary Transformers.” ECCV, 2020.
  4. Li, Z. et al. “BEVFormer: Transforming Bird’s-Eye-View into Map-like Space via Queries.” NeurIPS, 2022.
  5. Caesar, H. et al. “nuScenes: A multimodal dataset for autonomous driving.” CVPR, 2020.
  6. Geiger, A. et al. “Are we ready for autonomous driving? The KITTI vision benchmark suite.” CVPR, 2012.