3、坐标系与标定:世界坐标系、车辆坐标系、相机坐标系、传感器联合标定基础

说实话,坐标系和标定这块,是很多刚入行同学的第一道坎。

我记得自己刚做感知那会儿,总觉得坐标系不就是个数学概念嘛,有什么难的?结果第一次做多传感器融合,点云和图像怎么都对不上,折腾了两天才发现是标定参数搞反了。嗯,从那以后我再也不敢小看坐标系了。

3.1 为什么需要这么多坐标系?

你想想看,一辆自动驾驶车上,有激光雷达、摄像头、毫米波雷达、IMU、GPS……每个传感器都有自己的“视角”。

摄像头看到的是像素坐标,激光雷达看到的是三维点云,GPS给的是经纬度。这些数据要融合到一起,就必须有一个统一的“语言”——坐标系。

说白了,坐标系就是给空间中的点一个“地址”。不同传感器用不同的地址本,我们要做的就是把这些地址本翻译成同一本。

核心原则:所有传感器数据最终都要转换到同一个坐标系下,才能进行融合、规划和控制。

3.2 四大坐标系详解

3.2.1 世界坐标系

世界坐标系是全局的参考系。它固定在地球上,不随车辆移动而改变。

通常我们使用东北天坐标系(ENU):X轴指向东,Y轴指向北,Z轴指向天。GPS给出的经纬高数据,最终都会转换到这个世界坐标系下。

我在项目中遇到过一个问题:世界坐标系的原点选在哪里?

我的习惯是:如果做高精地图匹配,原点选在车辆启动位置;如果做全局路径规划,原点选在地图的某个固定参考点。没有绝对标准,但一定要在整个系统里保持一致。

3.2.2 车辆坐标系

车辆坐标系是跟着车走的。ISO标准定义:

  • X轴:车辆前进方向
  • Y轴:车辆左侧方向
  • Z轴:车辆上方方向

原点通常在后轴中心,或者车辆质心。我个人习惯用后轴中心,因为做运动学模型时方便。

小技巧:车辆坐标系的原点选择会影响后续的标定和运动补偿。建议在项目初期就固定下来,不要中途更换,否则所有标定参数都要重做。

3.2.3 相机坐标系

相机坐标系是感知算法中最常用的坐标系之一。

它的定义有点反直觉:

  • Z轴:相机光轴方向(指向被拍摄物体)
  • X轴:图像水平方向
  • Y轴:图像垂直方向(向下)

为什么Y轴向下?因为图像坐标系的原点在左上角,Y轴向下为正。相机坐标系为了和图像坐标系对齐,也沿用了这个习惯。

我曾经犯过一个低级错误:把相机坐标系的Y轴搞反了,结果3D点投影到图像上,所有物体都上下颠倒。排查了半天才发现是坐标系符号问题。嗯,这种错误犯一次就够了。

3.2.4 像素坐标系与图像坐标系

这两个容易混淆,我简单区分一下:

  • 图像坐标系:物理单位(毫米),原点在图像中心
  • 像素坐标系:像素单位,原点在图像左上角

它们之间的转换就是内参矩阵干的事。

3.3 坐标系转换:从3D到2D

把三维世界中的一个点投影到图像上,需要经过四步转换:

  1. 世界坐标系 → 车辆坐标系(外参:旋转+平移)
  2. 车辆坐标系 → 相机坐标系(外参:旋转+平移)
  3. 相机坐标系 → 图像坐标系(内参:透视投影)
  4. 图像坐标系 → 像素坐标系(内参:缩放+平移)

公式写出来是这样的:

// 世界坐标到像素坐标的完整转换
// P_w: 世界坐标点 (X, Y, Z, 1)
// T_v2w: 车辆到世界的变换矩阵
// T_c2v: 相机到车辆的变换矩阵
// K: 相机内参矩阵

// 1. 世界 -> 车辆
P_v = T_v2w * P_w

// 2. 车辆 -> 相机
P_c = T_c2v * P_v

// 3. 相机 -> 像素
pixel = K * P_c  // 归一化后得到 (u, v, 1)

注意:这里的矩阵乘法顺序不能搞错。我见过有人把T_v2w和T_c2v的顺序写反了,结果投影出来的点全跑到车后面去了。建议每次写完都做一次可视化验证。

3.4 传感器联合标定基础

标定,说白了就是求传感器之间的外参(旋转矩阵R和平移向量t)。

常见的标定组合:

传感器对 标定方法 精度要求
相机-激光雷达 棋盘格/标定板 亚像素级
相机-相机 立体标定 0.1像素
激光雷达-IMU 手眼标定 0.1度
相机-IMU Kalibr工具 0.05度

3.4.1 相机-激光雷达联合标定

这是最常用的标定对。我推荐用棋盘格法:

  1. 在棋盘格上提取角点(图像中的2D点)
  2. 在点云中提取棋盘格平面上的3D点
  3. 建立2D-3D对应关系
  4. 用PnP算法求解外参

我曾经踩过一个坑:棋盘格太小,点云中根本看不清。后来我改用1.2m×0.9m的大棋盘格,效果立竿见影。建议棋盘格至少占激光雷达视场角的30%以上。

3.4.2 标定流程实战

我一般按这个流程走:

  • 第一步:固定传感器,确保标定过程中不移动
  • 第二步:采集多组数据(不同距离、不同角度)
  • 第三步:用工具自动提取特征点
  • 第四步:手动检查匹配质量(这一步不能省!)
  • 第五步:优化求解,得到外参
  • 第六步:可视化验证(投影点云到图像上)

避坑指南:我曾经在标定完成后直接用了结果,没做可视化验证。结果发现点云投影到图像上偏移了5个像素。后来排查发现是标定板不平整导致的。所以,标定完成后一定要做投影验证,看看边缘是否对齐。

3.5 标定精度验证

标定做完了,怎么知道准不准?

我常用的验证方法:

  • 重投影误差:把3D点投影到图像上,计算与真实2D点的像素距离。一般要求小于1像素。
  • 边缘对齐:把激光雷达点云投影到图像上,看建筑物边缘是否和图像边缘对齐。
  • 距离一致性:在不同距离下验证,确保标定参数没有尺度漂移。

嗯,这里要注意:重投影误差小不代表标定一定准。如果标定板只放在一个位置,误差可能很小但外参是错的。所以一定要多角度、多距离采集数据。

3.6 小结

坐标系和标定是感知算法的基石。说白了,没有准确的标定,后面的一切都是空中楼阁。

我个人建议:在项目初期就花时间把标定做好,建立标准流程。不要等到融合出问题了再回头排查,那时候代价就大了。

下一章我们会讲传感器的时间同步,这也是个容易踩坑的地方。到时候再聊。