坐标系与标定基础:世界坐标系、车辆坐标系、相机坐标系、图像坐标系、传感器标定的意义、内参与外参的概念

说实话,做自动驾驶感知这几年,我见过太多新手一上来就扎进算法堆里,结果连坐标系都没搞明白。嗯,这其实是个大坑。坐标系和标定,说白了就是感知系统的「地基」。地基没打牢,后面再漂亮的算法都是空中楼阁。

今天咱们就把这块硬骨头啃下来。我会结合自己踩过的坑,带你把这些概念彻底理清。

1. 为什么我们需要这么多坐标系?

你想想看,一辆自动驾驶车上,传感器五花八门:激光雷达、摄像头、毫米波雷达、IMU……每个传感器都有自己的「视角」和「语言」。摄像头看到的是像素,激光雷达看到的是三维点云,车辆本身又关心自己在世界上的位置。

如果没有统一的坐标系,这些数据根本没法对话。我早期做的一个项目,就是因为相机和激光雷达的坐标系没对齐,结果融合出来的障碍物位置偏差了半米多,差点撞上路沿。从那以后,我对坐标系转换这件事就格外较真。

核心思想:所有传感器数据最终都要转换到同一个坐标系下,才能被车辆理解和使用。

2. 四大坐标系详解

2.1 世界坐标系

世界坐标系是绝对的参考系。它固定在地球上,不随车辆移动而改变。通常我们会选一个原点,比如停车场入口的某个点,或者用GPS经纬度定义。

在实际工程中,我习惯用UTM坐标系作为世界坐标系。为什么?因为它直接跟GPS挂钩,方便做全局路径规划。不过要注意,UTM在不同带区之间会有跳变,跨区域行驶时得做特殊处理。

  • 作用:描述车辆、障碍物、道路的绝对位置
  • 单位:米(m)
  • 常见形式:UTM、WGS84(经纬度)

2.2 车辆坐标系

车辆坐标系是跟着车走的。一般定义:车头方向为X轴正方向,车身左侧为Y轴正方向,车顶方向为Z轴正方向。原点通常在后轴中心或者车辆质心。

我个人建议把原点放在后轴中心。为什么?因为车辆的运动模型(比如阿克曼模型)以后轴中心为参考点计算最方便。我之前试过用质心,结果做轨迹预测时多了一堆不必要的坐标转换,麻烦得很。

小技巧:在代码里,车辆坐标系通常用 body_framevehicle_frame 命名。ROS中对应的就是 base_link

2.3 相机坐标系

相机坐标系是光学中心那一套。Z轴指向相机前方(也就是镜头朝向),X轴向右,Y轴向下。嗯,这里要注意,相机坐标系的Y轴是朝下的,跟车辆坐标系不一样。很多新手在这里栽跟头。

我记得有一次调试车道线检测,发现投影到图像上的点总是上下颠倒。查了半天,原来是相机坐标系和车辆坐标系的Y轴方向搞反了。从那以后,我每次写坐标转换代码,都会在注释里把轴方向写清楚。

// 相机坐标系定义示例
// 原点:相机光心
// X轴:图像右侧方向
// Y轴:图像下方方向  
// Z轴:相机前方方向(沿光轴)
struct CameraFrame {
    double x;  // 右
    double y;  // 下
    double z;  // 前
};

2.4 图像坐标系

图像坐标系就是像素的天下。原点在图像左上角,u轴向右,v轴向下。单位是像素(pixel)。

这里有个关键点:图像坐标系是二维的,而相机坐标系是三维的。从三维到二维,就是投影的过程。说白了,相机坐标系里的一个点,通过内参矩阵投影到图像平面上,就变成了像素坐标。

坐标系 维度 原点 单位
世界坐标系 3D 自定义(如GPS原点)
车辆坐标系 3D 后轴中心
相机坐标系 3D 光心
图像坐标系 2D 左上角 像素

3. 传感器标定的意义

标定是什么?说白了,就是找到不同坐标系之间的「翻译规则」。没有标定,传感器就是聋子跟瞎子对话——谁也听不懂谁。

我参与过一个量产项目,标定参数稍微偏了0.1度,结果在100米外的目标位置误差达到了17厘米。对于自动驾驶来说,这个误差足以让车辆做出错误的决策。所以标定精度直接决定了感知系统的上限。

注意:标定不是一次性的。车辆行驶过程中的震动、温度变化、时间推移,都可能导致标定参数漂移。建议定期做在线标定校验。

4. 内参与外参的概念

4.1 内参(Intrinsic Parameters)

内参是传感器「内部」的属性。对于相机来说,内参包括焦距、主点坐标、畸变系数等。这些参数描述了光线如何通过镜头落到成像平面上。

我习惯把内参理解为相机的「出厂设置」。同一款相机,内参基本固定。但注意,镜头畸变会随着使用时间变化,所以隔一段时间重新标定内参是必要的。

// 相机内参矩阵 K(3x3)
// fx, fy: 焦距(像素单位)
// cx, cy: 主点坐标(像素单位)
K = [[fx,  0, cx],
     [ 0, fy, cy],
     [ 0,  0,  1]]

4.2 外参(Extrinsic Parameters)

外参描述的是传感器之间的「相对位置和姿态」。比如相机相对于车辆坐标系的位置(平移向量)和朝向(旋转矩阵)。

外参是标定的核心难点。为什么?因为旋转矩阵有3个自由度,平移向量有3个自由度,一共6个参数。稍微偏一点,投影误差就会放大。我在做多传感器融合时,外参标定通常要反复迭代3-5轮才能达到满意的精度。

一句话总结:内参告诉你「传感器怎么看世界」,外参告诉你「传感器在世界哪里」。

5. 坐标转换实战思路

实际工程中,坐标转换的流程大概是这样的:

  1. 激光雷达点云从雷达坐标系转到车辆坐标系(用雷达的外参)
  2. 相机图像从图像坐标系转到相机坐标系(用内参的逆投影)
  3. 相机坐标系下的点转到车辆坐标系(用相机的外参)
  4. 所有数据统一到车辆坐标系后,再转到世界坐标系(用车辆的定位信息)

嗯,听起来步骤多,但其实每一步都是矩阵乘法。写代码时我建议封装成独立的函数,每个函数只做一件事。这样调试起来方便,出错了也容易定位。

避坑指南:我曾经在坐标转换时忘记考虑齐次坐标的归一化,结果投影出来的点全飞了。记住:三维点转二维时,最后一步一定要除以Z分量。

6. 小结

坐标系和标定是感知系统的基石。世界坐标系、车辆坐标系、相机坐标系、图像坐标系,这四者构成了数据流动的骨架。内参和外参则是连接这些骨架的「关节」。关节没校准,整个系统就会「骨骼错位」。

下一章,我们会深入相机模型和畸变校正,把内参标定的细节彻底讲透。到时候我会分享一个我实际用过的标定板设计技巧,保证让你少走弯路。

公众号:蓝海资料掘金营,微信deep3321