接触一段时间关于定位的东西,发现里面充斥着旋转矩阵、位移矩阵相关的知识。
在刚接触的时候,更加宁愿以直观的感受去描述欧拉角、旋转位移矩阵、变换矩阵之间的关系,在里做个笔记,希望可以帮助理清楚一些概念。

旋转与旋转矩阵

主动旋转与被动旋转

百度百科看到:旋转矩阵(英语:Rotation matrix)是在乘以一个向量的时候有改变向量的方向但不改变大小的效果并保持了手性的矩阵。旋转矩阵不包括点反演,点反演可以改变手性,也就是把右手坐标系改变成左手坐标系或反之。所有旋转加上反演形成了正交矩阵的集合。旋转可分为主动旋转与被动旋转。主动旋转是指将向量逆时针围绕旋转轴所做出的旋转。被动旋转是对坐标轴本身进行的逆时针旋转,它相当于主动旋转的逆操作。

主动旋转描述的是某个点或者某个向量绕某个轴旋转,这种情况下,点在世界坐标系下的位置是发生里改变的。
而在定位里我们常常研究的是坐标系的旋转,也就是被动旋转,这种情况下,点在世界坐标系下的位置没有发生改变

主动旋转,从点P1到点P2的旋转矩阵R表示为:
P2 = R_{12}\cdot P1
被动旋转,点P从坐标系1到坐标系2的旋转矩阵R表示为:
R_{12}\cdot P2 = P1 也就是 P1 = R_{12}\cdot P2
在下面的计算我们可以看到,主动旋转与被动旋转的旋转矩阵是相同的,但是P1与P2的位置不同,这个要分清楚。


被动旋转的情况:

如图,原X/Y坐标系绕逆时针旋转\theta 度后得到{X}’ /{Y}’ 坐标系
假设再X/Y坐标系下有一点P(x,y),其在{X}’ /{Y}’ 坐标系下的点为{P}’ ({x}’ ,{y}’ )
那么我们可以得到如下的几何关系:

即:
{x}’=y\cdot\sin \theta +x\cdot\cos \theta
{y}’=y\cdot\cos \theta -x\cdot\sin \theta
用矩阵来表示为:
\begin{bmatrix}{x}’\\{y}’\end{bmatrix}=\begin{bmatrix}\cos\theta & \sin\theta \\-\sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix}x\\y\end{bmatrix}

这里要做一个重要说明!!!
这里要做一个重要说明!!!
这里要做一个重要说明!!!
关于被动旋转的旋转矩阵,是被用来说明两个坐标系之间的位置关系。
我们把从坐标系1到坐标系2的旋转矩阵表示为R_{12},若有一点P在坐标系1下的坐标为P1,经过旋转后在坐标系2下的坐标为P2。
那么应该有:
P1 = R_{12}\cdot P2
注意此时旋转后的点P2坐标值在等式右边!!!
也就是说在坐标系变化,也就是外在旋转时我们的旋转矩阵R应该表示为:
\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}\cos\theta & -\sin\theta \\\sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix}{x}’\\{y}’\end{bmatrix}


主动旋转的情况:

如图,X/Y坐标系绕下有一点P(x,y)(或者说向量\vec{OP} )逆时针旋转\theta 度后得到一点{P}’ ({x}’ ,{y}’ )(或者说向量\vec{O{P}’}
计算如下:

{x}’=x\cdot\cos \theta -y\cdot\sin \theta
{y}’=x\cdot\sin \theta +y\cdot\cos \theta
其以旋转矩阵来表示为:
\begin{bmatrix}{x}’\\{y}’\end{bmatrix}=\begin{bmatrix}\cos\theta & -\sin\theta \\\sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix}x\\y\end{bmatrix}

可以验证一点:主动旋转与被动旋转互为逆操作,也就是说坐标轴逆时针旋转\theta度相当于点或向量顺时针旋转\theta

欧拉角

欧拉角,非常直观的,用于描述刚体相对于固定坐标系x/y/z三个方向的旋转运动,百度百科:用来确定定点转动刚体位置的3个一组独立角参量,由章动角θ、旋进角(即进动角)ψ和自转角φ组成,为欧拉首先提出而得名。
注意这里的3个一组独立角参量,不是单独的某个角就能叫欧拉角,而是三个能够表示转动的角度组合里的角可以定义为欧拉角
其具体的详细的说明我们可以在这里看到:http://en.volupedia.org/wiki/Euler_angles
总结一下对于欧拉角的认识有三个要点:

  • 确定坐标系类型;
  • 确定是内在旋转还是外在旋转;
  • 确定旋转的顺归;

确定坐标系类型

也就是左手坐标系和右手坐标系的区别。它区别了三个轴的位置顺序和旋转的正方向。

