3、二维旋转矩阵:旋转的数学之美
各位同学,今天我们来聊聊二维旋转矩阵。说实话,这个知识点我当年学的时候觉得特别抽象,直到后来做机器人运动学才真正体会到它的妙处。
你想想看,一个点绕着原点转,到底该怎么用数学描述?
3.1 从几何直觉到数学公式
假设平面上有一个点 P,坐标为 (x, y)。它绕原点逆时针旋转 θ 角度后,到了新位置 P' (x', y')。
我习惯用极坐标来理解这个问题。点 P 到原点的距离是 r,与 x 轴夹角为 α。那么:
x = r·cos(α)
y = r·sin(α)
旋转 θ 后,新角度变成了 α + θ:
x' = r·cos(α + θ)
y' = r·sin(α + θ)
嗯,这里要用到三角恒等式了。我个人觉得这是整个推导中最关键的一步:
x' = r·cos(α)·cos(θ) - r·sin(α)·sin(θ)
= x·cos(θ) - y·sin(θ)
y' = r·sin(α)·cos(θ) + r·cos(α)·sin(θ)
= x·sin(θ) + y·cos(θ)
看,这就是二维旋转的核心公式!
3.2 旋转矩阵的诞生
把上面两个式子写成矩阵形式,就得到了旋转矩阵:
[x'] [cos(θ) -sin(θ)] [x]
[y'] = [sin(θ) cos(θ)] [y]
这个 2×2 矩阵 R(θ) 就是二维旋转矩阵。它把原始坐标映射到旋转后的坐标。
几何意义解读:
- 第一列 [cos(θ), sin(θ)]ᵀ 是 x 轴单位向量旋转后的位置
- 第二列 [-sin(θ), cos(θ)]ᵀ 是 y 轴单位向量旋转后的位置
- 说白了,旋转矩阵的每一列就是原坐标轴旋转后的新坐标
3.3 我在项目中踩过的坑
我曾经在做一个机械臂视觉抓取项目时,发现抓取点总是偏的。查了半天,原来是旋转方向搞反了。
这里给大家提个醒:
- 逆时针旋转:θ 为正,用上面的矩阵
- 顺时针旋转:θ 为负,或者用转置矩阵 R(-θ) = R(θ)ᵀ
避坑指南:
我曾经在代码里把 sin(θ) 的符号写反了,结果整个机械臂的轨迹都乱套了。建议你在写代码时,先用一个已知点(比如 (1,0))验证一下旋转是否正确。
3.4 旋转矩阵的重要性质
旋转矩阵有几个性质,我建议你牢牢记住:
| 性质 | 表达式 | 说明 |
|---|---|---|
| 正交性 | R(θ)ᵀ·R(θ) = I | 转置等于逆矩阵 |
| 行列式 | det(R(θ)) = 1 | 旋转不改变面积 |
| 可组合性 | R(θ₁)·R(θ₂) = R(θ₁+θ₂) | 多次旋转可合并 |
小技巧:
正交性意味着旋转矩阵的逆就是它的转置。这在做坐标变换时特别有用——想反向旋转,直接转置矩阵就行,不用重新算三角函数。
3.5 代码实现示例
这是我常用的 Python 实现,简洁明了:
import numpy as np
def rotation_matrix_2d(theta):
"""
生成二维旋转矩阵
theta: 旋转角度(弧度)
"""
c = np.cos(theta)
s = np.sin(theta)
return np.array([[c, -s],
[s, c]])
# 验证:旋转点 (1, 0) 逆时针 90 度
theta = np.pi / 2
R = rotation_matrix_2d(theta)
p = np.array([1, 0])
p_rotated = R @ p
print(f"旋转后坐标: {p_rotated}") # 输出 [0, 1]
3.6 知识体系总览
下面这张图帮你理清二维旋转矩阵的知识脉络:
二维旋转矩阵看似简单,但它是理解三维旋转、四元数等高级概念的基础。我建议你亲手推导一遍,再用代码验证几个角度,这样印象会深刻得多。
记住,旋转矩阵的本质就是坐标轴的重新定向。搞懂了这个,后面的欧拉角、旋转向量都不在话下。