四元数总结

目录

  • 1. 基本概念
  • 2. 四元数的表示方法
  • 3. 四元数的性质
  • 4. 四元数乘法
  • 5. 用四元数表示旋转
  • 参考

1. 基本概念

  • 空间中的子空间:
    一般而言,空间(维度>2)都存在更低维的子空间。比如二维空间中一维子空间,也就是直线;三维空间中的一维子空间和二维子空间,也就是直线和面。

  • 空间和子空间的映射:我们将二维空间表示为(x,y),当y=0时,其实可以看成是一维的,只不过它表示成(x,0)这种形式。推到四维,(w,x,y,z),当w=0时,(0,x,y,z)就是一个三维子空间,这也是为什么我们可以用单位四元数对三维向量进行操作其实我们是将三维向量映射到思维的三维子空间中,然后对其进行旋转,最终得到的向量结果依然是这个三维子空间中的,因而可以映射回三维空间。

  • 广义球 : 我们在二维平面上,广义球只带cirecle, 三维空间上就是我们认知上的球,称为two-sphere。 而四维空间中广义球其实是一个超球(hyper-sphere),又称为three-sphere。单位向量其实就是广义球上面的点,而单位四元数也就是three-sphere上面的点。

  • 特征与特征向量: 空间中的一点由x,y,z等参数来表示,一般来说参数的数量与维度相等,二维空间的点用{x,y}参数,四维空间的点用{x,y,z,w}参数。但是对于空间的点加以约束,则会减少参数的数量。比如三维空间的点在某一单位球面上,原本三个参数{x, y, z}才能表达的点现在只需要两个参数{u, v}就可以表达。如果{u, v}是单位向量,也可以称{u, v}是{x, y, z}的特征向量。

  • 四元数是四维空间中一个超球上面的点,满足 w 2 + x 2 + y 2 + z 2 = 1 w^2 + x^2 + y^2 + z^2=1 w2+x2+y2+z2=1;而纯四元数是四维空间在w=0时的一个子控件的点,形式为 { 0 , q ⃗ } \{0,\vec q\} {0q },特别注意的是纯四元数与四元数是不同的概率。

  • 四元数是复数虚部扩展的结果,复数的虚部为1个,而四元数的虚部有三个,且两两互相正交,其中实部是 c o s θ / 2 cos\theta/2 cosθ/2,而虚部为一个单位轴乘以 s i n θ / 2 sin\theta/2 sinθ/2

  • 四元数自由度并没有四个维度,由于存在 w 2 + x 2 + y 2 + z 2 = 1 w^2 + x^2 + y^2 + z^2=1 w2+x2+y2+z2=1这个约束,它的自由度其实只有3,且每个四元数可以对应一个特征向量,即 n ⃗ \vec n n 。注意四元数并不是与特征向量意一一对应的。
    -四元数总结_第1张图片

四元数通常定义为
q = q 0 + q 1 i + q 2 j + q 3 k \mathbf q= q_0 + q_1\mathbf i + q_2\mathbf j + q_3\mathbf k q=q0+q1i+q2j+q3k
其中 i , j , k i,j,k i,j,k满足
i 2 = − 1 , j 2 = − 1 , k 2 = − 1 i j = − j i = k , j k = − k j = i , k i = − i k = j \mathbf i ^2 = -1,\mathbf j ^2 = -1,\mathbf k ^2 = -1\\ \mathbf i\mathbf j=-\mathbf j\mathbf i = \mathbf k,\mathbf j\mathbf k=-\mathbf k\mathbf j = \mathbf i,\mathbf k\mathbf i=-\mathbf i\mathbf k = \mathbf j i2=1,j2=1,k2=1ij=ji=k,jk=kj=i,ki=ik=j

q 0 q_0 q0是四元数的实数或标量部分, q 1 i + q 2 j + q 3 k q_1\mathbf i + q_2\mathbf j + q_3\mathbf k q1i+q2j+q3k是虚数或矢量部分。因此,四元数也可以写成四维列矩阵,由下式给出:
q = [ q 0 v ] = [ q 0 , q 1 , q 2 , q 3 ] T \mathbf q= \begin{bmatrix}q_0 \\ \mathbf v \end{bmatrix}=[ q_0, q_1, q_2, q_3]^T q=[q0v]=[q0,q1,q2,q3]T

如果 q 0 , v q_0, \mathbf v q0,v满足

