三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

时间:2024-04-08 12:55:26

欧拉角(Euler Angle)

在上面这些表示方式中,我们最容易理解的就是欧拉角了。这种表示方式在飞行器中使用的很多。

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

在欧拉角的表示中,yaw、pitch、roll的顺序对旋转结果是有影响的。即给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之,若刚体需要按照两种不同的旋转顺序旋转到相同的朝向,所需要的欧拉角角度值则是不同的!

另外需要注意的是,在欧拉角的表示方式里,三个旋转轴一般是随着刚体在运动,即wikipedia中所谓的intrinsic rotation,见下图动画所示(图来自wikipedia)。相对应的另一种表示方式是,三个旋转轴是固定的,不随刚体旋转而旋转,即extrinsic rotation,这种表示方式在计算机视觉中不是很常用

欧拉角的优点是非常直观,但是会有以下几个缺点:

  1. 欧拉角表示方式不唯一。由上面分析知道当yaw、pitch、roll的顺序变换后,会有不同的组合可以达到同样的效果。

  2. 万向锁问题。

旋转矩阵

其实在计算坐标变换时,我们使用最多的表示旋转的方式是其实旋转矩阵。三维空间中的旋转矩阵是3×3的矩阵,将欧拉角变换为旋转矩阵的计算方式如下:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

其中,三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数分别是欧拉角的yaw、pitch和roll角。上述结果是三个旋转矩阵(三个角度上的旋转)连续相乘的结果。

由上,我们可以看出,如果yaw、pitch和roll的顺序发生改变,矩阵相乘的顺序需要作出相应改变,所得的旋转矩阵的结果也会发生变化。

旋转矩阵虽然有9个元素,但是其实只有三个*度,所以旋转矩阵各行各列之间一定是互相正交的,同时因为旋转矩阵的不包含尺度变换,因此旋转矩阵一定要是正交矩阵(逆矩阵等于转置矩阵

此外,其实旋转矩阵也叫作方向余弦矩阵(Direction Cosine Matrix),简称DCM,这种表示叫法在陀螺力学领域较为常用。DCM的名字来历其实是用欧拉角之外的另一种用三个角度值表示三维旋转的方式。这种表示方法原理是:假设刚体在起始朝向时三个坐标轴的向量为三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数,而刚体在目标朝向时的三个坐标轴的向量为三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数,则该旋转可以通过三个坐标轴分别与原始坐标轴的夹角表示,如下图所示:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

DCM就是旋转矩阵。


旋转向量

旋转向量是使用三维向量的形式来表示旋转。三维空间中的任意一个旋转,都是可以用绕三维空间中的某个轴旋转过某个角度(轴角表示)来表示,这就是所谓的三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数表示方法。这种表示方法中,轴AxisAxis可以使用一个三维单位向量三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数来表示,三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数可以使用一个角度值三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数来表示。所以,客观来说,一个四维向量三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数就可以表示出三维空间任意的旋转。但是其实可以使用更紧凑的表示方式–旋转向量三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数来表示三维空间中的任意旋转。

旋转向量三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数的来源是轴角表示。它与旋转矩阵的转换可以通过指数映射与罗德里格斯公式完成。

四元数

旋转矩阵的表示具有冗余性(使用9个量表示3个*度的旋转),欧拉角和旋转向量是紧凑的,但是具有奇异性。所以,此处我们会再介绍一种常用的表示旋转的方式,四元数(Quaternion)

四元数使用复数的形式来表示旋转

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

其中三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数是四元数的三个虚部。这三个虚部满足关系式:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

所以,也可以使用一个标量与一个向量来表示四元数:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

同时,我们一般使用单位四元数来表示三维空间中任意一个旋转。对于绕单位向量三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数进行了角度为三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数的旋转,这个旋转的四元数形式为:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

此处需要说明的是,对于旋转的角度三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数,我们将其加上三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数,得到的四元数三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数会变为三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数,所以,四元数有一个性质,任意旋转可以使用两个互为相反数的四元数来表示。并且从上面这个公式,我们也可以看出,使用单位四元数可以表示任意一个旋转

并且,对于一个旋转角度为0的旋转,表示它的四元数是:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

反之,从四元数中恢复出轴角可以使用如下:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

之所以四元数会这么受欢迎(虽然它很不直观),是因为它有一些神奇的性质。

四元数的神奇1

第一个,我们使用四元数对一个三维点三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数进行旋转变换(旋转由一个轴角三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数指定)。此时,首先将三维空间点用一个虚四元数来描述:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

这相当于我们把四元数的三个虚部与空间中的三个轴对应。然后用四元数三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数来表示这个旋转:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

那么旋转后的点三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数可以表示为如下的乘积:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

最后的计算结果的实部一定为0,所以是纯虚四元数表示一个空间点位置

四元数的神奇2(乘法)

首先四元数的复数形式是:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

对于两个四元数

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

他们的乘积为(不可交换)就是两个复数想成的结果:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

之所以介绍四元数的乘法,是因为,对于两次旋转的叠加,是可以直接使用四元数的乘法实现。

并且,从上面的乘法,我们也可以看出,对于四元数来说,对应单位矩阵的四元数是(1,0,0,0),同时四元数的其实就等于四元数的共轭

四元数相对时间的导数

首先,先介绍一个四元数关于轴角的表示(上面也有讲过):

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

所以这样,在角度接近0时(时间变化很小时近似角度为0),四元数近似为三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

上式中:

三维中间中旋转的表示方式--欧拉角、旋转矩阵、旋转向量、四元数

是旋转向量对时间的导数,可以理解为角速度向量

使用Eigen库

Eigen库是一个开源的c++线性代数库,提供了快速的有关矩阵的线性代数运算,还包括解方程的功能。同时它还提供了几何模块,可以表示旋转的多种表示方式,包括上面提到的旋转矩阵、旋转向量、四元数等等。