旋转矩阵、欧拉角、四元数理论及其转换关系

摘要:
本文主要介绍了旋转矩阵、欧拉角、四元数的基本理论及其之间的转换关系。这三个角度称为欧拉角。每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴。因此,使用欧拉角前,必须先做好明确的定义。)欧拉角的缺点1、欧拉角的表示方式不唯一。S3是行列式为1的实正交3x3正交矩阵的群SO(3,R)的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。

博客转载自:http://blog.csdn.net/lql0716/article/details/72597719

1. 概述

旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的复杂度。

本文主要介绍了旋转矩阵、欧拉角、四元数的基本理论及其之间的转换关系。

2、原理

2.1 旋转矩阵

  • 对于两个三维点p1(x1,y1,z1)p2(x2,y2,z2),由点p1经过旋转矩阵R旋转到p2,则有

旋转矩阵、欧拉角、四元数理论及其转换关系第1张

注:旋转矩阵为正交矩阵RRT=E

旋转矩阵、欧拉角、四元数理论及其转换关系第2张

任意旋转矩阵:
任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角
三个轴可以指固定的世界坐标系轴,也可以指被旋转的物体坐标系的轴。三个旋转轴次序不同,会导致结果不同。

2.2 欧拉角

欧拉角有两种:
静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。
动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。
使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。

对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。

如图1,设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。zxz顺规的欧拉角可以静态地这样定义:

α 是x-轴与交点线的夹角, 
β 是z-轴与Z-轴的夹角, 
γ 是交点线与X-轴的夹角。

旋转矩阵、欧拉角、四元数理论及其转换关系第3张

图中三个欧拉角分别为:(α,β,γ)
蓝色的轴为:xyz
红色的轴为:XYZ
绿色的线为交线:N
α[0,2π],β[0,π],γ[0,2π]

很可惜地,对于夹角的顺序和标记,夹角的两个轴的指定,并没有任何常规。科学家对此从未达成共识。每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴。

实际上,有许多方法可以设定两个坐标系的相对取向。欧拉角方法只是其中的一种。此外,不同的作者会用不同组合的欧拉角来描述,或用不同的名字表示同样的欧拉角。因此,使用欧拉角前,必须先做好明确的定义。

欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。
Yaw(偏航):欧拉角向量的y轴
Pitch(俯仰):欧拉角向量的x轴
Roll(翻滚): 欧拉角向量的z轴

Unity3D中,欧拉旋转是按照ZYX的顺序旋转的。(不同的旋转顺序最终得到的结果是不一样的,要引起重视。给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之,若刚体需要按照两种不同的旋转顺序旋转到相同的朝向,所需要的欧拉角角度值则是不同的!)

欧拉角的缺点

1、 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。这其实主要是由于万向锁(Gimbal Lock)引起的;
2、欧拉角的插值比较难;
3、计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,计算量较大;

2.2.1 由欧拉角求旋转矩阵

设三个轴x,y,z的欧拉角分别为θx,θy,θz,正弦值、余弦值分别为sx,cx,sy,cy,sz,cz那么旋转矩阵为:

旋转矩阵、欧拉角、四元数理论及其转换关系第4张

2.2.2 由旋转矩阵求欧拉角

旋转矩阵、欧拉角、四元数理论及其转换关系第5张

解方程可得:

旋转矩阵、欧拉角、四元数理论及其转换关系第6张

注:atan2()为C++中的函数,atan2(y,x) 求的是y/x的反正切,其返回值为[-pi,+pi]之间的一个数。

2.3 四元数

四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton)在1843年提出。

三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle表示方法。这种表示方法里,Axis可用一个三维向量(x,y,z)来表示,θ可以用一个角度值来表示,直观来讲,一个四维向量(θ,x,y,z)就可以表示出三维空间任意的旋转。注意,这里的三维向量(x,y,z)只是用来表示axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis,而用该三维向量的长度来表示角度值θ。这样以来,可以用一个三维向量(θx,θy,θz)就可以表示出三维空间任意的旋转,前提是其中(x,y,z)是单位向量。这就是旋转向量(Rotation Vector)的表示方式,OpenCV里大量使用的就是这种表示方法来表示旋转(见OpenCV相机标定部分的rvec)。

  • 单位向量(x,y,z)旋转θ角度后的四元数:

旋转矩阵、欧拉角、四元数理论及其转换关系第7张

对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。

2.3.1 四元数基本概念

  • 四元数的复数定义:

