【机器视觉】旋转矩阵,坐标系变换

征途所在是星辰大海
——无名
三联后私信博主免费领取ChatGPT4 mini永久授权码~
前言
分享一下我搓机器人过程中遇到的问题
通常会将物体的坐标从一个坐标系转换到另一个坐标系,在机器视觉中这一操作十分常见。旋转矩阵能够精确描述物体在三维空间中的旋转关系,并且通常与平移矢量一起执行刚体变换。
由于缺乏专业的计算机背景,在撰写代码时更多依赖于数学原理的基础上进行设计;将相关算法置于末尾段落中以避免混淆;其中大部分程序的设计基于数学原理,并且目前尚未进行任何优化尝试~
坐标系变换

在将物体从一个参考坐标系转换到另一个参考坐标系的过程中, 我们需要执行仿射变换以实现两坐标系统间的转换目标. 通过旋转矩阵来体现各坐标轴之间的相对旋转状态, 而平移矩阵则用于表示两个不同参考系统之间的位置差异.
公式:

其中:

为物体的初始坐标,

为变换后物体的坐标
*

为旋转矩阵
*

为平移矢量
平移矢量
在几何变换中,位移向量 是一种用于描述物体在空间中沿着某个固定方向的平行移动的方法。这种刚性变换能够维持物体的几何特性不变,并且它完全不包含任何旋转或缩放成分。
一般来说,平移矢量是一个点的集合,直接相加即可,不做详细解释
旋转矩阵
旋转矩阵 用于描述物体在二维或三维空间中旋转变换,具有如下性质:
- 旋转矩阵

为正交矩阵,即

- 旋转矩阵行列式为 1,即

- 旋转变换后,向量的长度和角度保持不变
二维旋转矩阵
假设给定一个二维向量
,让它绕原点逆时针旋转一个角度

,旋转后的新向量记为
,这个旋转的过程可以表示为:

接下来,就是如何求解这个旋转矩阵

:
一:极坐标表示
一个二维向量

可以用极坐标表示为:

其中:

为矢量长度,大小为


为矢量与

轴的夹角
二:旋转后的极坐标表示
如果将矢量

绕原点逆时针旋转角度

,旋转后的矢量

表示为:

利用和角公式展开:


带入原式:


还原到直角坐标


三:矩阵形式表示
将上面两个方程用矩阵形式表示出来:

因此二维旋转矩阵

为:

验证旋转矩阵的性质
一:正交性

是正交矩阵,

,保证了向量的长度和角度不发生变化。


证明:假设一个向量

旋转后变为

,有:

假设有一个向量


上面1两条公式分别说明了旋转矩阵保存矢量长度和角度不变。
二:行列式
**

该方法确保了矩阵变换仅涉及正交操作而不包含镜像反射或其他方向反转的操作:例如,在左手坐标系转换为右手坐标系时

三维旋转矩阵
目标:在三维空间中,找到一个旋转矩阵

,使得一个向量

绕三维空间中的某个轴旋转角度

,得到新的向量

。
绕x,y,z坐标轴旋转
考虑到一个向量

,绕

轴旋转角度

几何上,绕

轴的旋转只影响

轴的分量,而

轴保存不变,参考二维旋转矩阵,有:
- 原向量

和

轴坐标 
- 旋转后坐标


轴保持不变
将上述结果合并到三维旋转矩阵中:

同理,我们可以得出绕

轴旋转的旋转矩阵:

**需要注意的是:绕

轴旋转时,由于定义的正方向与

轴正方向不同,旋转矩阵略有不同。**在线性代数中可以用“逆序数”来描述

绕任意轴旋转
对于三维空间中任意旋转轴所对应的情况,该矩阵可通过罗德里格斯公式进行推导。
假设旋转轴是一个单位向量
,绕该轴旋转了

公式表示
**** 罗德里格斯公式描述任意轴的旋转矩阵:

其中:

是

的单位矩阵
*

是由旋转轴

构造的反对称矩阵


是矩阵

的平方

完整公式展开:
将

带入公式,得到旋转矩阵

旋转矩阵代码(Python)
二维旋转矩阵
import numpy as np
def rotate_coordinates(x, y, theta):
rotation_matrix = np.array([
[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]
])
original_vector = np.array([x, y])
rotated_vector = np.dot(rotation_matrix, original_vector)
return rotated_vector[0], rotated_vector[1]
三维绕x,y,z坐标轴旋转矩阵
x,z轴代码相同,y轴比较特殊
import numpy as np
def rotation_matrix_x(theta):
# 绕 X 轴旋转的旋转矩阵 R_x(theta)
return np.array([
[1, 0, 0],
[0, np.cos(theta), -np.sin(theta)],
[0, np.sin(theta), np.cos(theta)]
])
def rotation_matrix_y(theta):
# 绕 Y 轴旋转的旋转矩阵 R_y(theta)
return np.array([
[np.cos(theta), 0, np.sin(theta)],
[0, 1, 0],
[-np.sin(theta), 0, np.cos(theta)]
])
三维绕任意轴旋转
import numpy as np
def rotation_matrix_u(theta, u):
# 任意轴 u 绕轴旋转的旋转矩阵 R(u, theta)
u_x, u_y, u_z = u
cos_theta = np.cos(theta)
sin_theta = np.sin(theta)
one_minus_cos = 1 - cos_theta
R = np.array([
[
cos_theta + u_x**2 * one_minus_cos,
u_x * u_y * one_minus_cos - u_z * sin_theta,
u_x * u_z * one_minus_cos + u_y * sin_theta
],
[
u_y * u_x * one_minus_cos + u_z * sin_theta,
cos_theta + u_y**2 * one_minus_cos,
u_y * u_z * one_minus_cos - u_x * sin_theta
],
[
u_z * u_x * one_minus_cos - u_y * sin_theta,
u_z * u_y * one_minus_cos + u_x * sin_theta,
cos_theta + u_z**2 * one_minus_cos
]
])
return R