v = [ k x s i n ( θ / 2 ) k x s i n ( θ / 2 ) k x s i n ( θ / 2 ) ] = k ^ s i n ( θ / 2 ) , q 0 = c o s ( θ / 2 ) \mathbf v =\begin{bmatrix} k_xsin(\theta/2) \\k_xsin(\theta/2) \\k_xsin(\theta/2)\end{bmatrix} = \hat k sin(\theta / 2), q_0 = cos(\theta / 2) v= kxsin(θ/2)kxsin(θ/2)kxsin(θ/2) =k^sin(θ/2),q0=cos(θ/2)
元素 q 0 、 … 、 q 3 q_0、…、q3 q0q3被称为“旋转四元数”或“欧拉对称参数”(Euler symmetric parameters)。描述了沿轴的单位向量和旋转角。

2. 四元数的表示方法

复数式 : q = q 0 + q 1 i + q 2 j + q 3 k \mathbf q= q_0 + q_1\mathbf i + q_2\mathbf j + q_3\mathbf k q=q0+q1i+q2j+q3k
矢量式 : q = q 0 + v \mathbf q= q_0 + \mathbf v q=q0+v
三角式 : q = c o s ( θ / 2 ) + k ^ s i n ( θ / 2 ) \mathbf q= cos(\theta / 2)+ \hat k sin(\theta / 2) q=cos(θ/2)+k^sin(θ/2)

四元数 c o s θ / 2 + i ∗ s i n θ / 2 cosθ/2+i*sinθ/2 cosθ/2+isinθ/2就表示“绕矢量 k ^ \hat k k^ 旋转θ角

指数式 : q = e k ^ θ 2 \mathbf q= e^{\hat k \frac{\theta }{2}} q=ek^2θ
矩阵式 : q = [ q 0 , q 1 , q 2 , q 3 ] T \mathbf q= [q_0,q_1, q_2, q_3]^T q=[q0,q1,q2,q3]T

3. 四元数的性质

假设现在有两个四元数 q a = q a + v a \mathbf q_a= q_a + \mathbf v_a qa=qa+va, q b = q b + v b \mathbf q_b= q_b + \mathbf v_b qb=qb+vb

  • 加法: q a + q b = [ q a + q b , v a + v b ] T \mathbf q_a + \mathbf q_b = [q_a+q_b,\mathbf v_a + \mathbf v_b]^T qa+qb=[qa+qb,va+vb]T

  • 乘法: q a q b = [ q a q b − v a T v b , q a v b + q b v a + v a × v b ] T \mathbf q_a \mathbf q_b = [q_aq_b-\mathbf v_a^T \mathbf v_b,\mathbf q_a\mathbf v_b + \mathbf q_b\mathbf v_a +\mathbf v_a \times \mathbf v_b]^T qaqb=[qaqbvaTvb,qavb+qbva+va×vb]T

  • 模长: ∣ ∣ q a q b ∣ ∣ = ∣ ∣ q a ∣ ∣ ⋅ ∣ ∣ q b ∣ ∣ ||\mathbf q_a \mathbf q_b|| = ||\mathbf q_a ||\cdot ||\mathbf q_b || ∣∣qaqb∣∣=∣∣qa∣∣∣∣qb∣∣

  • 共轭:
    四元数的共轭是把虚数写成相反数: q a ∗ = q a − v a \mathbf q_a^*= q_a - \mathbf v_a qa=qava
    四元数共轭与其本身相乘,会得到一个实四元数,其实部为模长的平方:
    q ∗ q = q q ∗ = [ q a 2 + v a T v a , 0 ] T \mathbf q^*\mathbf q = \mathbf q\mathbf q^*=[q_a^2 + \mathbf v_a^T\mathbf v_a,\mathbf 0]^T qq=qq=[qa2+vaTva,0]T

  • 逆:
    一个四元数的逆为
    q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 \mathbf q^{-1}=\mathbf q^*/||\mathbf q||^2 q1=q/∣∣q2
    如果 q \mathbf q q为单位四元数,其逆和共轭就是同一个量。
    同时,乘积的逆具有和矩阵相似的性质:
    ( q a q b ) − 1 = q b − 1 q a − 1 (\mathbf q_a\mathbf q_b)^{-1}=\mathbf q_b^{-1}\mathbf q_a^{-1} (qaqb)1=qb1qa1

  • 数乘: k q a = [ k q a , k v a ] T k\mathbf q_a=[kq_a,k\mathbf v_a]^T kqa=[kqa,kva]T