q=q0+q1i+q2j+q3k=[s,v]
其中 q0,q1,q2,q3均为实数, s=q0,v=[q1,q2,q3],i2=j2=k2=−1
对于 i,j,k 本身的几何意义可以理解为一种旋转,其中 i 代表 x 轴与 y 轴相交平面中 x 轴正向向 y 轴正向的旋转, j 旋转代表 z 轴与 x 轴相交平面中 z 轴正向向 x 轴正向的旋转,
k 旋转代表 y 轴与 z 轴相交平面中 y 轴正向向 z 轴正向的旋转, −i,−j,−k 分别代表 i,j,k 的反向旋转。

四元数的模

旋转矩阵、欧拉角、四元数理论及其转换关系第8张

四元数的优点

非奇异表达(和欧拉角之类的表示相比)
比矩阵更紧凑(更快速)
单位四元数的对可以表示四维空间中的一个旋转

四元数与群

所有单位四元数的集合组成一个三维球S3和在乘法下的一个群(李群)。S3是行列式为1的实正交3x3正交矩阵的群SO(3,R)的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。
群S3和SU(2)同构,SU(2)是行列式为1的复酉2x2矩阵的群。 设A={q=q0+q1i+q2j+q3k|q0,q1,q2,q3均为实数},则A是一个环,并且是一个格,A中存在24个四元数,而它们是施莱夫利符号为{3,4,3}的正二十四胞体的顶点。

四元数的运算

旋转矩阵、欧拉角、四元数理论及其转换关系第9张

旋转矩阵、欧拉角、四元数理论及其转换关系第10张

旋转矩阵、欧拉角、四元数理论及其转换关系第11张

四元数乘法的性质

1、满足结合律 
2、不满足交换律 
3、乘积的模等于模的乘积 
4、乘积的逆等于各个四元数的逆以相反的顺序相乘

2.3.2 四元数求旋转矩阵

  • 已知四元数:

旋转矩阵、欧拉角、四元数理论及其转换关系第12张

2.3.3 旋转矩阵求四元数

旋转矩阵、欧拉角、四元数理论及其转换关系第13张

旋转矩阵、欧拉角、四元数理论及其转换关系第14张

旋转矩阵、欧拉角、四元数理论及其转换关系第15张

旋转矩阵、欧拉角、四元数理论及其转换关系第16张

四元数的详细解释:https://www.3dgep.com/understanding-quaternions/#Introduction

免责声明:文章转载自《旋转矩阵、欧拉角、四元数理论及其转换关系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇网站自动登录功能的设计Google 历年笔试面试30题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

四元数运算

四元数运算[编辑] 四元数运算在电动力学与广义相对论中有广泛的应用。四元数可以用来取代张量表示。有时候采用带有复数元素之四元数会比较容易,导得结果不为除法代数之形式。然而亦可结合共轭运算以达到相同的运算结果。 此处仅讨论具有实数元素之四元数,并将以两种形式来描述四元数。其中一种是向量与标量的结合,另一形式两个创建量(constructor)与双向量(b...

基于CSS3的3D旋转效果

自从有了html5和css3,好多以前只能想想的华丽效果都可以上手实现了。3D 转换(个人认为3D变换更贴切^)就是其中之一。关于3D转换,可以阅读CSS3 3D transform变换,不过如此,文中对3D转换进行了形象、生动、详细的阐述。在这里,只和大家讨论怎么利用3D转换来实现立体及其旋转效果,例如: 好吧,废话不多说,上代码! 1.页面代码 1...

首个threejs项目-前端填坑指南

第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水好深,满满的都是坑,填都填不过来。经过老板20天惨无人道的摧残,终于小有成就。 因为第一次搞这玩意,相对的遇到的问题也是大把的,让我来一一诉说一路上遇到的各种问题。 开发使用: C4D、Blender2.75、[threejs-r72](http:...

VTK 空间几何变换(Transform),平移、旋转和缩放

先看下面的模型,这是一个Cow的三维模型, 在使用中,你是否会有下面的操作? 1.将Cow移动到某个位置——平移 2.转动到Cow背面——旋转 3.改变它大小——缩放 等等 可能你会说,这还不简单,通过操作相机就好了。然而并不是这样,操作相机,只使得相机的空间位置发生了变化,对三维物体并没有改变,要想改变模型,就需要对模形本身做空间变换。 空间变换的基础...

iOS将image转90,180,270度的方法

http://blog.sina.com.cn/s/blog_6602ffbc0101ckx3.html 这里要分享的是将image旋转,而不是将imageView旋转,原理就是使用quartz2D来画图片,然后使用ctm变幻来实现旋转。 注:quartz2D的绘图左边和oc里面的绘图左边不一样,导致绘画出的图片是反转的。所以一上来得使它转正再进行进一步的...

C#图片动画效果(旋转360度)异步

private void Button1_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics(); graphics.Clear(Color.W...