旋转表达之四元数
旋转矩阵用9个元素表示3*度旋转,表达具有冗余性。而欧拉角(后面会提及)和旋转向量(前文提到罗德里格斯的t)是紧凑的,但具有奇异性。
旋转向量用一个旋转轴ω和旋转角t来描述一个旋转,所以也称轴角(Axis-Angle)。不过很明显,因为旋转角度有一定的周期性(2π一圈),所以这种表达方式具有奇异性。
欧拉角有一个致命缺点:万向锁。也就是在俯仰角为±90°时,第一次和第三次旋转使用的是同一个坐标轴,会丢失一个*度,引起奇异性【后面会另开博文,说明欧拉角】。
表达三维旋转的不带奇异性的三维向量描述方式是不存在的,它是一个三维流型,想要无奇异性的表示,仅用3个量是不够的,所以引出了四元数。
四元数是Hamilton找到的对于复数的扩展,它由一个实部和三个虚部组成,是一种非常紧凑、没有奇异的表达方式。然而四元数不够直观,且运算较为复杂。
推荐一个四元数的文档。内容极度充实,不过本文不需要太多的复数概念,看完本文还有不懂的,可以去阅读该文档。
本博文若有缺少的部分没有概述,会找时间不断补充。
四元数
我们知道复数C可以简单地定义为C=R+Ri,其中i2=−1。 四元数是类似于复进行扩展和推广。 由H表示的四元数集定义为
H=C+Cj,j2=−1;i⋅j=−j⋅i
所以H中元素的形式如下:
q=q0+q1i+(q2+iq3)j=q0+qii+q2j+q3ij, q0,q1,q2,q3∈R
我们后续简化为
q=q0+qii+q2j+q3k,, q0,q1,q2,q3∈R
其中i,j,k是四元数的三个虚部,而且k=ij。
我们把三个虚部的乘法结果以下标展示:
× |
1 |
i |
j |
k |
1 |
1 |
i |
j |
k |
i |
i |
-1 |
k |
−j |
j |
j |
−k |
-1 |
i |
k |
k |
j |
−i |
-1 |
其实还可以推出i2=j2=k2=ijk=−1
事实上,i,j,k正如下图所示,摘自*。
四元数单位乘积在4D空间平面内旋转90°的图形表示,由1,i,j,k中的两个张成。 左侧因子可以被视为右侧旋转。 例如:蓝色:1/i平面:1⋅i=i,i/k平面:i⋅j=k红色:1/j平面:1⋅j=j,j/k平面: j⋅i=−k。
有些时候,我们可以用标量和向量表达四元数:
q=[s,v],s=q0∈R,v=[q1,q2,q3]∈R3
其中s是四元数的实部,而v是四元数的虚部。如果虚部为0,则称为实四元数。若实部为0则称为虚四元数。
四元数运算
四元数和复数类似,故而存在有常见四则运算,数乘和求逆以及共轭等。
加减法
假设有两个四元数,我们设q=a1+b1i+c1j+d1k,p=a2+b2i+c2j+d2k。当然我们还可以将其记为q=[s1,v1],p=[s2,v2]。其中s1=a1,v1=[b1,c1,d1],s2=a2,v2=[b2,c2,d2]
所以有q=s1+v1⎣⎡ijk⎦⎤,p=s2+v2⎣⎡ijk⎦⎤
目前定义加法为:
p±q=(a1±a2)+(b1±b2)i+(c1±c2)j+(d1±d2)k
⇔p±q=(s1±s2)+(v1±v2)⎣⎡ijk⎦⎤
所以我们标记p+q=[s1±s1,v1±v2]
乘法
标量乘法
我们有一个四元数q=a1+b1i+c1j+d1k和一个标量s,则他们乘积为:
sq=s(a+bi+cj+dk)=sa+sbi+scj+sdk
而且标量乘法符合交换律,即sq=qs
四元数乘法
四元数乘法并不符合交换律,这点后面会指出。
假设q=a1+b1i+c1j+d1k,p=a2+b2i+c2j+d2k
则两者乘积为
qp=(a1+b1i+c1j+d1k)(a2+b2i+c2j+d2k)=a1a2+a1b2i+a1c2j+a1d2k+ b1a2i+b1b2i2+b1c2ij+b1d2ik+ c1a2j+c1b2ji+c1c2j2+c1d2jk+ d1a2k+d1b2ki+d1c2kj+d1d2k2
又上面给出的表可以知道
i2=j2=k2=−1,ij=k,ji=−k,ik=−j,ki=j,jk=i,kj=−i
所以上面可以换得
qp=(a1a2−b1b2−c1c2−d1d2)+(a1b2+b1a2+c1d2−d1c2)i+(a1c2−b1d2+c1a2+d1b2)j+(a1d2+b1c2−c1b2+d1a2)k
两个四元数乘积相当于先旋转a2+b2i+c2j+d2k再旋转a1+b1i+c1j+d1k
四元数相乘其实也算线性组合。我们可以将其写成下面形式
pq=⎣⎢⎢⎡a1b1c1d1−b1a1d1−c1−c1−d1a1b1−d1c1−b1a1⎦⎥⎥⎤⎣⎢⎢⎡a2b2c2d2⎦⎥⎥⎤⎣⎢⎢⎡1ijk⎦⎥⎥⎤
该变换相当于左乘p,矩阵乘法不符合交换律。
由此可以得到
qp=⎣⎢⎢⎡a1b1c1d1−b1a1−d1c1−c1d1a1−b1−d1−c1b1a1⎦⎥⎥⎤⎣⎢⎢⎡a2b2c2d2⎦⎥⎥⎤⎣⎢⎢⎡1ijk⎦⎥⎥⎤
如果换成标识为:
q=[s1,v1],p=[s2,v2]。其中s1=a1,v1=[b1,c1,d1],s2=a2,v2=[b2,c2,d2]
很容易推算得到
qp=[s1s2−v1Tv2,s1v1+s2v2+v1v2]
由此可见,如果要四元数相乘可交换,则除非v1,v2共线,此时外积项为0。
这个标识的结果也被称为Graßmann积。
共轭
定义一个四元数为q=a+bi+cj+dk,则其共轭为
qˉ=a−bi−cj−dk
在文献中,共轭q^的符号还可以标记为q∗,qt等。博文采用qˉ
共轭是对合函数,也就是说它是它自己的反转,意味着f(f(x))=x。意味着一个元素共轭两次就会是原始元素。两个四元数乘积的共轭是他们的共轭相反顺序的乘积。也就是说:
∀p,q∈H,pq=qˉpˉ
四元数的共轭还可以用四元数的乘法和加法表示:
qˉ=−21(q+iqi+jqj+kqk)
我们还可以用共轭去提取出四元数中的实部和虚部。即
a=2q+qˉ
bi+cj+dk=2q−qˉ
模与范数
四元数和其共轭的乘积的平方根称为其范数,表示为∣∣q∣∣,表示如下:
∣∣q∣∣=qqˉ=qˉq=a2+b2+c2+d2
该范数也被称为四元数的模,模为非负数,这与H上的欧氏范数相同,被视为向量空间R4。
在共轭中,如果我们标记q=[s,v],则
qˉ=[s,−v]
然后共轭乘积表示为:
qˉq=qqˉ=[s2+vTv,0]
将四元数乘以一个实数后的范数相当于这个四元数的范数乘以这个实数的绝对值。即若α为实数,则
∣∣αq∣∣=∣α∣ ∣∣q∣∣
这是下面范数乘法的特例:
∣∣pq∣∣=∣∣p∣∣ ∣∣q∣∣,∀p,q∈H
乘法是乘积共轭公式的一个结果。或者,它从恒等式开始
det(a+ibid−cid+ca−ib)=a2+b2+c2+d2
其中i通常被认为是虚数单位。因此,因此形成了方阵行列式的乘法性质。
下面这个范数可以用来定义p和q之间的距离d(p,q),作为它们差异的范数:
d(p,q)=∣∣p−q∣∣
这使H成为度量空间。 度量拓扑中的加法和乘法是连续的。 实际上,对于任何标量,正数a使得
(p+ap1+q+aq1)−(p+q)=a∣∣p1+q1∣∣
连续性从极限值变为零。 乘法的连续性同样如此。
四元数的逆
我们定义q−1是q的逆。而且满足
qq−1=q−1q=1(q̸=0)
也就是说:
(pq)q−1=p(qq−1)=p⋅1=p
q−1(qp)=(q−1q)p=1⋅p=p
这分别是右乘q−1和左乘p−1,与矩阵性质相似。
那么如何求四元数的逆?
这里我们引入单位四元数,这是范数的四元数。它是通过非零四元数q除以其范数而得到的单位四元数Uq,称为q的规范化四元数(Versor)。
Uq=∣∣q∣∣q
每个范数都有一个极分解q=∣∣q∣∣⋅Uq。
使用共轭和范数可以定义非零四元数的倒数。四元数和其倒数的乘积应该等于1。这里我们把倒数认为是四元数的逆。
其实这就意味着q和qˉ/∣∣q∣∣的乘积结果是1(不论顺序)。
回想我们定义四元数的模的时候的范数定义
所以四元数的逆定义为:
q−1=∣∣q∣∣qˉ
如果q是单位四元数,那么q−1=qˉ。
值得注意的是四元数乘积的逆和矩阵的逆相似性质,即:
(pq)−1=q−1p−1
四元数的数乘
与向量类似,可以定义四元数的数乘。
我们标记四元数q=[s,v],则数乘:
kq=k[s,v]
四元数的点乘(点积)
点乘指的是四元数的每个位置上的数值对应相乘。
假设q=a1+b1i+c1j+d1k,p=a2+b2i+c2j+d2k
则二者点乘的结果为:
p⋅q=a1a2+b1b2+c1c2+d1d2
还可以不用分量的形式表示为:
p⋅q=21(pˉq+qˉp)=21(pqˉ+qpˉ)
可以验证计算成立
四元数的叉积
假设q=a1+b1i+c1j+d1k,p=a2+b2i+c2j+d2k
则
p×q=21(pˉq−qˉp)=21(pqˉ−qpˉ)
如果我们标记q=[s1,v1],p=[s2,v2],则
p×q=[0,v1×v2]
具体来说,叉积后实部为0。
p×q=(c1d2−d1c2)i+(d1b2−b1d2)j+(b1c2−c1b2)k
四元数指数,对数和幂函数
给定四元数q=a+bi+cj+dk=a+v
则
exp(q)=n=0∑∞n!qn=ea(cos∣∣v∣∣+∣∣v∣∣vsin∣∣v∣∣)
ln(q)=ln∣∣q∣∣+∣∣v∣∣varccos∣∣q∣∣a
由此可以写成四元数的极分解
q=∣∣q∣∣en^θ=∣∣q∣∣(cosθ+n^sinθ)
其中角度为θ,单位矢量n^定义为
a=∣∣q∣∣cosθ
和
v=n^∣∣v∣∣=n^∣∣q∣∣sinθ
任何四元数都可以由极形式表示为en^θ。
四元数的幂提到任意(实)指数由下式给出:
qα=∣∣q∣∣α(cos(αθ)+n^sin(αθ))
四元数的其他函数则不描述(有需要则评论中人提出再添加)。
四元数表示旋转
四元数用于旋转时被称为旋转四元数,当用于方向(相对于参考坐标系的旋转)时,被称为方向四元数或位姿四元数。
在三维空间中,根据欧拉旋转定理,刚体或坐标系围绕固定点的任何旋转或旋转顺序相当于围绕固定轴(称为欧拉轴)的给定角度θ的单一旋转。 贯穿固定点。 欧拉轴通常由单位矢量u表示。 因此,三维中的任何旋转都可以表示为矢量u和标量θ的组合。
图来源于*。对于欧拉轴和角度的可视化旋转表示。
四元数提供了一种简单的方法来将此轴角表示为四个数字,并且可用于将相应的旋转应用于位置向量,表示相对于R3中的原点的点。
四元数要表示旋转,则需要用到虚四元数,即实部为0的四元数。
用i,j,k分别为笛卡尔坐标系的三个轴的单位向量。把旋转定义为绕着以某个单位向量u为轴旋转θ角。
u=(ux,uy,uz)=uxi+uyj+uzk
可以被四元数描述。这就可以用于欧拉公式的扩展:
q=e2θ(uxi+uyj+uzk)=cos2θ+(uxi+uyj+uzk)sin2θ
所以得到:
q=[q0,q1,q2,q3]=[cos2θ,uxsin2θ,uysin2θ,uzsin2θ]
在这里我们给出由此公式得到了旋转向量和四元数的转换关系式:
{θ=2arccos(q0)[ux,uy,uz]T=[q1,q2,q3]T/sin2θ
我们知道,一个点,比如点p,如果用旋转矩阵来表示旋转,则为
p′=Rp
现在这个点被用虚四元数描述。即p=[0,x,y,z]=[0,v]
然后我们用四元数q=[cos2θ,vsin2θ]表示这个旋转。
采用Hamilton积来表示:
p′=qpq−1
可以验证得出,计算结果的实部为0,是纯虚四元数。
四元数与旋转矩阵的转换
由四元数旋转p′=qpq−1,我们假设q=qr+qiiqjj+qkk,可以得到旋转矩阵R。
R=⎣⎡1−2s(qj2+qk2)2s(qiqj+qkqr)2s(qiqk−qjqr)2s(qiqj−qkqr)1−2s(qi2+qk2)2s(qjqk+qiqr)2s(qiqk+qjqr)2s(qjqk−qiqr)1−2s(qi2+qj2)⎦⎤
这里s=∣∣q∣∣−2,如果q是单位四元数,则s=1。
如果从旋转矩阵到四元数,则是:
假设矩阵R=mij,i,j∈[1,2,3],q是单位四元数,则对应四元数的各个分量为:
qr=2trace(R)+1,qi=4qrm23−m32,qj=4qrm31−m13,qk=4qrm12−m21
值得注意的是q,−q是同一旋转,即R对应的四元数并不唯一。
当qr接近于0,qi,qj,qk会变得十分大,导致解不稳定。
四元数恢复轴角表示
若已知旋转四元数为q=qr+qiiqjj+qkk,则旋转轴u和旋转角θ为:
(ux,uy,uz)=qi2+qj2+qk2(qi,qj,qk)
θ=2atan2(qi2+qj2+qk2,qr)
其中atan2是双参数反正切函数。
四元数的特殊子群
特殊的H子群,即所谓的单位四元数(前文已经描述)
S3={q∈H∣∣∣q∣∣2=q02+q12+q22+q32=1}
很明显,所有单位四元数的集合只是R4中的单位球。很容易证明该单位四元数符合群的性质。
刚刚我们说过,对于q,−q是同一旋转,即R对应的四元数并不唯一。
由于欧拉公式展开可以知道,当四元数取复数时,θ和v对应反向,而乘积不变。
可以由下图可以看出。
单位球面S3⊂R4上的对应单位四元数q和−q对应于相同的旋转矩阵。
因此,在拓扑学中,S3是SO(3)的双覆盖(double-covering)。因此SO(3)在拓扑上与三维投影平面RP3相同。