3. 坐标系与空间变换:世界坐标系、车辆坐标系、传感器坐标系、坐标变换矩阵、外参标定原理

坐标系这东西,刚入行时觉得就是数学概念,没什么大不了的。直到我第一次做多传感器融合项目,激光雷达和摄像头对同一个目标的位置差了半米多,我才意识到——坐标系搞不清楚,后面全是白干。

说白了,标定匹配的核心就一句话:把不同传感器看到的东西,统一到同一个坐标系下。你想想看,摄像头看到的是像素,激光雷达看到的是三维点云,毫米波雷达看到的是带速度的目标列表。它们各自活在自己的世界里,怎么对齐?

嗯,这就是我们今天要聊的内容。

3.1 四大坐标系,你得心里有数

自动驾驶里常用的坐标系有四个。我习惯把它们分成两类:全局的和局部的。

坐标系 原点位置 典型用途 我踩过的坑
世界坐标系 地球上的固定点(如UTM原点) 高精地图、全局路径规划 不同地图供应商的UTM带号不一致,导致拼接错位
车辆坐标系 车辆后轴中心或质心 车辆动力学控制、底盘信号 ISO和SAE的Z轴方向相反,搞混过一次
传感器坐标系 传感器光学中心或安装点 原始数据采集、感知算法 IMU的安装角度偏差,导致姿态估计漂移
像素/图像坐标系 图像左上角或主点 视觉感知、目标检测 畸变校正没做干净,投影误差累积

这里有个关键点:车辆坐标系是中间桥梁。所有传感器数据最终都要转到车体坐标系下,再通过定位模块转到世界坐标系。我曾经见过一个团队,直接把激光雷达数据转到世界坐标系,结果车辆一动,地图就飘了——因为没经过车体系做时间对齐。

3.2 坐标变换矩阵,别被公式吓到

坐标变换说白了就是旋转+平移。旋转用矩阵,平移用向量,组合起来就是4x4的齐次变换矩阵。

我个人习惯用这种形式:

# 齐次变换矩阵 T = [R | t]
#            [0 | 1]
# 其中 R 是 3x3 旋转矩阵
#      t 是 3x1 平移向量

T_sensor_to_vehicle = np.array([
    [0.9998, -0.0175,  0.0000,  0.5000],
    [0.0175,  0.9998, -0.0001, -0.2000],
    [0.0000,  0.0001,  1.0000,  0.1000],
    [0.0000,  0.0000,  0.0000,  1.0000]
])

你可能会问:为什么非要用4x4矩阵?直接用3x3旋转矩阵加3x1平移向量不行吗?

当然可以。但当你需要连续做多次变换时——比如从传感器到车辆,再到世界坐标系——4x4矩阵可以直接相乘,一次搞定。用分离的形式,你得先旋转再平移,代码写起来啰嗦,还容易出错。

我的小技巧: 写代码时把变换矩阵的逆矩阵也提前算好存起来。标定完成后,正向变换和反向变换都会频繁用到。现场调试时现算逆矩阵,万一矩阵奇异,整个系统就崩了。

3.3 外参标定原理,核心就两件事

外参标定,就是求传感器坐标系到车辆坐标系的变换矩阵。说白了,就是找到传感器装在车上的什么位置、什么角度。

标定原理其实不复杂:

  1. 找对应点:在传感器数据和车辆坐标系下找到同一组特征点
  2. 解方程:通过最小二乘法或SVD分解,求解旋转矩阵和平移向量

我记得第一次做激光雷达和摄像头的联合标定时,用了棋盘格。激光雷达扫到棋盘格的角点,摄像头也拍到棋盘格的角点。理论上它们对应的是同一个物理点,但实际测量总有误差。这时候就需要采集多组数据,用优化方法求最优解。

核心公式: 对于N组对应点 {p_i, q_i},其中p_i在传感器坐标系,q_i在车辆坐标系,求解:

min ∑ || R·p_i + t - q_i ||²

解出R和t,就是外参。

3.4 外参标定的三种主流方法

实际项目中,外参标定方法大致分三类。我按推荐程度排个序:

方法 原理 精度 适用场景 我的评价
靶标法 用棋盘格、ArUco码等已知尺寸的标定物 高(亚毫米级) 实验室、产线 最可靠,但需要专用场地
自然特征法 利用道路上的车道线、杆状物等自然特征 中等(厘米级) 现场标定、OTA更新 方便,但受环境影响大
手眼标定法 利用传感器自身的运动估计,解AX=XB方程 中等(厘米级) IMU+相机、多激光雷达 不需要标定物,但收敛慢
我曾经踩过的坑: 量产阶段用自然特征法做在线标定,结果遇到下雨天,车道线反光严重,特征匹配全乱了。后来加了天气判断逻辑,雨量超过阈值就切回保守模式,用上一次标定结果。

3.5 坐标系变换的完整流程

一个典型的感知数据流转过程是这样的:

# 伪代码:激光雷达点云从传感器到世界坐标系
# 1. 传感器坐标系 -> 车辆坐标系
points_vehicle = T_sensor_to_vehicle @ points_sensor

# 2. 车辆坐标系 -> 世界坐标系(通过定位模块)
points_world = T_vehicle_to_world @ points_vehicle

# 3. 世界坐标系 -> 局部规划坐标系(可选)
points_local = T_world_to_local @ points_world

这里每一步都涉及时间同步。我记得有一次调试,激光雷达和IMU的时间戳差了50毫秒,车辆在转弯时,点云和姿态对不上,地图直接扭曲了。后来加了硬件同步信号,问题才解决。

嗯,时间同步和坐标系变换,其实是同一个问题的两个面。后面我们会专门讲。

3.6 知识体系总览

下面这张图,把本章的核心逻辑串起来了。我建议你保存下来,做项目时对照着看。

坐标系与空间变换知识体系 世界坐标系 车辆坐标系 传感器坐标系 像素/图像坐标系 坐标变换矩阵 T = [R | t; 0 | 1] 外参标定:求解传感器→车辆的 R 和 t 靶标法(高精度) 自然特征法(中等) 手眼标定法(中等) 数据流转:传感器 → 车辆坐标系 → 世界坐标系 → 局部规划 ⚠ 关键提醒:时间同步与坐标系变换是同一问题的两个面 硬件同步信号 + 精确时间戳,缺一不可

3.7 量产部署中的坐标系管理

量产和研发不一样。研发时你可以慢慢调,量产时每辆车的外参都有细微差异。我建议你注意以下几点:

  • 统一约定:团队内部必须统一坐标系定义,包括X/Y/Z轴方向、旋转顺序(RPY还是欧拉角)、单位(米还是毫米)。我曾经吃过亏,算法团队用ISO标准,底盘团队用SAE标准,联调时发现Z轴方向反了。
  • 标定数据管理:每辆车下线时,外参数据要写入车辆的配置文件,并备份到云端。换传感器时,直接OTA下发新外参,不用重新标定。
  • 在线监测:量产车在路上跑,外参会因为振动、温度变化而漂移。我建议加一个在线监测模块,实时评估外参置信度。如果发现异常,及时报警或触发在线标定。
一个实用的经验: 量产车的传感器安装支架,一定要设计定位销和基准面。这样即使换传感器,安装位置也能保证在毫米级重复精度内。标定一次,管用一年。

好了,坐标系和空间变换就聊到这里。记住一句话:标定的本质,就是找到不同坐标系之间的那个变换矩阵。后面我们会深入讲具体的标定工具和流程,到时候你会回来感谢今天打下的基础。