4. 四元数乘法

  • 复数式
    q ⊗ p = ( q 0 + q 1 i + q 2 j + q 3 k ) ( p 0 + p 1 i + p 2 j + p 3 k ) = [ p 0 q 0 − p 1 q 1 − p 2 q 2 − p 3 q 3 p 1 q 0 + p 0 q 1 + p 2 q 3 − p 3 q 2 p 2 q 0 + p 0 q 2 + p 3 q 1 − p 1 q 3 p 3 q 0 + p 0 q 3 + p 1 q 2 − p 2 q 1 ] \mathbf q \otimes \mathbf p=(q_0 + q_1\mathbf i + q_2\mathbf j + q_3\mathbf k)(p_0 + p_1\mathbf i + p_2\mathbf j + p_3\mathbf k )\\ = \begin{bmatrix} p_0q_0 - p_1q_1 - p_2q_2 -p_3q_3\\ p_1q_0 + p_0q_1 + p_2q_3 -p_3q_2 \\ p_2q_0 + p_0q_2 + p_3q_1 -p_1q_3 \\ p_3q_0 + p_0q_3 + p_1q_2 -p_2q_1\end{bmatrix} qp=(q0+q1i+q2j+q3k)(p0+p1i+p2j+p3k)= p0q0p1q1p2q2p3q3p1q0+p0q1+p2q3p3q2p2q0+p0q2+p3q1p1q3p3q0+p0q3+p1q2p2q1

  • 矢量式
    q ⊗ p = ( q 0 + v a ) ( p 0 + v b ) = q 0 p 0 + q 0 v b + p 0 v + v a × v b − v a ⋅ v b = q 0 p 0 − v a ⋅ v b + q 0 v b + p 0 v a + v a × v b \mathbf q \otimes \mathbf p=(q_0 + \mathbf v_a)(p_0 + \mathbf v_b)\\ =q_0p_0+q_0\mathbf v_b+p_0\mathbf v+\mathbf v_a\times \mathbf v_b - \mathbf v_a\cdot \mathbf v_b\\ =q_0p_0- \mathbf v_a\cdot \mathbf v_b+q_0\mathbf v_b+p_0\mathbf v_a+\mathbf v_a\times \mathbf v_b qp=(q0+va)(p0+vb)=q0p0+q0vb+p0v+va×vbvavb=q0p0vavb+q0vb+p0va+va×vb

其中 q 0 p 0 − v a ⋅ v b q_0p_0- \mathbf v_a\cdot \mathbf v_b q0p0vavb为标量部分, q 0 v b + p 0 v a + v a × v b q_0\mathbf v_b+p_0\mathbf v_a+\mathbf v_a\times \mathbf v_b q0vb+p0va+va×vb为矢量部分
注意 v b , v a \mathbf v_b,\mathbf v_a vb,va矢量相乘的结果等于叉乘的结果减去点乘的结果

  • 矩阵式 :
    q = [ q 0 , q 1 , q 2 , q 3 ] T \mathbf q= [q_0, q_1, q_2, q_3]^T q=[q0,q1,q2,q3]T
    p = [ p 0 , p 1 , p 2 , p 3 ] T \mathbf p= [p_0, p_1, p_2, p_3]^T p=[p0,p1,p2,p3]T
    q ⊗ p = ( q 0 + q 1 i + q 2 j + q 3 k ) ( p 0 + p 1 i + p 2 j + p 3 k ) = [ p 0 − p 1 − p 2 − p 3 p 1 p 0 − p 3 p 2 p 2 p 3 p 0 − p 1 p 3 − p 2 p 1 p 0 ] [ q 0 q 1 q 2 q 3 ] = [ q 0 − q 1 − q 2 − q 3 q 1 q 0 q 3 − q 2 q 2 − q 3 q 0 q 1 q 3 q 2 − q 1 q 0 ] [ p 0 p 1 p 2 p 3 ] = [ q 0 − v a T v a q 0 I 3 × 3 + [ v a × ] ] [ p 0 v b ] = [ q 0 p 0 − v a T v b p 0 v a + q 0 v b + v a × v b ] = L ( q ) p = [ p 0 − v b T v b p 0 I 3 × 3 − [ v b × ] ] [ q 0 v a ] = R ( p ) q \mathbf q \otimes \mathbf p=(q_0 + q_1\mathbf i + q_2\mathbf j + q_3\mathbf k)(p_0 + p_1\mathbf i + p_2\mathbf j + p_3\mathbf k )\\{}\\ = \begin{bmatrix} p_0 & -p_1&-p_2&-p_3\\ p_1 & p_0 & -p_3 & p_2\\ p_2 & p_3 & p_0 & -p_1\\ p_3 & - p_2 & p_1 & p_0\end{bmatrix} \begin{bmatrix} q_0\\ q_1\\q_2\\ q_3\end{bmatrix} \\{}\\ = \begin{bmatrix} q_0 & -q_1&-q_2&-q_3\\ q_1 & q_0 & q_3 & -q_2\\ q_2 & -q_3 & q_0 & q_1\\ q_3 & q_2 & -q_1 & q_0\end{bmatrix} \begin{bmatrix} p_0\\ p_1\\p_2\\ p_3\end{bmatrix}\\{}\\ = \begin{bmatrix} q_0 &-\mathbf v_a^T\\ \mathbf v_a & q_0\mathbf I_{3\times3} +[\mathbf v_a\times]\end{bmatrix} \begin{bmatrix} p_0\\ \mathbf v_b\end{bmatrix} = \begin{bmatrix} q_0p_0 -\mathbf v_a^T \mathbf v_b\\ p_0\mathbf v_a + q_0 \mathbf v_b + \mathbf v_a\times \mathbf v_b \end{bmatrix} \\ =\mathcal L(\mathbf q)\mathbf p \\{}\\ = \begin{bmatrix} p_0 &-\mathbf v_b^T\\ \mathbf v_b & p_0\mathbf I_{3\times3} -[\mathbf v_b\times]\end{bmatrix} \begin{bmatrix} q_0\\ \mathbf v_a\end{bmatrix} \\ =\mathcal R(\mathbf p)\mathbf q qp=(q0+q1i+q2j+q3k)(p0+p1i+p2j+p3k)= p0p1p2p3p1p0p3p2p2p3p0p1p3p2p1p0 q0q1q2q3 = q0q1q2q3q1q0q3q2q2q3q0q1q3q2q1q0 p0p1p2p3 =[q0vavaTq0I3×3+[va×]][p0vb]=[q0p0vaTvbp0va+q0vb+va×vb]=L(q)p=[p0vbvbTp0I3×3[vb×]][q0va]=R(p)q

