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

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

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

 

传说     

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

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

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

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

 

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

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

 

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

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

       把左乘和右乘表达为矩阵形式会让我们看的更清楚一些。依照qw的定义,q*qw*q^{-1}的矩阵形式为

        \left[  \begin{array}{ c c c c}1 & 0 & 0 & 0\\    0 & q_{1}^2+q_{2}^2-q_{3}^2-q_{4}^2 & 2q_{2}q_{3}-2q_{1}q_{4}         & 2q_{2}q_{4}+2q_{1}q_{3}         \\  0&    2q_{2}q_{3}+2q_{1}q_{4}         & q_{1}^2-q_{2}^2+q_{3}^2-q_{4}^2 & 2q_{3}q_{4}-2q_{1}q_{2}         \\   0 &  2q_{2}q_{4}-2q_{1}q_{3}         & 2q_{3}q_{4}+2q_{1}q_{2}         & q_{1}^2-q_{2}^2-q_{3}^2+q_{4}^2  \end{array} \right]\left[  \begin{array}{ c }0\\ wx\\ wy\\ wz  \end{array} \right]


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

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

       其实这张图解释了一个长久的疑问。为什么四元数q=(cos(\frac{\theta }{2} ),sin(\frac{\theta }{2} )*vx,sin(\frac{\theta }{2} )*vy,sin(\frac{\theta }{2} )*vz)里用的是\frac{\theta }{2}而不是\theta。这是因为q做的就是一个\frac{\theta }{2}的旋转,而q^{-1}也做了一个\frac{\theta }{2}的旋转。我们进行了两次旋转,而不是一次,这两次旋转的结果是一个旋转角为\theta的旋转。

 

四元数的元数学性质

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

四元数(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 个不同的根。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值