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

说实话,坐标系和标定这块,是自动驾驶里最基础但也最容易翻车的地方。我见过不少团队,算法模型调得漂漂亮亮,结果上路一跑,感知和规划对不上——最后发现是坐标系没对齐。嗯,今天我们就来把这层窗户纸捅破。

3.1 车辆坐标系:车到底怎么描述自己?

车辆坐标系,说白了就是车自己看自己的方式。我习惯把它叫做「车体坐标系」。它的原点通常在后轴中心,或者车辆质心。为什么是后轴中心?因为车辆的运动学模型,说白了就是绕着后轴转的。

  • X轴:指向车辆前进方向(正前方)
  • Y轴:指向车辆左侧(符合右手定则)
  • Z轴:指向车辆上方(垂直地面)

重要提醒:不同车厂对Y轴方向的定义可能不同。有的用「左正右负」,有的用「右正左负」。我在做项目时吃过这个亏——两个模块联调,轨迹偏移了半米,查了两天才发现是Y轴方向定义反了。

车辆坐标系是动态的。车在转弯时,坐标系也跟着转。所以它只适合描述「相对于车本身」的东西,比如:

  • 传感器安装在车的什么位置
  • 障碍物在车的哪个方向
  • 规划出的轨迹相对于车的位置

3.2 世界坐标系:把车放到地图里

世界坐标系是固定不动的。它把车、障碍物、道路都放到同一个空间里。常用的有UTM坐标系(通用横轴墨卡托)或WGS84经纬度坐标系。

你想想看,如果只用车辆坐标系,车往前走10米,坐标系也跟着走了10米。那之前检测到的障碍物位置就全乱了。所以必须有一个「不动」的坐标系来兜底。

世界坐标系和车辆坐标系之间,靠的就是位姿变换。车的位姿通常用 (x, y, yaw) 表示,其中 yaw 是航向角。有了这个,就能把车体坐标系下的点,映射到世界坐标系里。

我的经验:在实际项目中,我建议把世界坐标系的原点选在场景的几何中心,或者选在车辆启动时的位置。这样数值不会太大,计算精度也更高。我曾经遇到过因为坐标值太大(几十万米),导致浮点数精度丢失的问题——嗯,那真是血泪教训。

3.3 传感器标定:让每个传感器知道自己在哪

传感器标定,就是确定传感器相对于车辆坐标系的安装位置和姿态。说白了,就是告诉算法:「摄像头装在车顶偏左10厘米,朝前偏下5度」。

常见的传感器标定包括:

  • 相机内参标定:焦距、畸变系数、主点位置
  • 相机外参标定:相机相对于车辆坐标系的旋转和平移
  • 激光雷达标定:LiDAR相对于车辆坐标系的位姿
  • 毫米波雷达标定:雷达安装角度和位置

标定的方法有很多,比如用棋盘格、用标定板、或者用自然特征点。我个人比较喜欢用棋盘格——简单、稳定、可复现。

注意:标定不是一劳永逸的。车辆在行驶中,传感器可能会因为振动、碰撞而轻微移位。我建议每3个月或者每次事故后,重新做一次标定检查。我曾经遇到过一台车,标定数据用了半年,结果发现摄像头支架松了,偏了0.3度——在100米外,这个误差就是0.5米,足以让车道线检测出错。

3.4 联合标定:让所有传感器「说同一种语言」

联合标定,就是把多个传感器的数据对齐到同一个坐标系下。比如,激光雷达检测到一个障碍物,摄像头也检测到同一个障碍物——怎么知道它们是同一个东西?

这就需要联合标定。它解决的是「传感器之间的相对位姿」问题。常见的联合标定组合有:

  • 相机 + LiDAR:把LiDAR点云投影到图像上
  • 相机 + 毫米波雷达:把雷达目标映射到图像坐标系
  • 多相机联合标定:环视相机之间的位姿关系

联合标定的核心,就是求解一个变换矩阵 T,使得同一个物体在不同传感器下的观测值,在空间上对齐。这个 T 包含旋转矩阵 R 和平移向量 t。

// 联合标定的核心公式
// 将LiDAR坐标系下的点 P_lidar 转换到相机坐标系
P_cam = R * P_lidar + t

// 再投影到图像平面
pixel = K * P_cam  // K是相机内参矩阵

关键点:联合标定的精度,直接决定了感知融合的效果。如果标定误差超过0.1度,在50米外就会产生约8厘米的偏差。对于车道级定位来说,这个误差已经不可接受了。

3.5 坐标系与标定的知识体系

下面这张图,是我自己梳理的坐标系与标定的知识结构。你可以把它当作一个「地图」,方便理解各个模块之间的关系。

坐标系与标定知识体系 坐标系 车辆坐标系(车体) 世界坐标系(UTM/WGS84) 传感器坐标系 传感器标定 相机内参标定 相机外参标定 LiDAR标定 毫米波雷达标定 联合标定(多传感器对齐) 坐标系是基础,标定是桥梁,联合标定是最终对齐

3.6 标定流程与注意事项

标定这件事,说起来简单,做起来全是坑。我总结了一个标准流程:

  1. 准备标定物:棋盘格、标定板、或者有明确特征的环境
  2. 采集数据:在不同位置、不同角度采集多组数据
  3. 特征提取:从图像中提取角点,从点云中提取平面或边缘
  4. 求解变换:用最小二乘法或优化方法求解R和t
  5. 验证:用未参与标定的数据做验证,看投影误差是否在阈值内

避坑指南:我曾经在标定时只采集了10组数据,结果标定结果在某个角度下误差很大。后来我改成采集30组以上,覆盖不同距离和角度,标定结果就稳定多了。另外,标定场地的光照也很重要——太暗或太亮都会影响角点检测精度。

3.7 标定精度对轨迹安全裕度的影响

你可能觉得标定误差几毫米、零点几度没什么大不了的。但放到实际场景里,影响非常大。

举个例子:

  • 标定误差0.1度,在50米处产生约8.7厘米的横向偏差
  • 标定误差0.5度,在100米处产生约87厘米的横向偏差

对于车道宽度3.5米来说,87厘米的偏差意味着车辆可能已经压线甚至跑到隔壁车道去了。而轨迹安全裕度通常只有20-30厘米——标定误差直接吃掉了一大半裕度。

所以我的建议是:在做轨迹规划时,一定要把标定误差作为一个不确定性因素,加入到安全裕度的计算中。不要以为标定完了就万事大吉——标定误差是系统误差,它不会因为时间平均而消失。

好了,坐标系和标定这块,说白了就是「把每个传感器看到的物体,放到同一个空间里」。基础打牢了,后面的感知融合、轨迹规划才能站得住脚。嗯,今天就先聊到这里。