如图所示,在左手坐标系中x/y/z为一个顺时针的位置顺序,在右手坐标系中则为一个逆时针的位置顺序。
同时在左手坐标系下顺序时针方向即是旋转正向,右手坐标系下逆时针方向即是旋转正向,刚好与我们其余两个手指的握拳的弯曲方向相同。
在数学计算中,我们普遍使用的是右手坐标系,其对应逆时针方向为旋转正方向。


确定是内在旋转还是外在旋转

欧拉角是三次旋转的角度。
而这三次旋转的方式分为内在旋转和外在旋转。
内在旋转是,在每一次旋转的时候,它所围绕的坐标系都是上次旋转后得到的新的三个坐标系。

外在旋转是,每次旋转所围绕的坐标系都是固定的坐标系。

直观上来讲,我们平时姿态解算得到的俯仰角、偏航角、翻滚角都是相对于世界坐标系的一个外在旋转。但是我们查到的资料大部分是内在旋转,比如WIKI上给的旋转矩阵就算按照内在旋转算的。
这里有一点比较重要的结论是,关于内在旋转和外在旋转的关系,如果将其中一种旋转的第一次旋转和第三次旋转互换位置,那么他们就是等价的。也就是外部旋转的ZYX顺归旋转相当于内在旋转的XYZ顺归旋转
内在旋转依次右乘、外在旋转依次左乘,例如:依次进行第1次旋转(R1)、第2次旋转(R2)、第3次旋转(R3),若为内在旋转则最终的旋转矩阵为R = R1. R2. R3,若为外在旋转则最终的旋转矩阵为R = R3. R2. R1(这个在本章“引入欧拉角”小节有介绍)


确定旋转的顺归

旋转的顺归。
在不考虑是内在旋转还是外在旋转的情况下。
从一个坐标系旋转到另一个坐标系下的旋转顺序有12种,分为两类。
Proper Euler angles (z-x-z, x-y-x, y-z-y, z-y-z, x-z-x, y-x-y)
Tait–Bryan angles (x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z)
我们平时用的最多的是 z-y-x顺归。


欧拉角到旋转矩阵

二维坐标系

注意这里描述的是点P从原坐标系下的坐标(x,y),被动旋转(坐标轴旋转),正向旋转(逆时针)\theta,得到新的坐标({x}’ ,{y}’)
注意我们接下来的情况统一是,右手坐标系,逆时针为正方向,被动旋转(坐标轴旋转)
在绕Z轴旋转\theta度时,二维X/Y坐标系下坐标矩阵表示为
\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}\cos\theta & -\sin\theta \\\sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix}{x}’\\{y}’\end{bmatrix}
同理,可以知道在绕X轴旋转\theta度时,二维Y/Z坐标系下坐标矩阵表示为
\begin{bmatrix}y\\z\end{bmatrix}=\begin{bmatrix}\cos\theta & -\sin\theta \\\sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix}{y}’\\{z}’\end{bmatrix}
在绕Y轴旋转\theta度时,二维X/Z坐标系下坐标矩阵表示为
\begin{bmatrix}x\\z\end{bmatrix}=\begin{bmatrix}\cos\theta & \sin\theta \\-\sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix}{x}’\\{z}’\end{bmatrix}
注意这里旋转矩阵的不同,这是因为右手坐标系下绕三个不同轴旋转,其对应的二维坐标系朝向不一样,如图:


三维坐标系

我们知道,坐标轴绕Z轴旋转的时候点在Z轴对应的坐标是不变的,对应绕X、绕Y轴旋转也是如此。
所以针对上面的二维坐标系下的旋转矩阵,我们可以可以做一个齐次坐标变换。
也就是
在绕Z轴旋转\theta度时:
\begin{bmatrix} {x}’ \\ {y}’ \\ {z}’\end{bmatrix}=\begin{bmatrix} \cos\theta & -\sin\theta & 0\\ \sin\theta & \cos\theta & 0\\ 0 & 0 & 1\end{bmatrix}\cdot \begin{bmatrix} x \\ y \\ z\end{bmatrix}
在绕Y轴旋转\theta度时:
\begin{bmatrix} {x}’ \\ {y}’ \\ {z}’\end{bmatrix}=\begin{bmatrix} \cos\theta & 0 & \sin\theta\\ 0 & 1 & 0\\ -\sin\theta & 0 & \cos\theta\end{bmatrix}\cdot \begin{bmatrix} x \\ y \\ z\end{bmatrix}
在绕X轴旋转\theta度时:
\begin{bmatrix} {x}’ \\ {y}’ \\ {z}’\end{bmatrix}=\begin{bmatrix} 1 & 0 & 0\\ 0 & \cos\theta &-\sin\theta \\ 0 & \sin\theta & \cos\theta\end{bmatrix}\cdot \begin{bmatrix} x \\ y \\ z\end{bmatrix}


