1. 坐标系基础:为什么需要坐标变换?刚体运动与坐标系定义
大家好,我是老张。在感知融合这个行当里摸爬滚打了十来年,今天咱们来聊聊最基础、也最绕不开的一个话题——坐标系。
你可能会问,搞感知就搞感知,为什么非得跟坐标系过不去?
嗯,我刚开始做项目时也这么想。直到有一次,激光雷达检测到的障碍物位置,跟摄像头看到的完全对不上——明明是一辆车,雷达说它在左边3米,摄像头说它在右边2米。排查了半天,发现是坐标系没对齐。从那以后,我再也不敢小看坐标系了。
为什么需要坐标变换?
说白了,自动驾驶车上装了那么多传感器,每个传感器都有自己的“小世界”。
- 激光雷达:以自己为中心,告诉你“前方5米有障碍物”
- 摄像头:以镜头为中心,告诉你“图像第300列有个行人”
- GPS/IMU:以地球为中心,告诉你“车辆当前在经纬度(116.4, 39.9)”
这些传感器说的“位置”,用的不是同一把尺子。你想想看,如果不把它们统一到一个坐标系下,融合就无从谈起。
核心问题:每个传感器都有自己的局部坐标系,我们需要通过坐标变换,把这些局部信息映射到同一个全局坐标系中。
我在项目中遇到过最典型的场景:一辆车在路口左转,激光雷达检测到右侧有个骑自行车的人,摄像头也看到了。但雷达坐标系下是(3.2, -1.5, 0.8),摄像头坐标系下是(2.8, 1.2, 0.9)。如果不做变换,你根本不知道它们说的是同一个目标。
刚体运动:物体怎么动?
车辆在路上跑,本质上是一个刚体在三维空间里运动。什么叫刚体?就是物体本身不会变形——车不会像橡皮泥一样被拉长压扁。
刚体运动包含两部分:
- 旋转:车头朝向哪里
- 平移:车在什么位置
我习惯用一个简单的比喻:你手里拿着一本书,你可以把它从桌子左边挪到右边(平移),也可以把它转个方向(旋转)。但书本身的大小形状没变——这就是刚体运动。
个人经验:在感知融合中,我们通常假设车辆和传感器都是刚体。这个假设在99%的情况下成立,但遇到极端颠簸路面时,传感器支架可能会产生微小形变——嗯,那是另一个话题了。
坐标系定义:怎么建系?
坐标系定义是坐标变换的基石。定义不清楚,后面全是坑。
常见的坐标系有:
| 坐标系 | 原点 | 用途 |
|---|---|---|
| 世界坐标系 | 地球上的固定点 | 全局定位、路径规划 |
| 车体坐标系 | 车辆后轴中心 | 车辆控制、运动预测 |
| 传感器坐标系 | 传感器自身 | 原始数据采集 |
每个坐标系都遵循右手定则。x轴朝前,y轴朝左,z轴朝上——这是自动驾驶行业的主流约定。但要注意,不同厂商可能有不同习惯,我曾经被这个问题坑过一次。
避坑指南:我曾经接手过一个项目,前一家公司用的坐标系是x朝前、y朝右。我们团队习惯x朝前、y朝左。结果融合出来的轨迹全是反的。所以,项目一开始就要把坐标系定义写进文档里,白纸黑字。
坐标变换的数学本质
坐标变换,说白了就是用一个矩阵把点从一个坐标系搬到另一个坐标系。
对于三维空间中的点 p,从坐标系A变换到坐标系B:
p_B = R * p_A + t
其中:
- R 是旋转矩阵(3x3)
- t 是平移向量(3x1)
你可能会问,为什么旋转要用矩阵?因为矩阵可以同时处理绕三个轴的旋转,而且可以组合。我刚开始学的时候也觉得矩阵运算很抽象,后来写代码多了,发现其实就是个乘法加加法。
小技巧:实际工程中,我们通常用齐次坐标,把旋转和平移合并成一个4x4的变换矩阵。这样一次矩阵乘法就能完成变换,代码写起来也干净。
知识体系总览
下面这张图,是我自己梳理的坐标系与坐标变换的知识结构。你可以把它当作一张地图,后面讲到具体内容时,随时回来对照。
这张图把整个知识体系串起来了。左边是“为什么需要”,中间是“怎么做”,右边是“用什么定义”。最终都汇聚到“统一坐标系”这个目标上。
好了,这一章就到这里。坐标系这东西,看似简单,但真要在工程里用好,还是得花点功夫。下一章咱们聊聊旋转矩阵的具体计算,以及怎么用代码实现坐标变换。
本章要点回顾:
- 坐标变换是为了统一不同传感器的数据
- 刚体运动 = 旋转 + 平移
- 坐标系定义要明确,避免歧义
- 齐次变换矩阵是工程中的标准做法