摘抄部分有意思的链接,如有不适,请移步原文。

参考知乎上的文章链接:如何形象地理解四元数?  ;一个详尽的可作为教程的翻译:理解四元数的中文翻译... ; 英文原文:http://www.3dgep.com/understanding-quaternions/。建议详细阅读。

传说

四元数由汉密尔顿发明,这一发明起源于十九世纪的某一天。在这一天早上,汉密尔顿下楼吃早饭。这时他的儿子问他,“爸爸,我们能够对三元数组(triplet,可以理解为三维向量)做乘法运算么?”汉密尔顿说“不行,我只能加减它们。”

这时来自21世纪的旁白旁先生说,“大家快来看十九世纪的数学家有多二,连内积和外积都不是知道。”

十九世纪的汉密尔顿也许确实不知道内积和外积,但是他知道,他想要的三维向量乘法要比内积和外积运算“高大上”很多。这一乘法运算要满足下列四条性质:
     1.运算产生的结果也要是三维向量
     2.存在一个元运算,任何三维向量进行元运算的结果就是其本身
     3.对于任何一个运算,都存在一个逆运算,这两个运算的积是元运算
     4.运算满足结合律

换而言之,汉密尔顿想定义的不是一个简单的映射关系,而是一个群!(后来我们知道四元数所在群为S3,而四元数所代表的三维旋转是SO(3),前者是后者的两倍覆盖)内积连性质1都不满足,外积不满足性质3。

汉密尔顿先生就这么被自己儿子提出的问题难倒了。经历了无数个日日夜夜,他绞尽脑汁也没想明白这个问题。终于有一天(1843年的一天),汉密尔顿先生终于意识到了,自己所需要的运算在三维空间中是不可能实现的,但在四维空间中是可以的,他是如此的兴奋,以至于把四元数的公式刻在了爱尔兰的一座桥上。

旁白:“WTF,我让你讲三维物体的旋转,你给我扯到四维空间上去。”

(不加说明,以下所说四元数全为单位四元数)
        其实,四元数有四个变量,完全可以被看作一个四维向量。单位四元数(norm=1)则存在于四维空间的一个球面上。,四元数乘以四元数其实看作(1)对进行左旋转,或者(2)对进行右旋转。所以从始至终,四元数定义的都是四维旋转,而不是三维旋转!任意的四维旋转都可以唯一的拆分为一个左旋转和一个右旋转,表达出来就是。这里,我们对四元数(四维向量)进行了一个左旋转和一个右旋转。结果当然是一个四元数,符合性质1。这个运算也同时符合性质2,3,4。

好了,说完了四维旋转,我们终于可以说说三维旋转了。说白了,三维旋转就是四维旋转的一个特例,就像二维旋转是三维旋转的一个特例一样。说是特例其实不准确,准确的说是一个子集或者subgroup。为了进行三维旋转运算,汉密尔顿首先在四维空间里划出了一块三维空间。汉密尔顿定义了一种纯四元数(pure quaternion),其表达式为。纯四元数第一项为零,它存在于四维空间的三维超平面上,与三维空间中的三维向量一一对应。然后,就有了我们常见的这种左乘单位四元数,右乘其共轭的表达式。我真心不知道汉密尔顿是怎么想出来的,不过回过头来看,这个运算形式是为了限制其运算结果所在的空间。简单的说,当对一个三维向量进行三维旋转后,我们希望得到的是一个三维向量。(如果你真能得到一个四维向量,就不敢自己在家转圈圈了吧,转着转着,就进入四次元了!)那么这个左乘单位四元数,右乘其共轭的运算保证了结果是一个在三维超平面上中的纯四元数。

把左乘和右乘表达为矩阵形式会让我们看的更清楚一些。依照的定义,的矩阵形式为

很明显,前面的矩阵虽然是一个4x4的四维旋转矩阵,但是它只是在右下角3x3的区域内和一个单位矩阵有所不同。所以说,它是一个限制在三维超平面上的四维旋转。如果表达式右边不是共轭,而是任意四元数,那么我们所作的就是一个很普通的四维旋转。如果只是左乘一个单位四元数,右边什么都不乘,那么我们得到的是四维旋转的一个子集,这个子集并不能保证结果限制在三维超平面上。如果只右乘,不左乘也是一样一样的。

说了这么多,对于坚持到最后的你,上图一幅,以表感谢。
       

其实这张图解释了一个长久的疑问。为什么四元数里用的是而不是。这是因为做的就是一个的旋转,而也做了一个的旋转。我们进行了两次旋转,而不是一次,这两次旋转的结果是一个旋转角为的旋转。

