第二章:坐标系与变换基础

说实话,坐标系这个东西,刚入行时我觉得太简单了。不就是x、y、z三个轴嘛?直到我第一次做多传感器融合项目,激光雷达和摄像头的数据怎么都对不上,折腾了两天才发现——原来是坐标系定义搞反了。嗯,从那以后,我再也不敢小看坐标系了。

2.1 全局坐标系与局部坐标系

先说说最基础的概念。全局坐标系,也叫世界坐标系,是整个场景的"绝对参考系"。你可以把它想象成一个固定不动的舞台,所有物体都在这个舞台上活动。局部坐标系呢,是附着在某个物体上的坐标系,物体动它就跟着动。

我在项目中遇到过这样一个坑:一辆自动驾驶汽车,它的GPS定位用的是全局坐标系(经纬度),但它的障碍物检测用的是车辆自身的局部坐标系。如果你直接把局部坐标下的障碍物位置当成全局坐标去用,那结果就是——障碍物位置全错,车直接往墙上撞。

关键理解:全局坐标系是"世界"的视角,局部坐标系是"物体"的视角。两者之间的转换,是轨迹评估中最基础也最容易出错的一步。

举个例子,你手里拿着一张地图(全局坐标系),地图上标着你的位置。你面前有一棵树,你目测树在你前方5米偏左2米的位置——这个"前方5米偏左2米"就是局部坐标系下的描述。如果你想知道树在地图上的绝对位置,就得把你的位置和朝向都考虑进去,做一次坐标变换。

2.2 齐次坐标

为什么要引入齐次坐标?说白了,就是为了让计算更统一、更简洁。

你想想看,在普通笛卡尔坐标系下,一个三维点用(x, y, z)表示。旋转可以用3x3矩阵搞定,但平移呢?平移是加法,不是乘法。这就导致旋转和平移没法用同一个矩阵运算来表示,代码写起来特别别扭。

齐次坐标的解决办法很简单:给三维点加一个维度,变成(x, y, z, w)。通常w=1,表示一个点;w=0,表示一个方向向量。这样一来,旋转和平移就可以合并成一个4x4矩阵,一次乘法搞定所有变换。

// 普通坐标转齐次坐标
// 点: (x, y, z) → (x, y, z, 1)
// 向量: (x, y, z) → (x, y, z, 0)

// 齐次坐标转回普通坐标
// (x, y, z, w) → (x/w, y/w, z/w)

我的习惯:在代码里统一用齐次坐标存储所有点数据。虽然多了一个维度,但后续的变换操作会清爽很多,也不容易忘记加平移量。

2.3 欧拉角与四元数

这两个东西,是描述旋转的两种方式。我个人的建议是:能用四元数就别用欧拉角。为什么?

欧拉角有三个参数:俯仰角(Pitch)、偏航角(Yaw)、滚转角(Roll)。看起来直观,但有个致命问题——万向锁。当俯仰角达到±90度时,偏航和滚转就分不清了,你会丢失一个自由度。我在做无人机轨迹回放时遇到过这个问题,飞机垂直俯冲时姿态突然跳变,查了半天才发现是欧拉角在作祟。

四元数就不一样了。它用四个参数(q0, q1, q2, q3)表示旋转,没有奇点,插值平滑,计算效率也高。唯一的缺点是不太直观,你没法一眼看出它代表什么姿态。

特性 欧拉角 四元数
参数数量 3个 4个
直观性 高 低
万向锁 有 无
插值平滑性 差 好
计算效率 一般 高

避坑指南:我曾经在数据回放系统中直接用欧拉角做插值,结果轨迹出现了诡异的抖动。后来换成四元数的球面线性插值(Slerp),问题立刻解决。记住:旋转插值,永远用四元数。

2.4 坐标变换矩阵

坐标变换矩阵,说白了就是描述"从一个坐标系到另一个坐标系"的数学工具。一个4x4的齐次变换矩阵,包含了旋转信息(左上角3x3)和平移信息(右上角3x1)。

// 4x4齐次变换矩阵结构
// [ R11  R12  R13  Tx ]
// [ R21  R22  R23  Ty ]
// [ R31  R32  R33  Tz ]
// [  0    0    0    1  ]

// 其中R是3x3旋转矩阵,T是3x1平移向量

举个例子,假设你有一个点P在局部坐标系下的坐标是(1, 0, 0),而局部坐标系相对于全局坐标系旋转了90度并平移了(2, 3, 0)。那么P在全局坐标系下的坐标就是变换矩阵乘以局部坐标。

这里有个细节要注意:变换矩阵的乘法顺序。先旋转再平移,和先平移再旋转,结果完全不同。我见过不少新手在这里栽跟头。

// 正确顺序:先旋转,再平移
// P_global = R * P_local + T

// 写成齐次形式
// [P_global]   [R  T]   [P_local]
// [   1    ] = [0  1] * [   1    ]

2.5 知识体系总览

下面这张图,是我自己总结的坐标系与变换知识体系。每次做轨迹评估项目前,我都会先过一遍这个框架,确保没有遗漏。

坐标系与变换基础 坐标系类型 全局坐标系 局部坐标系 旋转表示方法 欧拉角 四元数 数学工具 齐次坐标 变换矩阵 核心应用:坐标系转换与轨迹对齐 传感器数据融合 轨迹误差评估 多视角数据回放 SLAM位姿优化

这张图把本章的核心内容串起来了。左边是坐标系类型,中间是旋转表示方法,右边是数学工具,底部是实际应用场景。每次做轨迹评估,你都得在这几个维度之间来回切换。

我的经验:在实际项目中,我习惯先把所有数据统一到同一个坐标系下,然后再做后续处理。这个"统一坐标系"的步骤,能避免80%以上的数据对齐问题。

好了,坐标系与变换基础就讲到这里。这些东西看起来是纯数学,但实际项目中处处都用得到。下一章我们会深入轨迹数据的采集与预处理,到时候你会看到这些变换知识是怎么落地的。

可可精品资料库