向量的旋转证明

转载来自:http://www.cnblogs.com/woodfish1988/archive/2007/09/10/888439.html

基础的2-D绕原点旋转 

在2-D的迪卡尔坐标系中,一个位置向量的旋转公式可以由三角函数的几何意义推出。比如上图所示是位置向量R逆时针旋转角度B前后的情况。在左图中,我们有关系:

  x0 = |R| * cosA

  y0 = |R| * sinA

  =>

  cosA = x0 / |R|

  sinA = y0 / |R|

  在右图中,我们有关系:

  x1 = |R| * cos(A+B)

  y1 = |R| * sin(A+B)

  其中(x1, y1)就是(x0, y0)旋转角B后得到的点,也就是位置向量R最后指向的点。我们展开cos(A+B)和sin(A+B),得到

  x1 = |R| * (cosAcosB - sinAsinB)

  y1 = |R| * (sinAcosB + cosAsinB)

  现在把

  cosA = x0 / |R|

  sinA = y0 / |R|

  代入上面的式子,得到

  x1 = |R| * (x0 * cosB / |R| - y0 * sinB / |R|)

  y1 = |R| * (y0 * cosB / |R| + x0 * sinB / |R|)

  =>

  x1 = x0 * cosB - y0 * sinB

  y1 = x0 * sinB + y0 * cosB

  这样我们就得到了2-D迪卡尔坐标下向量围绕圆点的逆时针旋转公式。顺时针旋转就把角度变为负:

  x1 = x0 * cos(-B) - y0 * sin(-B)

  y1 = x0 * sin(-B) + y0 * cos(-B)

  =>

  x1 = x0 * cosB + y0 * sinB

  y1 = -x0 * sinB + y0 * cosB

  现在我要把这个旋转公式写成矩阵的形式,有一个概念我简单提一下,平面或空间里的每个线性变换(这里就是旋转变换)都对应一个矩阵,叫做变换矩阵。对一个点实施线性变换就是通过乘上该线性变换的矩阵完成的。好了,打住,不然就跑题了。

所以2-D旋转变换矩阵就是:

[cosA  sinA]      [cosA -sinA]
[-sinA cosA] 或者 [sinA cosA]

  我们对点进行旋转变换可以通过矩阵完成,比如我要点(x, y)绕原点逆时针旋转:

          [cosA  sinA]
[x, y] x  [-sinA cosA] = [x*cosA-y*sinA  x*sinA+y*cosA]
为了编程方便,我们把它写成两个方阵

[x, y]   [cosA  sinA]   [x*cosA-y*sinA  x*sinA+y*cosA]
[0, 0] x [-sinA cosA] = [0              0            ]

也可以写成 

[cosA -sinA]   [x 0]   [x*cosA-y*sinA  0]
[sinA  cosA] x [y 0] = [x*sinA+y*cosA  0]

三、2-D的绕任一点旋转

  下面我们深入一些,思考另一种情况:求一个点围绕任一个非原点的中心点旋转。

  我们刚刚导出的公式是围绕原点旋转的公式,所以我们要想继续使用它,就要把想要围绕的那个非原点的中心点移动到原点上来。按照这个思路,我们先 将该中心点通过一个位移向量移动到原点,而围绕点要保持与中心点相对位置不变,也相应的按照这个位移向量位移,此时由于中心点已经移动到了圆点,就可以让 同样位移后的围绕点使用上面的公式来计算旋转后的位置了,计算完后,再让计算出的点按刚才的位移向量 逆 位移,就得到围绕点绕中心点旋转一定角度后的新位置了。看下面的图



现在求左下方的蓝色点围绕红色点旋转一定角度后的新位置。由于红色点不在原点,所以可以通过红色向量把它移动到原点,此时蓝色的点也按照这个向量移动,可 见,红色和蓝色点的相对位置没有变。现在红色点在原点,蓝色点可以用上面旋转变换矩阵进行旋转,旋转后的点在通过红色向量的的逆向量回到它实际围绕下方红 色点旋转后的位置。
在这个过程中,我们对围绕点进行了三次线性变换:位移变换-旋转变换-位移变换,我们把它写成矩阵形式:
设红色向量为(rtx, rty)