5. 用四元数表示旋转

假设有一个空间三维点 p = [ x , y , z ] ∈ R 3 \mathbf p=[x,y,z] \in \mathbb R^3 p=[x,y,z]R3,以及一个由单位四元数 q \mathbf q q指定的旋转。三维点 p \mathbf p p经过旋转之后变为 p ′ \mathbf p' p。如果使用矩阵描述,那么有 p ′ = R p \mathbf p'=\mathbf R \mathbf p p=Rp,如果用四元数描述旋转,则表示为 p ′ = q p q − 1 \mathbf p'=\mathbf q \mathbf p\mathbf q^{-1} p=qpq1

此处的乘法均为四元数乘法,结果也是四元数。最后把 p ′ \mathbf p' p的虚部取出来,即得到旋转之后的点的坐标。

证明 : 假设单位四元数 q = [ q 0 , v a ] T \mathbf q= [q_0, \mathbf v_a]^T q=[q0,va]T,三维点 p = [ 0 , v b ] T \mathbf p= [0,\mathbf v_b]^T p=[0,vb]T

乘法: q a q b = [ q a q b − v a T v b , q a v b + q b v a + v a × v b ] T \mathbf q_a \mathbf q_b = [q_aq_b-\mathbf v_a^T \mathbf v_b,\mathbf q_a\mathbf v_b + \mathbf q_b\mathbf v_a +\mathbf v_a \times \mathbf v_b]^T qaqb=[qaqbvaTvb,qavb+qbva+va×vb]T

则有 r = q p = [ − v a T v b , q 0 v b + v a × v b ] T \mathbf r = \mathbf q \mathbf p = [-\mathbf v_a^T \mathbf v_b,q_0 \mathbf v_b + \mathbf v_a \times \mathbf v_b]^T r=qp=[vaTvb,q0vb+va×vb]T

q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 \mathbf q^{-1}=\mathbf q^*/||\mathbf q||^2 q1=q/∣∣q2,所以单位四元数的逆即为 q ∗ \mathbf q^* q

p ′ = q p q − 1 = r q ∗ \mathbf p'=\mathbf q \mathbf p\mathbf q^{-1} = \mathbf r\mathbf q^* p=qpq1=rq
其实部为 v a × v b ⋅ v a \mathbf v_a \times \mathbf v_ b \cdot \mathbf v_a va×vbva
由于 v a × v b \mathbf v_a \times \mathbf v_ b va×vb v a \mathbf v_a va垂直,因此 p ′ \mathbf p' p的实部为0,即旋转后的点仍然是一个虚四元数

参考

https://zhuanlan.zhihu.com/p/27471300
https://blog.csdn.net/benchuspx/article/details/108523498

你可能感兴趣的:(SLAM基础,线性代数,矩阵,算法)