一、坐标变换概述
大家好,我是你们的讲师。今天咱们来聊聊坐标变换——这个在机器人、图形学、GIS里无处不在的基础工具。
说实话,我刚入行那会儿,觉得坐标变换就是个数学概念,离实际代码很远。直到有一次做机器人抓取项目,发现机械臂死活抓不准零件……折腾了两天,最后发现是坐标系没对齐。嗯,从那以后,我再也不敢小看它了。
什么是坐标变换?
说白了,坐标变换就是把一个点在不同坐标系下的位置描述,互相转换。
举个例子:你站在教室中间,说「黑板在我前方3米」。但如果你转个身,黑板就在你后方了。同一个黑板,位置没变,只是你的「参考系」变了。坐标变换做的就是这件事——把「黑板在A坐标系下的位置」换算成「在B坐标系下的位置」。
核心公式(二维旋转):
# 二维点 (x, y) 绕原点旋转 θ 角度
x' = x * cos(θ) - y * sin(θ)
y' = x * sin(θ) + y * cos(θ)
这个公式我建议你背下来,后面所有变换都基于它。
为什么需要坐标变换?
你想想看,现实世界里的物体,往往同时存在于多个「坐标系」中:
- 机器人:机械臂有自己的关节坐标系,摄像头有图像坐标系,世界有全局坐标系
- 游戏:角色有局部坐标系,场景有世界坐标系,屏幕有像素坐标系
- 地图:GPS用的是经纬度坐标系,但显示到屏幕上需要投影坐标系
没有坐标变换,这些系统根本没法协同工作。我记得有一次做多传感器融合项目,激光雷达和摄像头的数据对不上——后来发现是两者的坐标系原点差了5厘米。这种坑,踩过一次就记住了。
我的经验:做任何涉及多传感器的项目,第一件事就是画清楚坐标系关系图。别急着写代码,先花半小时把变换链理清楚,能省你后面三天调试时间。
坐标变换的应用领域
坐标变换不是纸上谈兵,它在三个领域尤其重要:
1. 机器人领域
机器人里最经典的场景就是正运动学和逆运动学。
- 正运动学:知道每个关节的角度,求末端执行器的位置
- 逆运动学:知道末端执行器的目标位置,反推每个关节的角度
我做过一个六轴机械臂的仿真项目,正运动学就是不断做坐标变换——从基座到关节1,关节1到关节2……一直传到末端。每一步都是一个变换矩阵相乘。
# 二维齐次变换矩阵(平移 + 旋转)
import numpy as np
def transformation_matrix(dx, dy, theta):
"""生成二维齐次变换矩阵"""
cos_t = np.cos(theta)
sin_t = np.sin(theta)
return np.array([
[cos_t, -sin_t, dx],
[sin_t, cos_t, dy],
[0, 0, 1]
])
# 示例:点 (1, 0) 先平移 (2, 3),再旋转 90°
T = transformation_matrix(2, 3, np.pi/2)
point = np.array([1, 0, 1])
result = T @ point
print(f"变换后坐标: ({result[0]:.2f}, {result[1]:.2f})")
# 输出:变换后坐标: (2.00, 4.00)
避坑指南:我曾经在写齐次矩阵时,忘了把点扩展成齐次坐标(加一个1),结果矩阵乘法直接报错。记住:二维点用 (x, y, 1),三维点用 (x, y, z, 1)。
2. 计算机图形学
图形学里,坐标变换是渲染管线的核心。一个3D模型从建模到显示在屏幕上,经历了至少4次变换:
| 变换阶段 | 作用 | 坐标系 |
|---|---|---|
| 模型变换 | 把模型放到世界场景中 | 模型坐标系 → 世界坐标系 |
| 视图变换 | 从相机角度观察场景 | 世界坐标系 → 相机坐标系 |
| 投影变换 | 把3D场景压到2D平面 | 相机坐标系 → 裁剪坐标系 |
| 视口变换 | 映射到屏幕像素 | 裁剪坐标系 → 屏幕坐标系 |
说白了,你看到的每一个3D游戏画面,背后都是坐标变换在「搬砖」。我当年学OpenGL时,被这个管线绕晕过好一阵子。后来自己手写了一个软渲染器,才真正搞明白每一步在干什么。
3. GIS(地理信息系统)
GIS里的坐标变换更「接地气」——地球是椭球体,但地图是平面的。怎么把球面上的经纬度映射到平面?这就是地图投影。
- 墨卡托投影:航海图常用,但越靠近两极变形越大
- 高斯-克吕格投影:我国地形图常用,分带投影
- UTM投影:全球通用,也是分带
我记得有个项目需要把GPS轨迹叠加到卫星图上,结果轨迹和地图对不上——因为GPS用的是WGS84坐标系,而卫星图用的是墨卡托投影。中间少了一步坐标变换,偏差了上百米。
一句话总结:坐标变换就是「在不同参考系之间翻译位置信息」。没有它,机器人抓不准东西,游戏画面会扭曲,地图会错位。
本章知识体系
下面这张图,是我个人习惯用来梳理坐标变换知识结构的。你可以把它当作本章的「地图」:
嗯,这一章我们先把坐标变换的「是什么」和「为什么」讲清楚。后面几章会深入数学推导和代码实现——到时候我会带着你们手写变换矩阵,从二维到三维,从理论到工程。
记住一句话:坐标变换不是数学题,是工程工具。带着这个心态去学,你会发现它其实很直观。
可可精品资料库