四元数的元数学性质

四元数是不可交换的 除环。实际上是在四维向量集合上定义了通常的向量加法和新的乘法运算,从而形成了一个环。( 除法环,除环不同于域,只是因为它们的乘法不需要交换。 然而,通过韦德伯恩的小定理,所有有限除环都是可交换的,因此是有限域。 历史上,除环有时被称为域,而域称为“交换域”)。

四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton,1805-1865)在1843年发明的数学概念。四元数的乘法不符合交换律(commutative law),故它似乎破坏了科学知识中一个最基本的原则。

明确地说,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间?,相对于复数为二维空间。

四元数是除环(除法环)的一个例子。除了没有乘法的交换律外,除法环与域是相类的。特别地,乘法的结合律仍旧存在、非零元素仍有唯一的逆元素。

四元数形成一个在实数上的四维结合代数(事实上是除法代数),并包括复数,但不与复数组成结合代数。四元数(以及实数和复数)都只是有限维的实数结合除法代数。

四元数的不可交换性往往导致一些令人意外的结果,例如四元数的 n-阶多项式能有多于 n 个不同的根。

三维空间应用

所有单位四元数的集合组成一个三维球S3和在乘法下的一个群(一个李群)。

S3是行列式为1的实正交3×3正交矩阵的群SO(3,R)的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。

群S3和SU(2)同构,SU(2)是行列式为1的复酉2×2矩阵的群。令A为形为a + bi + cj + dk的四元数的集合,其中a,b,c和d或者都是整数或者都是分子为奇数分母为2的有理数。集合A是一个环,并且是一个格。该环中存在24个四元数,而它们是施莱夫利符号为{3,4,3}的正二十四胞体的顶点。

映射关系

有两种方法能以矩阵表示四元数,并以矩阵之加法、乘法应用于四元数之加法、乘法。

第一种是以二阶复数矩阵表示。若 h = a + bi + cj + dk 则它的复数形式为:

这种表示法有如下优点:

所有复数 (c = d = 0) 就相应于一个实矩阵。

四元数的绝对值的平方就等于矩阵的行列式。

四元数的共轭值就等于矩阵的共轭转置。

对于单位四元数 (|h| = 1)而言,这种表示方式给了四维球体和SU(2)之间的一个同型,而后者对于量子力学中的自旋的研究十分重要。(请另见泡利矩阵)

第二种则是以四阶实数矩阵表示:

其中四元数的共轭等于矩阵的转置。

四元数转化为旋转角

四元数转化为旋转矩阵

旋转角度转换为四元数

参考文章:欧拉旋转、四元数、矩阵旋转之间的差异;

欧拉旋转定理

在三维空间中,任意一种旋转变换都可以归结为若干个沿着坐标轴旋转的组合,组合的个数不超过三个并且两个相邻的旋转必须沿着不同的坐标轴。因此,可以用三个沿着坐标轴旋转的角度来表示一个变换,称为Euler角。

旋转变换是不可交换的,根据旋转顺序的不同,有12种表示方式,分别为:XYZ、XZY、XYX、XZX、YXZ、YZX、YXY、YZY、ZXY、ZYX、ZXZ、ZYZ,可以自由选择其中的一种。对于同一个变换,旋转顺序不同,Euler角也不同,在指定Euler角时应当首先约定旋转顺序。

万向锁:http://vo.youku.com/v_show/id_XNzkyOTIyMTI=.html

文章详细讲解,以及解决方法:https://www.cnblogs.com/driftingclouds/p/6540222.html

欧拉角的“万向节死锁”问题,是由于欧拉旋转定义本身造成的。这种围绕选旋转前固定轴的先Z、再X、再Y的旋转操作,与其最终所预期的三个轴向可以旋转的结果并非一定是一对一的映射。某些情况下是多对一的映射,造成一些旋转自由度的缺失,也就是“死锁”。

欧拉旋转定理:为了方便讨论旋转,我们避开矢量长度的影响,也就是假设问题是基于长度为1的矢量去讨论。由上图可以看出,当长度为1时,矢量落在长度为1的圆形上,此时实数轴上的a = cos(φ),虚数轴上的b = sin(φ),其中φ为旋转角度。

此时的表示形式为 e = cos(φ) + sin(φ)i.

后记

各种位姿变换都有其特定的缺陷,使用旋转矩阵在变换角为0或者pi/2时会出现病态矩阵,使用欧拉角容易出现万向锁,使用四元数可以降低位姿变换-旋转平移运算的计算量。

