搞懂欧拉角、旋转矩阵、四元数

之前一直用旋转矩阵的转换,或者直接从机械臂中导出四元数,最近需要看懂一篇文章里面的推导公式,特地记录一下各个概念。

1.1 roll(横滚)、pitch(俯仰) 、 yaw(偏航)

关于右手笛卡尔坐标系的 x、y 和 z 轴的主动旋转分别叫做 roll(横滚)、pitch(俯仰) 和 yaw(偏航) 旋转。(参考)
搞懂欧拉角、旋转矩阵、四元数_第1张图片

1.2内在旋转(intrinsic rotations)和外在旋转(extrinsic rotations)

这两个概念通过下图进行说明:即内在旋转每次旋转围绕的轴是上次旋转之后坐标系的某个轴,外在旋转每次旋转的轴是固定坐标系中的轴。
搞懂欧拉角、旋转矩阵、四元数_第2张图片

1.3旋转矩阵

主动旋转和被动旋转:主动旋转是指将向量或坐标系逆时针围绕旋转轴旋转,被动旋转是对坐标轴进行的逆时针旋转,相当于主动旋转的逆操作。
旋转矩阵有二维旋转和三维旋转,研究需要这里仅讨论三维旋转(被动旋转)。
搞懂欧拉角、旋转矩阵、四元数_第3张图片
假设OP为单位矢量且在XY平面内,则OP矢量在O-XYZ坐标系中坐标为,在新坐标系O-X’Y’Z’中的坐标为,展开之后为,写成矩阵的形式如下: 搞懂欧拉角、旋转矩阵、四元数_第4张图片
将上式中的3*3的变换矩阵称为旋转矩阵。从Fig. 3中可以看出,被动旋转相当于将矢量OP绕Z轴主动顺时针旋转θ角。

1.4 经典欧拉角(Proper Euler angles)和泰勒布莱恩角(Tait-Bryan angles)

这两种欧拉角是按照旋转轴的顺序定义的,经典欧拉角是按照Z-X-Z,Y-X-Y,X-Y-X,Z-Y-Z,X-Z-X,Y-Z-Y这样的轴序旋转,即第一个旋转轴和最后一个旋转轴相同;而泰勒布莱恩角是按照X-Y-Z,Y-Z-X,Z-X-Y,X-Z-Y,Z-Y-X,Y-X-Z这样的轴序旋转,即每次旋转轴都不相同。
搞懂欧拉角、旋转矩阵、四元数_第5张图片
搞懂欧拉角、旋转矩阵、四元数_第6张图片
搞懂欧拉角、旋转矩阵、四元数_第7张图片
欧拉角的表示方式比较直观,但是有几个缺点 ?(还没搞懂的知识
(1) 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。比如,同样的yaw-pitch-roll顺序,(0,90,0)和(90,90,90)会将刚体转到相同的位置。这其实主要是由于万向锁(Gimbal Lock)引起的
(2) 欧拉角的插值比较难。
(3) 计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,计算量较大。

举例表明

搞懂欧拉角、旋转矩阵、四元数_第8张图片
计算旋转矩阵一定要明确旋转顺序和旋转模式(内在旋转还是外在旋转,主动旋转还是被动旋转),由于内在旋转易于图解表达,通常使用内在旋转说明。如图4所示,旋转顺序为Z-X-Z的被动内在旋转。假设矢量OP在O-xyz坐标系中的坐标为OP0=(x, y, z),在O-XYZ坐标系中的坐标为OP=(X, Y, Z),分解计算步骤如下:
搞懂欧拉角、旋转矩阵、四元数_第9张图片
可以得到OP矢量在新坐标系中的坐标与在旧坐标系中的坐标之间的关系为 ,所以总的旋转矩阵为,采用Matlab的符号计算可以得到该旋转矩阵的展开形式。

1.5 四元数

四元数是简单的超复数。 复数是由实数加上虚数单位 i 组成,其中i²= -1。 相似地,四元数都是由实数加上三个虚数单位 i、j和k 组成,而且它们有如下的关系: i² = j² = k² = -1, iº = jº = kº = 1 , 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi+ cj + dk,其中a、b、c 、d是实数。

对于i、j和k本身的几何意义可以理解为一种旋转,其中i旋转代表Z轴与Y轴相交平面中Z轴正向向Y轴正向的旋转,j旋转代表X轴与Z轴相交平面中X轴正向向Z轴正向的旋转,k旋转代表Y轴与X轴相交平面中Y轴正向向X轴正向的旋转,-i、-j、-k分别代表i、j、k旋转的反向旋转。
搞懂欧拉角、旋转矩阵、四元数_第10张图片
同时引入轴角的概念加以理解四元数的的四个数。轴角是一个以单位矢量定义的旋转轴,再加上一个标量定义的旋转角来表示的旋转。通常的表示为[x,y,z,theta],前面三个表示轴,最后一个表示角度。表示非常直观,也很紧凑。但轴角最大的一个局限就是不能进行简单的插值,此外,轴角形式的旋转不能直接施于点或矢量,必须转换为矩阵或者四元数。

四元数感觉上就是轴角的进化,也是使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即(x,y,z,w)(对应前文所述的a,b,c,d), 其中

w = cos(theta/2)
x = ax * sin(theta/2)
y = ay * sin(theta/2)
z = az * sin(theta/2)

其中(ax,ay,az)表示轴的矢量,theta表示绕此轴的旋转角度。四元数中的每个数都是经过“处理”的轴和角,轴角描述的“四元组”并不是一个空间下的东西,首先(ax,ay,az)是一个3维坐标下的矢量,而theta则是级坐标下的角度,简单的将他们组合到一起并不能保证他们插值结果的稳定性,因为他们无法归一化,所以不能保证最终插值后得到的矢量长度(经过旋转变换后两点之间的距离)相等,而四元数在是在一个统一的4维空间中,方便归一化来插值,又能方便的得到轴、角这样用于3D图像的信息数据,所以用四元数再合适不过了。相比于矩阵,四元素也只要存储4个浮点数,优势很明显。

四元数的各种转换
四元数转欧拉角 [r1,r2,r3]=quat2angle([q0 q1 q2 q3],S) 注:S 的选择有12种,【‘ZYX’,‘ZYZ’,‘ZXY’,‘ZXZ’,‘YXZ’,‘YXY’,‘YZX’,‘YZY’,‘XYZ’,‘XYX’,‘XZY’,‘XZX’】

参考资料:

https://yongqiang.blog.csdn.net/article/details/89195271
https://blog.csdn.net/zhwzhaowei/article/details/83688266
https://www.guyuehome.com/19226
https://baike.baidu.com/item/%E5%9B%9B%E5%85%83%E6%95%B0/5795379?fr=aladdin
https://blog.csdn.net/shenshen211/article/details/78492055

你可能感兴趣的:(线性代数)