引入欧拉角

首先明确,欧拉角属于坐标系之间的旋转变换,一定属于被动旋转!
首先明确,欧拉角属于坐标系之间的旋转变换,一定属于被动旋转!
首先明确,欧拉角属于坐标系之间的旋转变换,一定属于被动旋转!
接下来的推导情况统一是,右手坐标系,逆时针为正方向,被动旋转,ZYX顺归,内在旋转
前面都是绕某个轴旋转某一角度,引入欧拉角后即代表是按照12种顺归的某一种,三次绕某一轴旋转某一角度。
设我们有一点P经过ZYX顺归分别旋转了\alpha\beta \gamma 度得到点{P}’ ,记三次旋转的旋转矩阵为Z_{1} Y_{2} X_{3}


在内在旋转的情况下:
第一次旋转有P = Z_{1} \cdot P1
第二次旋转有P1 = Y_{2} \cdot P2
第三次旋转有P2= X_{3} \cdot P3{P}’ =P3
所以有P =Z_{1} \cdot Y_{2}\cdot X_{3}\cdot {P}’

在外在旋转的情况下:
第一次旋转有P = Z_{1} \cdot P1
第二次旋转有P = Y_{2} (Z_{1}\cdot P2)
第三次旋转有P= X_{3} ( (Z_{1}\cdot P2) \cdot P3) {P}’ =P3
所以有P =X_{3} \cdot Y_{2}\cdot Z_{1} \cdot {P}’


计算可以参考维基百科:

最后讲一下旋转矩阵它是一个正交矩阵,有一个重要的性质就是其矩阵转置等于其矩阵的逆,也就是A^{T} = A^{-1},在许多计算中都涉及到这一性质

从旋转旋转位移矩阵到变换矩阵

位移矩阵

说完旋转矩阵,再来看位移矩阵,它就比较简单啦。
就是在旋转完之后,再让向量/坐标系沿着X/Y/Z轴进行平移(在这里我们可以想一下点/向量位移与坐标系位移的区别,其实与主动旋转与被动旋转的关系一样)。
以下以被动旋转(坐标系旋转)为例,旋转矩阵我们表示为R,位移矩阵我们表示为t
那么就有{P}’ = R\cdot P+t
其中P、 {P}’ 、t为3行1列的矩阵,R为3行3列的矩阵。

欧式变换

针对{P}’ = R\cdot P+t做一个齐次变换,可以得到:\begin{bmatrix} {P}’ \\1\end{bmatrix}=\begin{bmatrix} R& t\\ 0^{T} &1\end{bmatrix}\cdot \begin{bmatrix} P \\1\end{bmatrix}
其中 0^{T} =[0,0,0]
我们令T=\begin{bmatrix} R& t\\ 0^{T} &1\end{bmatrix}
这个T就是我们常说的欧式变换矩阵。

其他变换矩阵

除去欧式变换,3D空间还有其它的变换方式。
相似变换,它允许物体进行缩放,矩阵表示为T_{S} =\begin{bmatrix} sR& t\\ 0^{T} &1\end{bmatrix},s为常数。
仿射变换,T_{A} =\begin{bmatrix} A& t\\ 0^{T} &1\end{bmatrix},A只需要是一个可逆矩阵。
射影变换,T_{P} =\begin{bmatrix} A& t\\ a^{T} &v\end{bmatrix}

最后

实际过程中我们往往也不会使用欧拉角去计算,由于欧拉角的万向锁问题(自由度丢失)和三角函数运算问题,四元素在描述旋转的计算中被用到的更多,关于万向锁问题可以参考这篇文章
本文从的欧拉角推到了变换矩阵,这样子的好处是足够直观、易于理解,我们知道了欧拉角,就能够得到旋转矩阵并得到旋转后的点(或者向量)的坐标。
但是实际应用中我们往往计算的是相反的情况,即我们通过变换前后的点的坐标,求出变换矩阵(或者旋转位移矩阵),然后得到欧拉角、位移等信息。
我认为可以遵循这样的想法:

  • 在求解变换矩阵的时候看作纯数学问题,也就是矩阵运算、线性代数相关;
  • 在从变换矩阵中提取角度和位移信息要特别注意旋转的顺归、外部旋转还是内部旋转、主动旋转还是被动旋转(在位移信息里对应是点的位移还是坐标系的位移);
  • 提取角度和位移信息并不是必须的,这只不过是反馈给我们一个直观感受,如果我们专注于计算,可以完全忽略这些不同的概念。