比如:两个正交旋转矩阵的复合需要27次乘法和18次加法,而通过四元数的形式只需要16次乘法和12次加法,降低1/3的计算量。但是四元数的不可交换性,往往导致令人意外的结果,例如四元数的 n-阶多项式能有多于 n 个不同的根。

三维重建3:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数相关推荐

  1. 旋转矩阵|万向锁|四元数

    文章目录 旋转公式 2D 3D 万向锁 四元数 3D旋转公式 Reference 旋转公式 2D 矩阵形式 v′=[cos(θ)−sin(θ)sin(θ)cos(θ)]vv' = \begin{bma ...

  2. 三维重建面试3:旋转矩阵-病态矩阵、欧拉角-万向锁、四元数

    摘抄部分有意思的链接,如有不适,请移步原文. 参考知乎上的文章链接:如何形象地理解四元数? 四元数由汉密尔顿发明,这一发明起源于十九世纪的某一天.在这一天早上,汉密尔顿下楼吃早饭.这时他的儿子问他,& ...

  3. 旋转矩阵欧拉角万向锁详解

    物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Zb}相对于参考坐标系{A}的方向余 ...

  4. unity 旋转欧拉角 万向锁 解释

    万向锁 一直困惑我很久....原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴.问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会 ...

  5. 【OpenGL_02】欧拉角、万向锁、四元数

    文章目录 欧拉角 万向锁 四元数 四元数的矩阵乘法及其可易性 蜕变矩阵 四元数的矩阵乘法 欧拉角 引用博客欧拉角与旋转矩阵的转换关系 欧拉角就是我们日常生活中常用的表示旋转的三维向量的乘积. 在Uni ...

  6. 万向锁的理解 欧拉角 四元数

    1 欧拉角&万向锁 欧拉角和万向锁 视频资料理解万向锁 核心是嵌套 以一个三自由度的机械臂为例,三个旋转轴互相垂直,相当于x,y,z轴 三个机械臂通过旋转关节依次串联,定义第一个关节旋转轴为J ...

  7. 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

    目录 1 概述 2 原理 2.1 旋转矩阵 2.1.1 绕x轴旋转 2.1.2 绕y轴旋转 2.1.3 绕z轴旋转 2.2 欧拉角 2.2.1 基本思想 2.2.2 欧拉角的缺点 2.3 四元数 2. ...

  8. 旋转矩阵、欧拉角、万向锁详解

    旋转矩阵.欧拉角.万向锁详解 一:物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Z ...

  9. 旋转矩阵、欧拉角,万向锁的危害

    1. 万向锁会带来什么危害? 最近看了很多万向锁的文章,大家都集中于讲述万向锁的成因,最后都会加上句"导致缺失一个方向的自由度",但是万向锁现象到底会给实际工作带来什么问题?具体点 ...

最新文章

  1. Linux安装CentOS6(图文详解)新手入门
  2. 清除浮动的几种常见方法
  3. Ibatis学习总结1--ibatis简介和SQL Maps
  4. 卧槽!微信可以改彩色昵称了!又get一个撩妹小技巧 ~~
  5. LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
  6. ModelAndView介绍
  7. HTML DOM getElementsByName() 方法
  8. 学习《apache源代码全景分析》之DSO概念
  9. SAP Hybris安装包里自带的apache ant
  10. Memcache 缓存系统
  11. imageio.write页面怎么显示_微信吃喝玩乐怎么没有了?微信支付页面吃喝玩乐在哪里...
  12. CAD地形图等图案填充在视口中无法正常显示
  13. 使用Windows Sysprep来封装系统
  14. [codevs1746][NOI2002] 贪吃的九头龙 树形DP
  15. UE4 Slate二 用UMG思想去理解Slate+Slate编码
  16. GPS接收机设计(5)——定位解算
  17. 在来电监听服务中动态注册去电广播(BroadcastRecevier)
  18. 如何实现企业全链路协同,实现企业业绩增长
  19. 【大学软件测试基础】余额宝提现 - 等价类划分法
  20. 视频云存储空间(谷歌云端硬盘)

热门文章

  1. response响应对象参数和方法是啥?怎么发送带请求头的请求(headers参数)怎么发送带参数的请求?cookieJar的转换方法是什么?
  2. Python爬虫:中国结算,关于新开股票账户数等参数数据的爬取
  3. IDEA 关于两个分支代码合并的操作
  4. 一个网站完整详细的SEO优化方案
  5. python 合并word文件_使用python docx合并word文档
  6. 做自己的m3u8点播系统使用HTTP Live Streaming
  7. 游戏元素属性的设计原则
  8. Maven下载及目录结构
  9. c语言解除宏定义_C语言宏定义 define,及一些陷阱!
  10. pb中操作excel表格函数