[x y 1]   [1   0   0]   [cosA  sinA 0]   [1    0    0]   [x' y' -]
[0 1 0] x [0   1   0] x [-sinA cosA 0] x [0    1    0] = [-  -  -]
[0 0 1]   [rtx rty 1]   [0     0    1]   [-rtx -rty 1]   [-  -  -]

  最后得到的矩阵的x'和y'就是我们旋转后的点坐标。


在三维空间中,欧拉角是一种表示旋转的方法,通常由三个角度组成,分别表示绕三个坐标轴的旋转。常见的欧拉角顺序包括 Z-X-Z、X-Y-X、Z-Y-X 等,其中 Z-Y-X 顺序(即 yaw-pitch-roll,偏航-俯仰-滚动)在航空航天和机器人学中较为常用。 为了将欧拉角转换为旋转矩阵,需要依次将绕各轴的单个旋转矩阵相乘。以 Z-Y-X 顺序为例,假设欧拉角为 $(\psi, \theta, \phi)$,分别表示绕 z 轴的偏航角、绕 y 轴的俯仰角和绕 x 轴的滚动角。 绕各轴的单个旋转矩阵如下: 绕 x 轴旋转 $\phi$ 的旋转矩阵为: $$ R_x(\phi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\phi & -\sin\phi \\ 0 & \sin\phi & \cos\phi \end{bmatrix} $$ 绕 y 轴旋转 $\theta$ 的旋转矩阵为: $$ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} $$ 绕 z 轴旋转 $\psi$ 的旋转矩阵为: $$ R_z(\psi) = \begin{bmatrix} \cos\psi & -\sin\psi & 0 \\ \sin\psi & \cos\psi & 0 \\ 0 & 0 & 1 \end{bmatrix} $$ 按照 Z-Y-X 顺序,最终的旋转矩阵为三个矩阵的乘积: $$ R = R_z(\psi) R_y(\theta) R_x(\phi) $$ 将上述三个矩阵相乘,可以得到最终的旋转矩阵: $$ R = \begin{bmatrix} \cos\psi\cos\theta & \cos\psi\sin\theta\sin\phi - \sin\psi\cos\phi & \cos\psi\sin\theta\cos\phi + \sin\psi\sin\phi \\ \sin\psi\cos\theta & \sin\psi\sin\theta\sin\phi + \cos\psi\cos\phi & \sin\psi\sin\theta\cos\phi - \cos\psi\sin\phi \\ -\sin\theta & \cos\theta\sin\phi & \cos\theta\cos\phi \end{bmatrix} $$ 该矩阵描述了从欧拉角到旋转矩阵的转换关系,并可用于将一个向量从局部坐标系变换到全局坐标系。 ### 代码示例 以下是一个 Python 函数,用于根据给定的欧拉角(Z-Y-X 顺序)计算对应的旋转矩阵: ```python import numpy as np def euler_to_rotation_matrix(yaw, pitch, roll): # 将角度转换为弧度 yaw = np.radians(yaw) pitch = np.radians(pitch) roll = np.radians(roll) # 计算各个轴的旋转矩阵 R_x = np.array([ [1, 0, 0], [0, np.cos(roll), -np.sin(roll)], [0, np.sin(roll), np.cos(roll)] ]) R_y = np.array([ [np.cos(pitch), 0, np.sin(pitch)], [0, 1, 0], [-np.sin(pitch), 0, np.cos(pitch)] ]) R_z = np.array([ [np.cos(yaw), -np.sin(yaw), 0], [np.sin(yaw), np.cos(yaw), 0], [0, 0, 1] ]) # 计算最终的旋转矩阵 R = np.dot(R_z, np.dot(R_y, R_x)) return R # 示例:将欧拉角 (ψ=30°, θ=45°, φ=60°) 转换为旋转矩阵 rotation_matrix = euler_to_rotation_matrix(30, 45, 60) print("Rotation Matrix:\n", rotation_matrix) ``` 上述代码将欧拉角 $(\psi=30^\circ, \theta=45^\circ, \phi=60^\circ)$ 转换为旋转矩阵,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值