坐标变换基础:从欧几里得空间到仿射空间

大家好,我是老张。今天咱们聊聊坐标变换这件事。

说实话,我刚入行那会儿,觉得坐标变换就是个数学游戏。不就是把点从A坐标系挪到B坐标系嘛,有什么难的?直到我在一个机器人抓取项目里栽了跟头——明明仿真里跑得好好的,一到实际产线就偏了3毫米。后来才发现,问题出在我对变换的理解太浅了。

嗯,咱们从头捋一遍。

欧几里得空间:我们熟悉的那个世界

你想想看,我们从小学习的几何,其实都是欧几里得空间里的东西。两条平行线永不相交,三角形内角和180度,这些规则我们太熟悉了。

在控制领域,欧几里得空间就是我们默认的坐标系。比如一个机械臂的末端位置,用(x, y, z)三个数就能描述。我习惯把这种空间叫做「朴素空间」——它简单、直观,但有个致命问题。

什么问题?

欧几里得空间里,原点是有特殊地位的。所有点的坐标都是相对于原点说的。但实际工程中,谁规定原点必须在那个位置?

核心矛盾:欧几里得空间假设存在一个「绝对原点」,但现实世界里的坐标系都是人为定义的。换个相机、换个基座,原点就变了。

仿射空间:更贴近现实的模型

仿射空间是什么?说白了,它把「点」和「向量」分开了。

  • 点:就是空间里的一个位置,没有方向,没有大小
  • 向量:有方向有大小,表示从一个点到另一个点的位移

在仿射空间里,原点不再特殊。你可以把原点放在任何地方,点与点之间的关系(向量)保持不变。这太重要了——我在做多传感器融合时,每个传感器都有自己的原点,但描述的是同一个物理世界。

我的经验:做视觉引导抓取时,相机坐标系、机器人基坐标系、工具坐标系,每个都有自己的原点。用仿射变换来处理,比硬算欧几里得坐标省心十倍。

为什么需要变换?三个真实场景

我遇到过不少新手问:既然仿射空间这么好,为什么还要学变换?

原因很简单:你没法让所有设备用同一个坐标系。

  1. 传感器融合:激光雷达和摄像头装在不同位置,它们的测量值必须变换到同一个坐标系下才能融合
  2. 运动规划:机械臂的关节角度是内部坐标,但目标位置是世界坐标,不做变换没法规划路径
  3. 标定补偿:我曾经调试一个视觉系统,发现相机安装有0.5度的倾斜。不做坐标变换补偿,抓取精度永远上不去

避坑指南:我曾经犯过一个低级错误——把旋转矩阵和平移向量搞反了顺序。记住:先旋转,后平移。顺序错了,结果天差地别。

变换的数学本质

咱们用最简单的2D情况来说明。假设有个点P,在坐标系A中的坐标是(x_a, y_a),在坐标系B中的坐标是(x_b, y_b)。

变换公式长这样:

P_b = R * P_a + T

其中R是旋转矩阵,T是平移向量。

但这里有个坑——如果变换链很长(比如从相机到工具,再到世界),每次都要写R和T,很麻烦。所以工程上常用齐次坐标:

| P_b |   =   | R  T |   *   | P_a |
|  1  |       | 0  1 |       |  1  |

这样就把旋转和平移合并成一个4x4矩阵了。我个人习惯用这种形式,因为矩阵乘法可以链式组合,代码写起来也干净。

一张图看懂本章核心

下面这张SVG图,是我自己画的。它展示了从欧几里得空间到仿射空间的演变,以及变换在其中的作用。

欧几里得空间 原点O(特殊地位) 点P (x, y) 坐标依赖原点 ❌ 原点固定,不灵活 变换 仿射空间 原点O'(可任意选) 点P' 向量 v = P' - O' ✅ 点与向量分离,灵活 变换的本质:在不同原点之间建立映射关系

实际工程中的选择

那么问题来了:什么时候用欧几里得,什么时候用仿射?

场景 推荐空间 原因
单传感器内部计算 欧几里得 简单,计算量小
多传感器融合 仿射 原点不同,需要统一
运动学正解 欧几里得 关节角度直接对应坐标
手眼标定 仿射 相机和机器人原点不同

我的建议:如果你刚开始做控制,先用欧几里得空间理解问题。等遇到坐标系冲突了,再切换到仿射空间。别一上来就搞齐次坐标,容易把自己绕晕。

好了,这一章就到这里。记住一句话:变换不是数学游戏,是解决工程问题的工具。下一章咱们会深入旋转矩阵和四元数,那才是真正考验人的地方。

可可精品资料库