一句话理解坐标系统
坐标系统 = 给自动驾驶的每一个传感器和空间定义一个"原点在哪、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 点云中的点),找到它在图像上的对应像素。
流程:
- 将 LiDAR 点 $(x_l, y_l, z_l)$ 通过外参变换到自车坐标系
- 再通过相机外参变换到相机坐标系
- 通过内参 $K$ 投影到像素坐标
这是多模态融合(如 LiDAR-Camera 融合)的基础操作——将点云投影到图像上获取语义标签。
Lift-Splat(LSS)视角变换
LSS(Lift-Splat-Shoot)是 BEV 感知中经典的视角变换方法:
- Lift:为每个像素预测一个深度分布(Depth Distribution),将 2D 图像特征"抬升"到 3D 空间
- 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 的显式深度预测:
- 定义 BEV Queries:每个 BEV 网格位置 $(x, y)$ 对应一个可学习 query
- 对每个 query,在 3D 空间中采样若干个参考点(沿 $z$ 轴和高度方向)
- 通过 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°,30 米外的目标会偏移 0.5 米——这足以让车道级定位失效
- 不同数据集使用不同的坐标约定:nuScenes 使用 $(x_{\text{前}}, y_{\text{左}}, z_{\text{上}})$,KITTI 使用 $(x_{\text{右}}, y_{\text{下}}, z_{\text{前}})$,做跨数据集实验时务必检查
- BEV 感知的核心就是坐标变换:LSS 和 BEVFormer 的区别本质上是如何实现"图像 → BEV” 的坐标变换
- 部署中坐标系统是常见 bug 源:很多时候模型在训练集上指标很好,但上车就出问题——排查下来往往是坐标变换链中某个环节的符号反了
📚 延伸阅读
- Hartley, R. & Zisserman, A. “Multiple View Geometry in Computer Vision.” Cambridge University Press, 2nd Ed.
- Zhang, Z. “A flexible new technique for camera calibration.” IEEE TPAMI, 2000.
- Philion, J. & Fidler, S. “Lift, Splat, Shoot: Encoding Camera from Arbitrary Transformers.” ECCV, 2020.
- Li, Z. et al. “BEVFormer: Transforming Bird’s-Eye-View into Map-like Space via Queries.” NeurIPS, 2022.
- Caesar, H. et al. “nuScenes: A multimodal dataset for autonomous driving.” CVPR, 2020.
- Geiger, A. et al. “Are we ready for autonomous driving? The KITTI vision benchmark suite.” CVPR, 2012.