一、背景知识:点乘、叉乘
复数的点乘:(ai+bj+ck)•(xi+yj+zk)=-(ax+by+cz)
复数的叉乘:(ai+bj+ck)×(xi+yj+zk)=(ax)i×i+(ay)i×j+(az)i×k+(bx)j×i+(by)j×j+(bz)j×k+(cx)k×i+(cy)k×j+(cz)k×k
ijk三轴定义如上图所示。满足右手螺旋定则:
(这个不是太明白,但是用的时候确实是这么计算的)
二、二维复数表示旋转
二维复数可以表示二维平面上的旋转。
如:定义待旋转的复数p=2+i,定义旋转因子q=cos45+isin45
则
如下图所示
旋转因子q左乘被旋转复数p表示p逆时针转45°。
三、为什么三维旋转用四维复数表示而不用三维复数
原贴见:
https://blog.csdn.net/u011760195/article/details/85346704
若用实轴x、ij两个虚轴表示旋转因子q和被旋转复数p,那么p绕某个轴转动时,有: x轴绕j轴转动:x×(a+bi) [j不出现] i轴绕x轴转动:i×(a+bj) [x不出现]
此时会出现一个问题,i×j这一项并不能表示实轴x,因为没有规定。i×i=-1是可以的,但i×j不是实数。因此,由于ijx三轴虽然呈相互垂直关系,但无法用叉乘相互表示,不满足计算的需求。因此引入四维复数(四元数),在三维复数的基础上再引入一个虚轴k,而将实轴x=0隐去,此时ijk三轴满足叉乘相互表示(右手螺旋定则)。
因此,用四维复数替代三维复数只是因为实轴x无法通过ij叉乘表示,不满足计算需要而已。将四维复数的实部置零,形式上是四维,当实际上用的时候是三维,实部是不需要的。
另一个角度思考:(如被转复数p=2只含有实部时,这个点既可以说是一维轴上的一个点,也可以说是二维平面内的一个点。低维的点、线、面等都既可以存在于它自身的维度上,又可以存在于任意更高的维度内。)二维中,旋转因子q=a+bi可以将原本在实轴上的一维的点转进二维的平面里。乘以几维的复数就是在几维空间中进行旋转,比如乘以四维复数,那么就是在四维空间中进行旋转。但是旋转并不一定会把实轴上的一维的p转到二维平面上去,比如二维平面上有p=2,旋转因子定义为q=3,那么p、q都可以看做虚部为0的二维复数,此时旋转p’=q×p=6,此时的旋转只是在实轴上,并没有把p转进二维平面上。四元数表示的三维空间中的旋转也是这个道理,p是一个纯四元数,实部为0,是实实在在的三维空间中的一个向量,我们对p乘以另一个四元数q时,实际上是在四维空间中进行的一个旋转,只不过如同二维平面上一样,我们可以通过某种方式让p的旋转只保持在三维空间中,而不至于转到四维空间中去。
另外,引自:
https://blog.csdn.net/linyijiong/article/details/79777399
…所以从始至终,四元数定义的都是四维旋转,而不是三维旋转!……说白了,三维旋转就是四维旋转的一个特例,就像二维旋转是三维旋转的一个特例一样。……qpq-1这种左乘单位四元数,右乘其共轭的表达式……这个运算形式是为了限制其运算结果所在的空间。简单的说,当对一个三维向量进行三维旋转后,我们希望得到的是一个三维向量。……那么这个左乘单位四元数,右乘其共轭的运算保证了结果是一个在三维超平面上中的纯四元数。
四、四元数的书写表示
设四元数表示为:[s,v],其中s为一个实数,是四元数的实部。v是纯虚数,v=xi+yj+zk。则四元数的叉乘计算为:q1×q2=[sa , va]×[sb , vb]=[sa•sb+va•vb , sa•vb+sb•va+va×vb]
定义:
单位四元数:q=[s , v],|q|=1
纯四元数:q=[0 , v],即实部为0,是一个三维空间中的向量
五、四元数表示旋转
原贴见:
https://blog.csdn.net/linyijiong/article/details/79777399
二维空间中,旋转因子q=cosθ+sinθi,由上一部分的四元数书写表示,亦可将二维的旋转因子表示为q=[ cosθ,sinθv],其中v为一维纯虚数,v=i。三维空间中既然要用四维复数表示旋转,那么也可以定义旋转因子为:q=[ cosθ,sinθv],其中v为三维纯虚数,v=ai+bj+cz。(留一个问题:二维平面上q能画出来,三维空间中这个q呢?)
现有被旋转三维复数写成四维的纯四元数形式:p=[0,p],旋转因子q=[ cosθ,sinθv], 则p’=q×p=[ sinθv•p , cosθ•p+ sinθv×p]
①v和p正交时,绕v旋转45°,则p’=[ 0 , cosθ•p+ sinθv×p]
举例:p=[0,2i] q=[√2/2,√2/2 v],为了v和p正交,不妨设v=k,
则p’=[0, √2i+√2k×i]=[0, √2i+√2j],旋转过程如下图,绕k轴旋转45°。
② v和p不正交时,绕v旋转45°,则p’=[ sinθv•p , cosθ•p+ sinθv×p]
举例:p=[0,2i]不变, q=[√2/2,√2/2 v],为了v和p不正交,不妨设v= √2/2 i+√2/2 k
此时计算p’=q×p=[-1, √2i+j]
可以看到,计算结果p’已经不再是纯四元数了,实际上就是p被q转进了四维空间,而在其纯虚数ijk的三维空间内的投影如上图所示,红色的p并没有绕玫红色的v= √2/2 i+√2/2 k旋转45°,而且|p’|≠2,被拉伸变形了。
此时Hamilton提出了一种修正算法,
这样可以算的p’=[0,i+√2j+k],如下图所示,
此时旋转后的|p’|=2,没有被拉伸,但是转过了90°(p-v平面和p’-v平面夹角为90,即p-v平面绕着v逆时针转了90°),角度上变为了两倍,因此进一步修正,令
六、四元数→欧拉角
原贴见:
https://www.cnblogs.com/kljfdsa/p/9093009.html
空间中的三维旋转可视为绕三个基本轴的旋转组合叠加,绕 x,y,z (分别代表i,j,k三个轴)三个基本轴旋转角度分别为 ϕ,θ,ψ ,则三个基本旋转的四元素可表征为:
绕三个基本轴的旋转次序不同,其表征的空间旋转也不同,下面以ZYX的顺序计算(此处根据参考资料撰写,和前面的几块内容在左乘右乘上顺序不同,此处是右乘,就是顺时针转动):
则已知四元数时,反求欧拉角: