一、前言
为了大家方便查询,先结论,再给出推导过程(四元数的相关知识,公式转换与过程推导在下一篇博客)

旋转矩阵 旋转向量 欧拉角 四元数
旋转矩阵 1
旋转向量
欧拉角
四元数

1、旋转矩阵→旋转向量、欧拉角:
2、旋转向量→旋转矩阵、欧拉角:
3、欧拉角→旋转矩阵、旋转向量:

二、旋转矩阵
关于旋转矩阵的推导,大家可以参考之前的博客:
史上最简SLAM零基础解读(1) - 旋转平移矩阵→欧式变换推导
这里就不再次进行讲解了

三、旋转向量→旋转矩阵
1、理论阅读
首先要了解什么是旋转向量,来看看《视觉SLAM十四讲》第二版第3讲(三维空间刚体运动):有了旋转矩阵来描述旋转,有了变换矩阵描述一个 自由度的三维刚体运动,是不是已经足够了呢?矩阵表示方式至少有以下两个缺点:
1.SO(3) 的旋转矩阵有9个量,但一次旋转只有3个自由度。因此这种表达方式是冗余的。同理,变换矩阵用 16 个量表达了 自由度的变换。那么,是否有更紧凑的表示呢?
2.旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为 。变换矩阵也是如此。当想估计或优化一个旋转矩阵或变换矩阵时,这些约束会使得求解变得更困难。

因此,我们希望有一种方式能够紧凑地描述旋转和平移。例如,用一个三维向量表达旋转,用一个六维向量表达变换,可行吗?事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角/角轴, Axis-Angle) ,只需一个三维向量即可描述旋转。同样,对于变换矩阵,我们使用一个旋转向量和一个平移向量即可表达一次变换。这时的变量维数正好是六维。

考虑某个用R表示的旋转。如果用旋转向量来描述,假设旋转轴为一个单位长度的向量n角度为 那么向量。”也可以描述这个旋转。于是,我们要问,两种表达方式之间有什么联系吗?事实上推导它们的转换关系并不难。从旋转向量到旋转矩阵的转换过程由罗德里格斯公式(Rodrigues’s Formula) 表明,由于推导过程比较复杂,这里不做描述,只给出转换的结果:



从这里,对于旋转矩阵有了大致的了解,那么下面就来推导以下 罗德里格斯公式 吧!

2、公式推导→基础简介
下面的推导摘录 https://krasjet.github.io/quaternion/quaternion.pdf,本人为了熟悉推导过程,所以抄写了一遍。



(1) 假设我们有一个经过原点的(如果旋转轴不经过原点我们可以先将旋转轴平移到原点,进行旋转,再平移回原处),旋转轴


我们希望将一个向量v,沿着这个旋转轴旋转 θ度,变换到 v′, 如上图所示。
(2) 注意,在这篇教程中我们将使用右手坐标系统,并且我们将使用右手定则来定义旋转的正方向,你可以将右手拇指指向旋转轴 u的正方向,这时其它四个手指弯曲的方向即为旋转的正方向.在上图中即为逆时针方向。
(3) 在轴角的表示方法中,一个旋转的定义需要使用到四个变量:旋转轴 v的x,y,z 坐标,以及一个旋转角θ,也就是我们一共有四个自由度 (Degree of Freedom)。这很明显是多于欧拉角的三个自由度的,实际上,任何三维中的旋转只需要三个自由度就可以定义了,为什么这里我们会多出一个自由度呢?其实,在我们定义旋转轴 v的x,y,z 坐标的同时,我们就定义了u 的模长(长度).然而,通常情况下,如果我们说绕着一个向量 u 旋转,我们其实指的是绕着 u所指的方向进行旋转。回忆一下向量的定义:向量是同时具有大小和方向的量,但是在这里它的大小(长度)并不重要。我们可以说绕着



虽然这两个向量完全不同,但是它们指向的都是同一个方向(即z轴的方向):



在三维空间中定义一个方向只需要用到两个量就可以了(与任意两个坐标轴之间的夹角),最简单的例子就是地球的经纬度,我们仅仅使用经度和纬度两个自由度就可以定义地球上任意一个方位。而如果我们要表示某一个方位上的特定一个点,则还需要添加海拔这个自由度。为了消除旋转轴 u模长这个多余的自由度, 我们可以规定旋转轴 u的模长为


也就是说 u是一个单位向量,这样一来,空间中任意一个方向上的单位向量就唯一代表了这个方向.我们其实可以将模长规定为任意的常量,但是规定∣∣u∣∣=1 能为我们之后的推导带来很多的便利,这也是数学和物理中对方向定义的惯例.在实际代码的实现中,你也可以让用户输入一个非单位长度的旋转轴向量u,但是在进行任何的计算之前你必须要记得先将它转化为一个单位向量:



3、公式推导→旋转的分解
(1) 有上面这个约束,我们现在就可以开始思考怎么样进行这个旋转了,首先,我们可以将v 分解为



(2) 可以分别旋转这两个分向量,再将它们旋转的结果相加获得旋转后的向量:



下面是分解的示意图:









注意叉乘的顺序,因为我们使用的是右手坐标系统,按照右手定则你可以发现这个新的向量w 指向






因为叉乘遵守分配律,则:




这样我们就得到了一般形式的旋转公式→3D 空间中任意一个v 沿着单位向量u 旋转θ 角度之后的v′为:
v′=cos(θ)v+(1−cos(θ))(u⋅v)u+sin(θ)(u×v)
不过呢,在 slam 中上面这个这个公式通常使用矩阵的形式表示,这里令v′=Rv,然后等式两边都除以v,那么并且其上u 的叉乘,写成u^的形式,那么可以得到



把上式的u 换成u 便可以得到(01)式,这样就完成了推导。


四、旋转矩阵 →旋转向量
根据上面的推导,获得了:



如果要根据旋转矩阵求得旋转向量,也就是要求单位方向向量n,以及围绕该方向向量旋转的角度θ,对于角度θ 还是很好求的,对矩阵的两边都求迹:



那么剩下的就是要求旋转轴n (单位方向向量),需要注意的是旋转轴上的向量在旋转之后不发生改变旋转轴上的向量在旋转之后不发生改变,也就是成立如下公式等式:


Rn=n=1n