四元数学习笔记(一):初识四元数

news2024/11/14 16:25:28

1 四元数的定义

1.1 为什么要使用四元数

旋转向量用 9 个量来描述 3 个自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但是具有奇异性。事实上,我们找不到不带奇异性的向量描述方式。

回忆之前学习过的复数,我们用复数集 C \mathbb{C} C 表示复平面上的向量,可以表示为 z = a + b i z = a + bi z=a+bi 的形式,其中 a , b ∈ R a,b \in R a,bR i 2 = − 1 i^2 = -1 i2=1,而复数的乘法则表示复平面上的旋转:例如,乘上复数 i i i 相当于逆时针把一个复向量旋转 90 ° 90\degree 90°。类似的,在表达三维空间旋转时,也有一种类似于复数的代数:四元数(Quaternion)。

1.2 四元数的形式

四元数的定义和复数非常相似,唯一的区别在于四元数有三个虚部,而复数只有一个。所有的四元数 q ∈ H q \in \mathbb{H} qH H \mathbb{H} H 代表四元数的发现者 Hamilton)都可以写作如下形式
q = [ q 0 + q 1 i + q 2 j + q 3 k ] (1.1) q = [q_0 + q_1i + q_2j + q_3k] \tag{1.1} q=[q0+q1i+q2j+q3k](1.1)
通常也可以写作:
[ q 0 , q 1 , q 2 , q 3 ] [q_0, q_1, q_2, q_3] [q0,q1,q2,q3]
其中 i , j , k i,j,k i,j,k 为四元数的三个虚部,这三个虚部满足以下关系式:
i ∗ i = j ∗ j = k ∗ k = − 1 ; i ∗ j = k , j ∗ i = − k ; j ∗ k = i , k ∗ j = − i ; k ∗ i = j , i ∗ k = − j ; \begin{equation} \begin{split} &i*i = j * j = k*k = -1; \\ &i*j = k, j*i = -k; \\ &j *k =i, k*j = -i; \\ &k * i = j, i * k = -j; \end{split} \end{equation} ii=jj=kk=1;ij=k,ji=k;jk=i,kj=i;ki=j,ik=j;
如果把 i , j , k i,j,k i,j,k 看成三个坐标轴,那么它们与自己的乘法和复数一样,相互之间的乘法和外积一样。

有时人们也用一个标量 q 0 q_0 q0,一个向量 [ q 1 , q 2 , q 3 ] [q_1,q_2,q_3] [q1,q2,q3] 来表示四元数:
q = [ s , v ] T , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T ∈ R 3 (1.2) q = [s,v]^T,s = q_0 \in \mathbb{R},v = [q_1,q_2,q_3]^T \in \mathbb{R}^3 \tag{1.2} q=[s,v]T,s=q0R,v=[q1,q2,q3]TR3(1.2)
在这里, s s s 称为四元数的实部,而 v v v 称为四元数的虚部。如果一个四元数的虚部为 0,则称为实四元数;如果一个四元数的实部为 0,则称为虚四元数纯四元数

1.3 四元数的重要性

  1. 避免奇异性

    欧拉角的表示方式会导致万向锁的出现,而万向锁只是方向角在实际物理实现上会出现的一个问题,理论上要规避万向锁,选择合适的旋转顺序就行了,但问题是决定顺序也要花费判定成本。

    用方向角表示旋转,虽然直观,但没有考虑到歧义,以及计算和存储的需求。所谓歧义,即我们一般是先知道欧拉角再去计算唯一的旋转(旋转向量、旋转矩阵、四元数等能唯一表示三维旋转的方式),但给定一个三维旋转,我们却有至少两种欧拉角表示方式。

  2. 优化存储和计算

    用欧拉角来计算旋转,大致如下:
    M = R o t ( z , α ) ⋅ R o t ( x , β ) ⋅ R o t ( z , γ ) = ( c o s γ s i n γ 0 − s i n γ c o s γ 0 0 0 1 ) ( 1 0 0 0 c o s β s i n β 0 − s i n β c o s β ) ( c o s α s i n α 0 − s i n α c o s α 0 0 0 1 ) = ( c o s α c o s γ − s i n α c o s β s i n γ s i n α c o s γ + c o s α c o s β s i n γ s i n β s i n γ − c o s α s i n γ − s i n α c o s β c o s γ − s i n α s i n γ + c o s α c o s β c o s γ s i n β c o s γ s i n α s i n β − c o s α s i n β c o s β ) M= Rot(z,\alpha) \cdot Rot(x,\beta) \cdot Rot(z,\gamma) \\ =\begin{pmatrix} cos\gamma && sin\gamma && 0 \\ -sin\gamma && cos\gamma && 0 \\ 0 && 0 && 1 \end{pmatrix} \begin{pmatrix} 1 && 0 && 0 \\ 0 && cos\beta && sin\beta \\ 0 && -sin\beta && cos\beta \end{pmatrix} \begin{pmatrix} cos\alpha && sin\alpha && 0 \\ -sin\alpha && cos\alpha && 0 \\ 0 && 0 && 1 \end{pmatrix} \\ =\begin{pmatrix} cos\alpha cos\gamma - sin\alpha cos\beta sin\gamma && sin\alpha cos\gamma + cos\alpha cos\beta sin\gamma && sin\beta sin\gamma \\ -cos\alpha sin\gamma - sin\alpha cos\beta cos\gamma && -sin\alpha sin\gamma + cos\alpha cos\beta cos\gamma && sin\beta cos\gamma \\ sin\alpha sin\beta && -cos\alpha sin\beta && cos\beta \end{pmatrix} M=Rot(z,α)Rot(x,β)Rot(z,γ)= cosγsinγ0sinγcosγ0001 1000cosβsinβ0sinβcosβ cosαsinα0sinαcosα0001 = cosαcosγsinαcosβsinγcosαsinγsinαcosβcosγsinαsinβsinαcosγ+cosαcosβsinγsinαsinγ+cosαcosβcosγcosαsinβsinβsinγsinβcosγcosβ
    由此可见:使用欧拉角计算,在存储上至少需要存储六组数据(三个角的 cos 和 sin 值)。而四元数的旋转可以直接相互运算。

2 四元数运算

四元数和复数一样可以进行一系列的运算。常见的四元数运算有四则运算、数乘、内外积、模长、共轭、求逆等,高阶运算有指数、对数、求微分等,下面讲分别进行介绍:

为了方便说明,下面给出三个定义:

  • 不包含四元数 [ 0 , ( 0 , 0 , 0 ) ] [0,(0,0,0)] [0,(0,0,0)] 的四元数集合,记作 H 0 \overset{0}{\mathbb{H}} H0
  • 单位四元数集合记为 H 1 \mathbb{H}_1 H1,它是 H 0 \overset{0}{\mathbb{H}} H0 的子集;
  • 中元(neutral element): I = [ 1 , 0 ] ∈ H 1 I = [1,0] \in \mathbb{H}_1 I=[1,0]H1,它使得: q I = I q = [ s , v ] = q qI = Iq = [s,v] = q qI=Iq=[s,v]=q

2.1 基础运算

现规定存在四元数 q , q a , q b q,q_a,q_b q,qa,qb,它们用向量可以分别表示为 [ s , v ] , [ s a , v a ] , [ s b , v b ] [s,v],[s_a,v_a],[s_b,v_b] [s,v],[sa,va],[sb,vb],单元运算使用四元数 q q q,多元运算使用四元数 q a , q b q_a,q_b qa,qb

其中 v = x i + y j + z k , v a = x a i + y a j + z a k , v b = x b i + y b j + z b k v = xi + yj + zk,v_a = x_ai + y_aj + z_ak, v_b = x_bi + y_bj + z_bk v=xi+yj+zk,va=xai+yaj+zak,vb=xbi+ybj+zbk,或者原始四元数可以表示为:
q = s + x i + y j + z k q a = s a + x a i + y a j + z a k q b = s b + x b i + y b j + z b k \begin{equation} \begin{split} q&= s+ xi + yj + zk \\ q_a &= s_a + x_ai + y _aj + z_ak \\ q_b &= s_b + x_bi + y_bj + z_bk \end{split} \end{equation} qqaqb=s+xi+yj+zk=sa+xai+yaj+zak=sb+xbi+ybj+zbk
由此,其运算可以表示如下:

  1. 加减法
    q a ± q b = [ s a ± s b , v a ± v b ] (2.1) q_a \pm q_b = [s_a \pm s_b,v_a \pm v_b]\tag{2.1} qa±qb=[sa±sb,va±vb](2.1)

  2. 数乘

    又称为四元数的标量乘法,四元数可以与任意实数 k ∈ R k \in \mathbb{R} kR 相乘, k k k 的四元数形式可以表示为 k = [ k , 0 ] k = [k,0] k=[k,0],故四元数的数乘可以表示为:
    k q = [ k , 0 ] [ s , v ] = [ k s , k v ] (2.2) kq = [k,0][s,v] = [ks,kv] \tag{2.2} kq=[k,0][s,v]=[ks,kv](2.2)

  3. 内积或点积

    假设 q a q_a qa q b q_b qb 之间的夹角为 α \alpha α,则内积或点积的定义为:
    q a ⋅ q b = ∣ ∣ q a ∣ ∣ ∣ ∣ q b ∣ ∣ c o s α = s a s b + x a x b + y a y b + z a z b = s a s b + v a ⋅ v b = q a ∗ q b + q b ∗ q a 2 (2.3) \begin{equation} \begin{split} q_a \cdot q_b & = ||q_a||||q_b||cos\alpha \\ & = s_as_b + x_ax_b + y_ay_b + z_az_b \\ & = s_as_b + v_a\cdot v_b \\ & = \frac{q_a^*q_b + q_b^*q_a}{2} \end{split} \end{equation} \tag{2.3} qaqb=∣∣qa∣∣∣∣qb∣∣cosα=sasb+xaxb+yayb+zazb=sasb+vavb=2qaqb+qbqa(2.3)

  4. 外积或叉积

    一般意义上,四元数的乘法指的是外积或叉积,它是把 q a q_a qa 的每一项与 q b q_b qb 的每一项相乘,最后相加,整理可得:
    q a q b = s a s b − x a x b − y a y b − z a z b + ( s a x b + x a s b + y a z b − z a y b ) i + ( s a y b − x a z b + y a s b + z a x b ) j + ( s a z b + x a y b − y a x b + z a s b ) k (2.4) \begin{equation} \begin{split} q_aq_b & = s_as_b - x_ax_b - y_ay_b - z_az_b \\ & + (s_ax_b + x_as_b + y_az_b - z_ay_b)i \\ & + (s_ay_b - x_az_b + y_as_b + z_ax_b)j \\ & + (s_az_b + x_ay_b - y_ax_b + z_as_b)k \end{split} \end{equation} \tag{2.4} qaqb=sasbxaxbyaybzazb+(saxb+xasb+yazbzayb)i+(saybxazb+yasb+zaxb)j+(sazb+xaybyaxb+zasb)k(2.4)
    上面的表达式可以写成向量形式并利用内外积运算,使得表达式更加简洁:
    q a q b = [ s a s b − v a T v b , s a v b + s b v a + v a × v b ] (2.5) q_aq_b=[s_as_b - v_a^Tv_b, s_av_b + s_bv_a + v_a \times v_b] \tag{2.5} qaqb=[sasbvaTvb,savb+sbva+va×vb](2.5)
    这个结果也称为GraBmann积,它是四元数与旋转联系起来的关键。

    另外,由于最后一项外积的存在,四元数乘法通常是不可交换的,除非 v a v_a va v b v_b vb R 3 \mathbb{R}^3 R3 中共线,此时外项积为零。

    不过对于同一个四元数,具有相乘和幂的性质
    q a q b = q a + b , ( q a ) b = q a b , a , b ∈ R (2.6) q^aq^b = q^{a+b}, (q^a)^b = q^{ab},a,b \in \mathbb{R} \tag{2.6} qaqb=qa+b,(qa)b=qab,a,bR(2.6)

  5. 共轭

    四元数的共轭是把虚部取成相反数:
    q ∗ = s − x i − y j − z k = [ s , − v ] (2.7) q^* = s - xi - yj - zk = [s,-v] \tag{2.7} q=sxiyjzk=[s,v](2.7)
    四元数共轭与其本身相乘,会得到一个实四元数,其实部为模长的平方:
    q ∗ q = q q ∗ = [ s 2 + v T v , 0 ] T q^*q = qq^* = [s^2 + v^Tv,0]^T qq=qq=[s2+vTv,0]T
    此外,共轭的乘积满足以下性质
    ( q a q b ) ∗ = q b ∗ q a ∗ (q_aq_b)^* = q_b^*q_a^* (qaqb)=qbqa

  6. 模长或范数

    四元数的模长或范数定义为:
    ∣ ∣ q ∣ ∣ = q q ∗ = s 2 + x 2 + y 2 + z 2 (2.8) ||q|| = \sqrt{qq^*} = \sqrt{s^2 + x^2 +y^2 + z^2} \tag{2.8} ∣∣q∣∣=qq =s2+x2+y2+z2 (2.8)
    可以验证,两个四元数乘积的模即模的乘积,这使得单位四元数相乘后仍是单位四元数
    ∣ ∣ q a q b ∣ ∣ = ∣ ∣ q a ∣ ∣ ∣ ∣ q b ∣ ∣ ||q_aq_b|| = ||q_a||||q_b|| ∣∣qaqb∣∣=∣∣qa∣∣∣∣qb∣∣

  7. 四元数 q ∈ H 0 q \in \overset{0}{\mathbb{H}} qH0 的逆为:
    q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 (2.9) q^{-1} = \frac{q^*}{||q||^2} \tag{2.9} q1=∣∣q2q(2.9)
    按此定义,四元数和自己的逆的乘积为实四元数 1:
    q q − 1 = q − 1 q = q q ∗ ∣ ∣ q ∣ ∣ 2 = 1 qq^{-1} = q^{-1}q = \frac{qq^*}{||q||^2} = 1 qq1=q1q=∣∣q2qq=1
    如果 q q q 为单位四元数,其逆和共轭就是同一个量。同时,乘积的逆具有和矩阵相似的性质:
    ( q a q b ) − 1 = q b − 1 q a − 1 (q_aq_b)^{-1} = q_b^{-1}q_a^{-1} (qaqb)1=qb1qa1

2.2 高阶运算

高阶运算包括对数、指数和微分运算,对数和指数在 5.3 节旋转证明完后再次引出定义,这里作为性质总结先做一下介绍。

在介绍高阶运算前,引入以下定理:

四元数定理1:设 q = [ s , v ] ∈ H 1 q = [s,v] \in \mathbb{H}_1 q=[s,v]H1,那么存在 v ′ ∈ R 1 3 v' \in \mathbb{R}_1^3 vR13 θ ∈ [ − π , π ] \theta \in [-\pi , \pi] θ[π,π],使得 q = [ c o s θ , v ′ s i n θ ] q = [cos\theta, v'sin\theta] q=[cosθ,vsinθ]

接下来,我们具体介绍四元数的高阶运算:

  1. 对数运算

    使 q ∈ H 1 q\in \mathbb{H}_1 qH1 q q q 表示为 [ c o s θ , v s i n θ ] , θ ∈ R , v ∈ R 3 , ∣ v ∣ = 1 [cos\theta, vsin\theta], \theta \in \mathbb{R}, v \in \mathbb{R}^3, |v| = 1 [cosθ,vsinθ],θR,vR3,v=1,那么对数函数可以定义为:
    l o g   q ≡ [ 0 , θ v ] (2.10) log\ q \equiv [0,\theta v] \tag{2.10} log q[0,θv](2.10)
    注意,根据定义存在 l o g [ 1 , ( 0 , 0 , 0 ) ] = [ 0 , ( 0 , 0 , 0 ) ] log[1,(0,0,0)] = [0,(0,0,0)] log[1,(0,0,0)]=[0,(0,0,0)],并且 l o g   q log\ q log q 不是单位四元数。

  2. 指数运算

    对于以下形式的四元数: q = [ 0 , θ v ] , θ ∈ R , v ∈ R 3 , ∣ v ∣ = 1 q = [0,\theta v],\theta \in \mathbb{R},v \in \mathbb{R}^3,|v| = 1 q=[0,θv],θR,vR3,v=1,指数函数被定义为:
    e x p   q ≡ [ c o s θ , v s i n θ ] (2.11) exp \ q \equiv [cos\theta, vsin\theta] \tag{2.11} exp q[cosθ,vsinθ](2.11)
    注意:指数函数和对数函数可以互相转换,并且指数可以对应到单位四元数。

    从上面的定义可以推出以下定义,对于 q t , q ∈ H 1 , t ∈ R q^t,q \in \mathbb{H}_1,t \in \mathbb{R} qt,qH1,tR,它的指数方程形式:
    q t = e x p ( t l o g   q ) = [ c o s ( t θ ) , v s i n ( t θ ) ] (2.12) q^t = exp(tlog \ q) = [cos(t\theta),vsin(t\theta)] \tag{2.12} qt=exp(tlog q)=[cos(),vsin()](2.12)

  3. 微分运算

    此处给出常用的微分性质和证明,并将用于四元数插值曲线的推导:

    1. 当指数为常数时的微分法则:

      对于 q t , q ∈ H 1 , t ∈ R q^t,q\in \mathbb{H}_1,t\in \mathbb{R} qt,qH1,tR,有:
      d d t q t = q t l o g ( q ) \frac{d}{dt}q^t = q^t log(q) dtdqt=qtlog(q)

    2. 当指数为函数时的微分法则:

      在此之前,给出乘积微分法则和链式微分法则:

      乘积微分法则:使 f , g ∈ C 1 ( R , H ) f,g \in C^1(\mathbb{R},\mathbb{H}) f,gC1(R,H),其中 C 1 ( R , H ) C^1(\mathbb{R},\mathbb{H}) C1(R,H) 代表函数在定义域 R \mathbb{R} R,值域 H \mathbb{H} H 范围内一阶连续可导,这时有:
      d d t ( f ( t ) g ( t ) ) = ( d d t f ( t ) ) g ( t ) + f ( t ) ( d d t g ( t ) ) \frac{d}{dt}(f(t)g(t)) = (\frac{d}{dt}f(t))g(t) + f(t)(\frac{d}{dt}g(t)) dtd(f(t)g(t))=(dtdf(t))g(t)+f(t)(dtdg(t))
      链式微分法则:使 f ∈ C 1 ( H , H ) , g ∈ C 1 ( R , H ) f\in C^1(\mathbb{H}, \mathbb{H}),g \in C^1(\mathbb{R},\mathbb{H}) fC1(H,H),gC1(R,H),这时有:
      d d t ( f ( g ( t ) ) = f ′ ( g ( t ) ) g ′ ( t ) ) \frac{d}{dt}(f(g(t)) = f'(g(t))g'(t)) dtd(f(g(t))=f(g(t))g(t))
      当指数为函数时的微分法则:使 q ∈ C 1 ( R , H 1 ) , r ∈ C 1 ( R , R ) q \in C^1(\mathbb{R},\mathbb{H}_1), r \in C^1(\mathbb{R},\mathbb{R}) qC1(R,H1),rC1(R,R),由于 q q q 为单位四元数,所以 q ( t ) q(t) q(t) 可以写为 [ c o s θ ( t ) , v ( t ) s i n θ ( t ) ] [cos\theta(t),v(t)sin\theta(t)] [cosθ(t),v(t)sinθ(t)],这时有:
      d d t q ( t ) r ( t ) = d d t e x p ( r ( t ) l o g ( q ( t ) ) ) = d d t e x p ( r ( t ) [ 0 , v ( t ) θ ( t ) ] ) = d d t e x p ( [ 0 , r ( t ) v ( t ) θ ( t ) ] ) = d d t [ c o s ( r ( t ) θ ( t ) ) , s i n ( r ( t ) θ ( t ) ) v ( t ) ] = [ − s i n ( r ( t ) θ ( t ) ) ( r ′ ( t ) θ ( t ) + r ( t ) θ ′ ( t ) ) , c o s ( r ( t ) θ ( t ) ) ( r ′ ( t ) θ ( t ) + r ( t ) θ ′ ( t ) ) v ( t ) + s i n ( r ( t ) θ ( t ) ) v ′ ( t ) ] \begin{equation} \begin{split} \frac{d}{dt}q(t)^{r(t)} & = \frac{d}{dt}exp(r(t)log(q(t))) \\ & = \frac{d}{dt}exp(r(t)[0,v(t)\theta(t)]) \\ & = \frac{d}{dt}exp([0,r(t)v(t)\theta(t)]) \\ & = \frac{d}{dt}[cos(r(t)\theta(t)),sin(r(t)\theta(t))v(t)] \\ & = [-sin(r(t)\theta(t))(r'(t)\theta(t) + r(t)\theta'(t)), \\ & cos(r(t)\theta(t))(r'(t)\theta(t) + r(t)\theta'(t))v(t) + sin(r(t)\theta(t))v'(t)] \end{split} \end{equation} dtdq(t)r(t)=dtdexp(r(t)log(q(t)))=dtdexp(r(t)[0,v(t)θ(t)])=dtdexp([0,r(t)v(t)θ(t)])=dtd[cos(r(t)θ(t)),sin(r(t)θ(t))v(t)]=[sin(r(t)θ(t))(r(t)θ(t)+r(t)θ(t)),cos(r(t)θ(t))(r(t)θ(t)+r(t)θ(t))v(t)+sin(r(t)θ(t))v(t)]

3 四元数表示旋转

3.1 四元数与旋转关系

我们可以用四元数表示对一个点的旋转。假设有一个空间三维点 v = [ x , y , z ] ∈ R 3 v = [x,y,z] \in \mathbb{R}^3 v=[x,y,z]R3,以及一个由单位四元数 q 指定的旋转。三维点 v v v 经过 q q q 的旋转后变为 v ′ v' v。如果用 3 × 3 3\times 3 3×3 的齐次矩阵 R R R 描述,那么有 v ′ = R v v' = Rv v=Rv。如何用四元数描述旋转呢?

首先,可以把三维空间点用一个虚四元数来描述:
w = [ 0 , x , y , z ] T = [ 0 , v ] T w = [0,x,y,z]^T = [0,v]T w=[0,x,y,z]T=[0,v]T
这样做相当于把四元数的 3 个虚部和空间中的 3 个轴相对应。那么,旋转后的点 w ′ w' w 可以表示为这样的乘积:
w ′ = q w q − 1 (3.1) w' = qwq^{-1} \tag{3.1} w=qwq1(3.1)
这里的乘法均为四元数乘法,其结果也是四元数。最后把 w ′ w' w 的虚部取出,得到的就是旋转之后的点的坐标,且 w ′ w' w 的实部为 0,是个虚四元数。

例:求对点 p = [ 1 , 1 , 0 ] p = [1,1,0] p=[1,1,0] 绕 Z 轴顺时针旋转 90 ° 90\degree 90° 求转换后的 p ′ p' p 点的四元数结果。
q = [ c o s θ 2 , n x s i n θ 2 , n y s i n θ 2 , n z s i n θ 2 ] = [ 2 2 , 0 , 0 , 2 2 ] q ∗ = [ q 0 , − q 1 , − q 2 , − q 3 ] = [ 2 2 , 0 , 0 , − 2 2 ] q − 1 = q ∗ ∣ ∣ q ∣ ∣ = q ∗ = [ 2 2 , 0 , 0 , − 2 2 ] p ′ = q p q − 1 = [ 2 2 , 0 , 0 , 2 2 ] [ 0 , 1 , 1 , 0 ] [ 2 2 , 0 , 0 , − 2 2 ] = ( 2 2 + 2 2 k ) ( i + j ) ( 2 2 − 2 2 k ) = − i + j p ′ = ( 0 , − 1 , 1 , 0 ) \begin{equation} \begin{split} q & = [cos\frac{\theta}{2}, n_xsin\frac{\theta}{2},n_ysin\frac{\theta}{2},n_zsin\frac{\theta}{2}] \\& = [\frac{\sqrt{2}}{2},0,0,\frac{\sqrt{2}}{2}] \\ q^* &= [q_0,-q_1,-q_2,-q_3] = [\frac{\sqrt{2}}{2},0,0,-\frac{\sqrt{2}}{2}] \\ q^{-1} &= \frac{q^*}{||q||} = q^* = [\frac{\sqrt{2}}{2},0,0,-\frac{\sqrt{2}}{2}] \\ p' &= qpq^{-1} \\ &= [\frac{\sqrt{2}}{2},0,0,\frac{\sqrt{2}}{2}][0,1,1,0][\frac{\sqrt{2}}{2},0,0,-\frac{\sqrt{2}}{2}] \\ & = (\frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2}k)(i + j)(\frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}k) \\ & =-i + j \\ p'&=(0,-1,1,0) \end{split} \end{equation} qqq1pp=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]=[22 ,0,0,22 ]=[q0,q1,q2,q3]=[22 ,0,0,22 ]=∣∣q∣∣q=q=[22 ,0,0,22 ]=qpq1=[22 ,0,0,22 ][0,1,1,0][22 ,0,0,22 ]=(22 +22 k)(i+j)(22 22 k)=i+j=(0,1,1,0)

3.2 旋转四元数求导

假设单位四元数 q q q 是关于时间 t t t 的函数,该四元数旋转的角速度为 w w w

那么:
q t = c o s ( ∣ ∣ w t ∣ ∣ 2 ) + w ∣ ∣ w ∣ ∣ s i n ( ∣ w ∣ ∣ t 2 ) q_t = cos(\frac{||wt||}{2}) + \frac{w}{||w||}sin(\frac{|w||t}{2}) qt=cos(2∣∣wt∣∣)+∣∣w∣∣wsin(2w∣∣t)

q t ′ = − ∣ ∣ w ∣ ∣ 2 s i n ( ∣ ∣ w ∣ ∣ t 2 ) + w 2 c o s ( ∣ ∣ w ∣ ∣ t 2 ) = − w T w 2 ∣ ∣ w ∣ ∣ s i n ( ∣ ∣ w ∣ ∣ t 2 ) + w 2 c o s ( ∣ ∣ w ∣ ∣ t 2 ) = − w 2 ⋅ w ∣ ∣ w ∣ ∣ s i n ( ∣ ∣ w ∣ ∣ t 2 ) + w 2 c o s ( ∣ ∣ w ∣ ∣ t 2 ) \begin{equation} \begin{split} q_t' &= - \frac{||w||}{2}sin(\frac{||w||t}{2}) + \frac{w}{2}cos(\frac{||w||t}{2}) \\ &=-\frac{w^Tw}{2||w||}sin(\frac{||w||t}{2}) + \frac{w}{2}cos(\frac{||w||t}{2}) \\ &= - \frac{w}{2} \cdot \frac{w}{||w||}sin(\frac{||w||t}{2}) + \frac{w}{2}cos(\frac{||w||t}{2}) \end{split} \end{equation} qt=2∣∣w∣∣sin(2∣∣w∣∣t)+2wcos(2∣∣w∣∣t)=2∣∣w∣∣wTwsin(2∣∣w∣∣t)+2wcos(2∣∣w∣∣t)=2w∣∣w∣∣wsin(2∣∣w∣∣t)+2wcos(2∣∣w∣∣t)
记四元数 q w = [ 0 , w ⃗ 2 ] q_w = [0,\frac{\vec{w}}{2}] qw=[0,2w ],那么:
q t ′ = q w q t (3.2) q_t' = q_wq_t \tag{3.2} qt=qwqt(3.2)

4 四元数与其他旋转表示的相互转换

任意单位四元数描述了一个旋转,该旋转也可以用旋转向量、旋转矩阵或欧拉角描述。下面我们将介绍四元数与旋转向量、旋转矩阵以及欧拉角之间的相互转换关系。

4.1 四元数与旋转向量

4.1.1 旋转向量转四元数

假设已知等效旋转轴方向单位旋转向量 u = [ u x , u y , u z ] T u = [u_x,u_y,u_z]^T u=[ux,uy,uz]T,旋转角度为 θ \theta θ,其等效的单位四元数为 q = [ q 0 , q 1 , q 2 , q 3 ] q = [q_0,q_1,q_2,q_3] q=[q0,q1,q2,q3],则:
q 0 = c o s ( θ 2 ) q 1 = u x s i n ( θ 2 ) q 2 = u y s i n ( θ 2 ) q 3 = u z s i n ( θ 2 ) (4.1) \begin{equation} \begin{split} q_0 &= cos(\frac{\theta}{2}) \\ q_1 &= u_xsin(\frac{\theta}{2}) \\ q_2 &= u_ysin(\frac{\theta}{2}) \\ q_3 &= u_zsin(\frac{\theta}{2}) \end{split} \end{equation}\tag{4.1} q0q1q2q3=cos(2θ)=uxsin(2θ)=uysin(2θ)=uzsin(2θ)(4.1)

4.1.2 四元数转旋转向量

同理,已知单位四元数 [ q 0 , q 1 , q 2 , q 3 ] [q_0,q_1,q_2,q_3] [q0,q1,q2,q3],求旋转向量为 [ u x , u y , u z ] [u_x,u_y,u_z] [ux,uy,uz],旋转角度为 θ \theta θ
θ = 2 ⋅ a r c c o s ( q 0 ) [ u x , u y , u z ] T = [ q 1 , q 2 , q 3 ] T / s i n ( θ 2 ) (4.2) \begin{equation} \begin{split} \theta &= 2 \cdot arccos(q_0) \\ [u_x, u_y, u_z]^T &= [q_1, q_2, q_3]^T/sin(\frac{\theta}{2}) \end{split} \end{equation} \tag{4.2} θ[ux,uy,uz]T=2arccos(q0)=[q1,q2,q3]T/sin(2θ)(4.2)

4.2 四元数与旋转矩阵

有了四元数,我们可以计算出旋转向量 n n n 与旋转角度 θ \theta θ,然后根据罗德里格斯变换算出矩阵 R R R,也可以直接根据四元数计算出 R R R

4.2.1 四元数转旋转矩阵

已知单位四元数 [ q 0 , q 1 , q 2 , q 3 ] [q_0,q_1,q_2,q_3] [q0,q1,q2,q3],对应的旋转矩阵 R R R 为:
R = [ 1 − 2 q 2 2 − 2 q 3 2 2 q 1 q 2 − 2 q 0 q 3 2 q 1 q 3 + 2 q 0 q 2 2 q 1 q 2 + 2 q 0 q 3 1 − 2 q 1 2 − 2 q 3 2 2 q 2 q 3 − 2 q 0 q 1 2 q 1 q 3 − 2 q 0 q 2 2 q 2 q 3 + 2 q 0 q 1 1 − 2 q 1 2 − 2 q 2 2 ] (4.3) R = \begin{bmatrix} 1 - 2q_2^2 - 2q_3^2 && 2q_1q_2 - 2q_0q_3 && 2q_1q_3 + 2q_0q_2 \\ 2q_1q_2 + 2q_0q_3 && 1-2q_1^2-2q_3^2 && 2q_2q_3-2q_0q_1 \\ 2q_1q_3 - 2q_0q_2 && 2q_2q_3 + 2q_0q_1 && 1-2q_1^2 - 2q_2^2 \end{bmatrix} \tag{4.3} R= 12q222q322q1q2+2q0q32q1q32q0q22q1q22q0q312q122q322q2q3+2q0q12q1q3+2q0q22q2q32q0q112q122q22 (4.3)

4.2.2 旋转矩阵转四元数

假设已知变换矩阵:
R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] R = \begin{bmatrix} r_{11} && r_{12} && r_{13} \\ r_{21} && r_{22} && r_{23} \\ r_{31} && r_{32} && r_{33} \end{bmatrix} R= r11r21r31r12r22r32r13r23r33
根据公式(4.3),推导对应的单位四元数为:
q 0 = 1 + r 11 + r 22 + r 33 2 q 1 = r 32 − r 23 4 q 0 q 2 = r 13 − r 31 4 q 0 q 3 = r 21 − r 12 4 q 0 (4.4) \begin{equation} \begin{split} q_0 &= \frac{\sqrt{1 + r_{11} + r_{22} + r_{33}}}{2} \\ q_1 &= \frac{r_{32} - r_{23}}{4q_0} \\ q_2 &= \frac{r_{13} - r_{31}}{4q_0} \\ q_3 &= \frac{r_{21} - r_{12}}{4q_0} \end{split} \end{equation}\tag{4.4} q0q1q2q3=21+r11+r22+r33 =4q0r32r23=4q0r13r31=4q0r21r12(4.4)

4.3 四元数与欧拉角

在不同的旋转顺序下,欧拉角和四元数之间的转换公式是不一样的,下述推导使用的旋转顺序为: Z → Y → X Z\rightarrow Y \rightarrow X ZYX(绕固定坐标系的 X Y Z XYZ XYZ 依次旋转)。

4.3.1 欧拉角转四元数

假设绕 X X X 轴的旋转角度为 θ \theta θ,绕 Y Y Y 轴的旋转角度为 ψ \psi ψ,绕 Z Z Z 轴的旋转角度为 φ \varphi φ,将这三组绕对应轴系旋转相应角度的变换转换为四元数可以得到如下公式:
q x = [ c o s ( θ 2 ) , s i n ( θ 2 ) , 0 , 0 ] q y = [ c o s ( ψ 2 ) , 0 , s i n ( ψ 2 ) , 0 ] q z = [ c o s ( φ 2 ) , 0 , 0 , s i n ( φ 2 ) ] q_x = [cos(\frac{\theta}{2}),sin(\frac{\theta}{2}),0,0] \\ q_y = [cos(\frac{\psi}{2}),0,sin(\frac{\psi}{2}),0] \\ q_z = [cos(\frac{\varphi}{2}),0,0,sin(\frac{\varphi}{2})] qx=[cos(2θ),sin(2θ),0,0]qy=[cos(2ψ),0,sin(2ψ),0]qz=[cos(2φ),0,0,sin(2φ)]
根据四元数的乘法可知:
q = q z q y q x q = q_zq_yq_x q=qzqyqx
计算可得:
q 0 = c o s ( φ 2 ) c o s ( ψ 2 ) c o s ( θ 2 ) + s i n ( φ 2 ) s i n ( ψ 2 ) s i n ( θ 2 ) q 1 = c o s ( φ 2 ) c o s ( ψ 2 ) s i n ( θ 2 ) − s i n ( φ 2 ) s i n ( ψ 2 ) c o s ( θ 2 ) q 2 = c o s ( φ 2 ) s i n ( ψ 2 ) c o s ( θ 2 ) + s i n ( φ 2 ) c o s ( ψ 2 ) s i n ( θ 2 ) q 3 = s i n ( φ 2 ) c o s ( ψ 2 ) c o s ( θ 2 ) − c o s ( φ 2 ) s i n ( ψ 2 ) s i n ( θ 2 ) q_0 = cos(\frac{\varphi}{2})cos(\frac{\psi}{2})cos(\frac{\theta}{2}) + sin(\frac{\varphi}{2})sin(\frac{\psi}{2})sin(\frac{\theta}{2}) \\ q_1 = cos(\frac{\varphi}{2})cos(\frac{\psi}{2})sin(\frac{\theta}{2}) - sin(\frac{\varphi}{2})sin(\frac{\psi}{2})cos(\frac{\theta}{2}) \\ q_2 = cos(\frac{\varphi}{2})sin(\frac{\psi}{2})cos(\frac{\theta}{2}) + sin(\frac{\varphi}{2})cos(\frac{\psi}{2})sin(\frac{\theta}{2}) \\ q_3 = sin(\frac{\varphi}{2})cos(\frac{\psi}{2})cos(\frac{\theta}{2}) - cos(\frac{\varphi}{2})sin(\frac{\psi}{2})sin(\frac{\theta}{2}) q0=cos(2φ)cos(2ψ)cos(2θ)+sin(2φ)sin(2ψ)sin(2θ)q1=cos(2φ)cos(2ψ)sin(2θ)sin(2φ)sin(2ψ)cos(2θ)q2=cos(2φ)sin(2ψ)cos(2θ)+sin(2φ)cos(2ψ)sin(2θ)q3=sin(2φ)cos(2ψ)cos(2θ)cos(2φ)sin(2ψ)sin(2θ)

4.3.2 四元数转欧拉角

在已知欧拉角和旋转次序的情况下,我们可以很快速的得到欧拉角对应的旋转矩阵,根据 5.2 中我们获得的四元数对应的旋转矩阵,将两者等价,我们就可以将四元数转为欧拉角。

[ θ ψ φ ] = [ a t a n 2 ( 2 ( q 0 q 1 + q 2 q 3 ) , 1 − 2 ( q 1 2 + q 2 2 ) ) a r c s i n ( 2 ( q 0 q 2 − q 1 q 3 ) ) a t a n 2 ( 2 ( q 0 q 3 + q 1 q 2 ) , 1 − 2 ( q 2 2 + q 3 2 ) ) ] \begin{bmatrix} \theta \\ \psi \\ \varphi\end{bmatrix} = \begin{bmatrix} atan2(2(q_0q_1 + q_2q_3),1 - 2(q_1^2 + q_2^2)) \\ arcsin(2(q_0q_2 - q_1q_3)) \\ atan2(2(q_0q_3 + q_1q_2),1 - 2(q_2^2 + q_3^2)) \end{bmatrix} θψφ = atan2(2(q0q1+q2q3),12(q12+q22))arcsin(2(q0q2q1q3))atan2(2(q0q3+q1q2),12(q22+q32))
这里使用了 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x) 而不是 a r c t a n ( y x ) arctan(\frac{y}{x}) arctan(xy),因为 a r c t a n ( y x ) arctan(\frac{y}{x}) arctan(xy) 的取值范围为 [ − π 2 , π 2 ] [-\frac{\pi}{2},\frac{\pi}{2}] [2π,2π],只有 180 ° 180\degree 180°,而绕某个轴旋转时,其范围是 360 ° 360\degree 360° a t a n 2 ( y , x ) atan2(y,x) atan2(y,x) 正好满足需求。 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x) 是一个函数,返回以弧度表示的 y x \frac{y}{x} xy 的反正切, y y y x x x 的值的符号决定了正确的象限,也可以理解为计算复数 x + y i x+yi x+yi 的辐角,计算式 a t a n 2 atan2 atan2 a t a n atan atan 更稳定。

4.3.3 欧拉角的万向锁问题

需要注意的是在使用欧拉角时,会出现奇异性问题即万向锁,下面将对这种现象进行分析。

当刚体绕 Y Y Y 轴旋转 90 ° 90\degree 90° 即俯仰角 p i t c h = 90 ° pitch = 90\degree pitch=90° 时,如何计算滚转角 r o l l roll roll 和偏航角 y a w yaw yaw ?这时候就会发生自由度丢失的情况,即 r o l l roll roll y a w yaw yaw 会变成一个自由度。此时再使用上面的公式根据四元数计算欧拉角就会出现问题:

a r c s i n ( 2 ( q 0 q 2 − q 1 q 3 ) ) arcsin(2(q_0q_2 - q_1q_3)) arcsin(2(q0q2q1q3)) 的定义域为 [ − 1 , 1 ] [-1,1] [1,1],当 2 ( q 0 q 2 − q 1 q 3 ) = ± 0.5 2(q_0q_2 - q_1q_3) = \pm 0.5 2(q0q2q1q3)=±0.5 时(注意:在程序中浮点是不能直接进行等于判断,需要使用合理的阈值进行判断),俯仰角 ψ \psi ψ ± 90 ° \pm 90 \degree ±90°。将其带入正向公式计算出四元数 [ q 0 , q 1 , q 2 , q 3 ] [q_0,q_1,q_2,q_3] [q0,q1,q2,q3] 如下:
q 0 = 2 2 ( c o s ( φ 2 ) c o s ( θ 2 ) + s i n ( φ 2 ) s i n ( θ 2 ) ) = 2 2 c o s θ − φ 2 q 1 = 2 2 ( c o s ( φ 2 ) s i n ( θ 2 ) − s i n ( φ 2 ) c o s ( θ 2 ) ) = 2 2 s i n θ − φ 2 q 2 = 2 2 ( c o s ( φ 2 ) c o s ( θ 2 ) + s i n ( φ 2 ) s i n ( θ 2 ) ) = 2 2 c o s θ − φ 2 q 3 = 2 2 ( s i n ( φ 2 ) c o s ( θ 2 ) − c o s ( φ 2 ) s i n ( θ 2 ) ) = − 2 2 s i n θ − φ 2 \begin{equation} \begin{split} q_0 &= \frac{\sqrt{2}}{2}(cos(\frac{\varphi}{2})cos(\frac{\theta}{2}) + sin(\frac{\varphi}{2})sin(\frac{\theta}{2})) = \frac{\sqrt{2}}{2}cos\frac{\theta - \varphi}{2} \\ q_1 &=\frac{\sqrt{2}}{2}(cos(\frac{\varphi}{2})sin(\frac{\theta}{2}) - sin(\frac{\varphi}{2})cos(\frac{\theta}{2})) = \frac{\sqrt{2}}{2}sin\frac{\theta - \varphi}{2} \\ q_2 &= \frac{\sqrt{2}}{2}(cos(\frac{\varphi}{2})cos(\frac{\theta}{2}) + sin(\frac{\varphi}{2})sin(\frac{\theta}{2})) = \frac{\sqrt{2}}{2}cos\frac{\theta - \varphi}{2} \\ q_3 &= \frac{\sqrt{2}}{2}(sin(\frac{\varphi}{2})cos(\frac{\theta}{2}) - cos(\frac{\varphi}{2})sin(\frac{\theta}{2})) = -\frac{\sqrt{2}}{2}sin\frac{\theta - \varphi}{2} \end{split} \end{equation} q0q1q2q3=22 (cos(2φ)cos(2θ)+sin(2φ)sin(2θ))=22 cos2θφ=22 (cos(2φ)sin(2θ)sin(2φ)cos(2θ))=22 sin2θφ=22 (cos(2φ)cos(2θ)+sin(2φ)sin(2θ))=22 cos2θφ=22 (sin(2φ)cos(2θ)cos(2φ)sin(2θ))=22 sin2θφ
此时我们将四元数带入逆向公式发现:
[ θ ψ φ ] = [ a t a n 2 ( 2 ( q 0 q 1 + q 2 q 3 ) , 1 − 2 ( q 1 2 + q 2 2 ) ) a r c s i n ( 2 ( q 0 q 2 − q 1 q 3 ) ) a t a n 2 ( 2 ( q 0 q 3 + q 1 q 2 ) , 1 − 2 ( q 2 2 + q 3 2 ) ) ] = [ a t a n 2 ( 0 , 0 ) a r c s i n ( 1 ) a t a n 2 ( 0 , 0 ) ] \begin{bmatrix} \theta \\ \psi \\ \varphi\end{bmatrix} = \begin{bmatrix} atan2(2(q_0q_1 + q_2q_3),1 - 2(q_1^2 + q_2^2)) \\ arcsin(2(q_0q_2 - q_1q_3)) \\ atan2(2(q_0q_3 + q_1q_2),1 - 2(q_2^2 + q_3^2)) \end{bmatrix} = \begin{bmatrix} atan2(0,0) \\ arcsin(1) \\ atan2(0,0) \end{bmatrix} θψφ = atan2(2(q0q1+q2q3),12(q12+q22))arcsin(2(q0q2q1q3))atan2(2(q0q3+q1q2),12(q22+q32)) = atan2(0,0)arcsin(1)atan2(0,0)
即出现了 0 0 \frac{0}{0} 00 的情况,无法进行计算。

解决方法:

根据正向公式推导可知 q 1 q 0 = − q 3 q 2 = t a n θ − φ 2 \frac{q_1}{q_0} = -\frac{q_3}{q_2} = tan \frac{\theta - \varphi}{2} q0q1=q2q3=tan2θφ,于是可以推出:
θ − φ = 2 a t a n 2 ( q 1 , q 0 ) \theta - \varphi = 2atan2(q_1,q_0) θφ=2atan2(q1,q0)
通常令 θ = 0 \theta = 0 θ=0,这时 φ = − 2 a t a n 2 ( q 1 , q 0 ) \varphi = -2atan2(q_1,q_0) φ=2atan2(q1,q0)

5 四元数的其他性质

为了更全面理解四元数和方便引入 Slerp 插值,这一节补充四元数的其它性质:旋转复合、双倍覆盖、指数性质以及幂函数性质。

5.1 旋转复合

旋转的复合其实在我们之前证明 q 2 = q q [ c o s ( 2 θ ) , s i n ( 2 θ ) u ] q^2 = qq [cos(2\theta),sin(2\theta)u] q2=qq[cos(2θ),sin(2θ)u] 的时候就已经涉及到这一点了,但在这里我们考虑的是更一般的情况。假设有两个表示沿着不同轴、不同角度旋转的四元数 q 1 , q 2 q_1,q_2 q1,q2。首先,我们实施 q 1 q_1 q1 的变换,变换之后的 v ′ v' v 为:
v ′ = q 1 v q 1 ∗ v' = q_1vq_1^* v=q1vq1
接下来,对 v ′ v' v 进行 q 2 q_2 q2 的变换,得到 v ′ ′ v'' v′′
v ′ ′ = q 2 v ′ q 2 ∗ = q 2 q 1 v q 1 ∗ q 2 ∗ = q n e t v q n e t ∗ v'' = q_2v'q_2^* = q_2q_1vq_1^*q_2^* = q_{net}vq_{net}^* v′′=q2vq2=q2q1vq1q2=qnetvqnet
其中 q n e t = q 2 q 1 q_{net} = q_2q_1 qnet=q2q1,另外写成上面的形式,还用到性质 q 1 ∗ q 2 ∗ = ( q 2 q 1 ) ∗ q_1^*q_2^* = (q_2q_1)^* q1q2=(q2q1)

注意四元数乘法的顺序,这和矩阵、复数的复合非常相似,都是从右向左叠加。另外要注意的是, q 1 q_1 q1 q 2 q_2 q2 的等价旋转 q n e t q_{net} qnet 并不是沿着 q 1 q_1 q1 q 2 q_2 q2 的两个旋转轴进行的两次旋转,它是沿着一个全新的旋转轴进行的一个等价旋转,仅仅只有旋转的结果相同。

5.2 双倍覆盖

四元数与三维旋转的关系并不是一对一的,同一个三维旋转可以用两个不同的四元数来表示。

对于任意的单位四元数 q = [ c o s ( θ 2 ) , s i n ( θ 2 ) u ] q = [cos(\frac{\theta}{2}), sin(\frac{\theta}{2})u] q=[cos(2θ),sin(2θ)u] q q q − q -q q 代表的是同一个旋转。如果 q q q 表示的是沿着旋转轴 u u u 旋转 θ \theta θ 度,那么 − q -q q 代表的是沿着相反的旋转轴 − u -u u 旋转 ( 2 π − θ ) (2\pi - \theta) (2πθ),负负得正:
− q = [ − c o s ( θ 2 ) , − s i n ( θ 2 ) u ] = [ c o s ( π − θ 2 ) , s i n ( π − θ 2 ) ( − u ) ] \begin{equation} \begin{split} -q &= [-cos(\frac{\theta}{2}),-sin(\frac{\theta}{2})u] \\ &= [cos(\pi - \frac{\theta}{2}),sin(\pi - \frac{\theta}{2})(-u)] \end{split} \end{equation} q=[cos(2θ),sin(2θ)u]=[cos(π2θ),sin(π2θ)(u)]
从下面的图中我们可以看出,这两个旋转是完全等价的:

其实从四元数的旋转公式中也能推导出相同的结果:
( − q ) v ( − q ) ∗ = ( − 1 ) 2 q v q ∗ = q v q ∗ (-q)v(-q)^* = (-1)^2qvq^* = qvq^* (q)v(q)=(1)2qvq=qvq
所以,我们经常说单位四元数与三维旋转有一个二对一满射同态(2-1 Surjective Homomorphism)关系,或者说单位四元函数双倍覆盖(Double Cover)了三维旋转。

有一点需要注意的是,虽然 q q q − q -q q 是两个不同的四元数,但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,它们的旋转矩阵是完全相同的,即旋转矩阵并不会出现双倍覆盖的问题。

5.3 指数性质

在介绍四元数的高阶运算时,我们给出了四元数的指数运算的公式,下面将进行进一步的讨论。

在讨论复数时,我们利用欧拉公式将二维的旋转写成了 v ′ = e i θ v v' = e^{i\theta v} v=eiθv 这样的指数形式。实际上,我们也可以利用四元数将三维旋转写成了类似的形式。

类似于复数的欧拉公式,四元数也有一个类似的公式。如果 u u u 是一个单位向量,那么对于单位四元数 u q = [ 0 , u ] u_q = [0,u] uq=[0,u],有:
e u θ = c o s ( θ ) + u q s i n ( θ ) = c o s ( θ ) + u s i n ( θ ) e^{u\theta} = cos(\theta) + u_qsin(\theta) = cos(\theta) + usin(\theta) euθ=cos(θ)+uqsin(θ)=cos(θ)+usin(θ)
这也就是说, q = [ c o s ( θ ) , s i n ( θ ) u ] q = [cos(\theta),sin(\theta)u] q=[cos(θ),sin(θ)u] 可以使用指数表示为 e u θ e^{u\theta} euθ。这个公式的证明与欧拉公式的证明非常类似,直接使用级数展开就可以了。

注意,因为 u u u 是一个单位向量, u 2 = [ − u ⋅ u , 0 ] = − ∣ ∣ u ∣ ∣ 2 = − 1 u^2 = [-u \cdot u, 0] = -||u||^2 = -1 u2=[uu,0]=∣∣u2=1。这与欧拉公式中的 i i i 是非常类似的。有了指数型的表示方式,我们就能将之前四元数的旋转公式改写为指数形式了,由此可以得到定义:

四元数旋转公式(指数型):任意向量 v v v 沿着以单位向量定义的旋转轴 u u u 旋转 θ \theta θ 角度之后的 v ′ v' v 可以使用四元数的指数表示。令 w = [ 0 , v ] , u q = [ 0 , u ] w = [0,v], u_q = [0,u] w=[0,v],uq=[0,u],那么:
w ′ = e u q θ 2 v e − u q θ 2 w' = e^{u_q\frac{\theta}{2}}ve^{-u_q\frac{\theta}{2}} w=euq2θveuq2θ
有了四元数的指数定义,我们就能够定义四元数的更多运算了。

  1. 自然对数 l o g log log,对任意单位四元数 q = [ c o s ( θ ) , s i n ( θ ) u ] = e u q θ q = [cos(\theta),sin(\theta)u] = e^{u_q\theta} q=[cos(θ),sin(θ)u]=euqθ
    l o g ( q ) = l o g ( e u q θ ) = [ 0 , u θ ] log(q) = log(e^{u_q\theta}) = [0,u\theta] log(q)=log(euqθ)=[0,uθ]

  2. 单位四元数的幂运算:
    q t = ( e u q θ ) t = e u q ( t θ ) = [ c o s ( t θ ) , s i n ( t θ ) u ] q^t = (e^{u_q\theta})^t = e^{u_q(t\theta)} = [cos(t\theta),sin(t\theta)u] qt=(euqθ)t=euq()=[cos(),sin()u]
    由此可见,一个单位四元数的 t t t 次幂等同于将它的旋转角度缩放至 t t t 倍,并且不会改变它的旋转轴( u u u 必须是单位向量,所以一般不能与 t t t 结合)。

5.4 幂函数性质

上面给出四元数的指数性质后,可以推导出一个重要的幂函数性质,这一性质将在四元数插值中用到。首先我们先介绍一个推论:

四元数推论1:设 q ∈ H 1 , p = [ a , b v ] q \in \mathbb{H}_1,p = [a,bv] qH1,p=[a,bv],其中 a , b , r ∈ R , v ∈ R 3 a,b,r \in \mathbb{R},v \in \mathbb{R}^3 a,b,rR,vR3,如果 q [ r , v ] q ∗ = [ r , v ′ ] q[r,v]q^* = [r,v'] q[r,v]q=[r,v],那么 q [ a , b v ] q ∗ = [ a , b v ′ ] q[a,bv]q^* = [a,bv'] q[a,bv]q=[a,bv]

推论证明:
q p q ∗ = q [ a , b v ] q ∗ = q b [ a b , v ] q ∗ = b [ a b , v ′ ] = [ a , b v ′ ] \begin{equation} \begin{split} qpq^* & = q[a,bv]q^* \\ & = qb[\frac{a}{b},v]q^* \\ & = b[\frac{a}{b},v'] \\ & = [a,bv'] \end{split} \end{equation} qpq=q[a,bv]q=qb[ba,v]q=b[ba,v]=[a,bv]
根据推论,得出以下定理:

四元数定理2:设 q , p ∈ H 1 , p = [ c o s θ , s i n θ v ] , t ∈ R q,p \in \mathbb{H}_1,p = [cos\theta,sin\theta v],t \in \mathbb{R} q,pH1,p=[cosθ,sinθv],tR,那么 q p t q ∗ = ( q p q ∗ ) t qp^tq^* = (qpq^*)^t qptq=(qpq)t

定理证明:

根据推论:存在 v ′ ∈ R 3 v' \in \mathbb{R}^3 vR3,使得 q [ c o s θ , s i n θ v ] q ∗ = [ c o s θ , s i n θ v ′ ] q[cos\theta,sin\theta v]q^* = [cos\theta,sin\theta v'] q[cosθ,sinθv]q=[cosθ,sinθv],因此得到:
q p t q ∗ = q ( e x p ( t l o g   p ) ) q ∗ = q ( e x p ( t [ 0 , θ v ] ) ) q ∗ = q ( e x p [ 0 , t θ v ] ) q ∗ = [ c o s t θ , s i n t θ v ′ ] = e x p ( t [ 0 , θ v ′ ] ) = e x p ( t l o g [ c o s θ , s i n θ v ′ ] ) = e x p ( t l o g ( q p q ∗ ) ) = ( q p q ∗ ) t \begin{equation} \begin{split} qp^tq^* &= q(exp(tlog\ p))q^* \\ & = q(exp(t[0,\theta v]))q^* \\ & = q(exp[0,t\theta v])q^* \\ & = [cost\theta,sint\theta v'] \\ & = exp(t[0,\theta v']) \\ & = exp(t log[cos\theta,sin\theta v']) \\ & = exp(t log(qpq^*)) \\ &=(qpq^*)^t \end{split} \end{equation} qptq=q(exp(tlog p))q=q(exp(t[0,θv]))q=q(exp[0,v])q=[cos,sinv]=exp(t[0,θv])=exp(tlog[cosθ,sinθv])=exp(tlog(qpq))=(qpq)t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习笔记:基于策略的学习之策略迭代(python实现)

目录 1. 前言 2. 算法流程 3. 代码及仿真结果 3.1 class PolicyIterationPlanner() 3.2 测试代码 3.3 运行结果 3.3.1 价值估计结果 3.3.2 策略迭代得到的最终策略 1. 前言 在强化学习中,根据是否依赖于(环境的)模型,可以分…

OAK相机与树莓派

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

机器人中的数值优化之修正阻尼牛顿法

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 Newtons Method 2 Pratical Newtons Method 1 Newtons Method 当我们引入函数的二阶信息就考虑到了curvature info,这里先对函数进行泰勒展开,取二阶近似,对近似后的函数取最优解&#…

springboot 线程池

为什么要使用线程池 使用线程池之后,不需要频繁的去创建和销毁线程(比如项目中手动创建线程,new Thread 类,我们可以把创建和销毁的线程的过程去掉),从而让线程得到重复的使用。并且可以对线程进行统一的管…

手把手教你用 Python 搭建一个图像分类器

深度学习是使用人工神经网络进行机器学习的一个子集,目前已经被证明在图像分类方面非常强大。 尽管这些算法的内部工作在数学上是严格的,但 Python 库(比如 keras)使这些问题对我们所有人都可以接近。 在本文中,我将介绍一个简单的图像分类…

机器人中的数值优化之最速下降法

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 迭代方向 2 步长的选择 3 Armijo condition 4 非精确线搜索的优势 1 迭代方向 梯度方向是函数上升最快的方向,而负梯度方向则是函数下降最快的方向,因此最速下降法就是以负梯度方向为迭代方向…

二叉树的构造和相关功能的代码实现及解析

目录 一.二叉树类的定义 二.构造二叉树(构造函数) 三.为二叉树插入节点(insert_value) 四.移除根节点(remove_root,lchild_leaf) 五.移除二叉树中的某值(remove,remove_value) 六.清空二叉树 七.前、中、后序遍历 一.二叉树类的定义 二叉树类的定…

Django入门学习-了解基本模块

目录 MVT设计了解 认识MVT 实际操作 Template: View: 路由配置 Model: 默认的后台管理模块 初始化admin模块 应用中Admin注册 MVT设计了解 认识MVT Django的web设计模型是MVT: Model:数据存储层,处理所有数据相关的业…

idea+ApifoxUploader+Apifox真是内外双修,香

前言 最近部门为整合后端组、前端组、测试组、需求组、产品组等组之间的工作流程,旨在提高协调与高效,其中之一就是希望开发组(后端、前端)开发的接口能及时更新,测试组能做接口测试,后期方便出文档&#x…

大公司为什么禁止SpringBoot项目使用Tomcat?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

【2】burpsuite屏蔽浏览器无用流量包方法

0x01 问题描述经常会使用火狐或者谷歌去burpsuite对站点进行测试,但是在测试的过程中burpsuite经常抓到火狐浏览器自身的数据包或者其他无用的数据包,这就对我们工作的效率大有影响,所以这里来告诉大家如何解决此类问题。0x02 问题复现访问网…

星环科技数据治理与数据价值评估实践分享

数据价值评估背景 自2015年8月国务院《促进大数据发展行动纲要》提出“数据已成为国家基础性战略资源”以来,我国出台了诸多政策和法案,推进数据的发展和数据要素的资产化。 2019年10月,第十九届四中全会关于《推进国家治理体系和治理能力现…

Node.js安装详细教程

安装 Node.js 官网下载安装包https://nodejs.org/zh-cn/,一直【下一步】安装即可。 设置Windows操作系统全局环境变量 为什么设置环境变量? 当我们在cmd命令行中输入命令时,系统首先会在当前目录下去找命令对应的可执行程序,如果…

后端校验(hibernate-validator)

目录一、介绍和依赖二、方法的 Model 参数校验三、方法的非 Model 参数校验四、常用注解五、快速失败六、自定义校验规则一、介绍和依赖 hibernate-validator 是 Java 中常用的后端校验框架 https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/【…

提取各种数据结构中的元素将提取结果合并为迭代对象 itertools.chain(*a,b)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 提取各种数据结构中的元素 将提取结果合并为迭代对象 itertools.chain(*a,b) [太阳]选择题 以下python代码最后输出正确的一项是? from itertools import chain a[(1, A), (2, B), …

Java高效率复习-线程基础[线程]

内容大纲 线程相关概念 并发并行 当只有一个CPU时,会执行并发的效果,在多个应用程序之间快速切换,而有多个CPU时,则多个CPU独立执行,而当进程多于CPU个数时,则会出现并发并行的情况,总有一个CPU…

如何炼就数据分析的思维?

目录 前言结构化思维假说演绎思维指标化思维维度分析思维 前言 面对数据异常,我们经常会出现“好像是A原因引起的?”“貌似和B原因也相关?““有可能是 C操作不当“的主观臆测。 或者,拿到一个分析议题,分析”11 月销售…

@ConfigurationProperties注解使用方法(内含源代码)

ConfigurationProperties注解使用方法(内含源代码) 源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87400774 目录ConfigurationProperties注解使用方法(内含源代码)源代码下载链接地址&…

怎么识别截图中的文字?这三个方法让你轻松学会

在日常工作或学习中,我们会经常在网上查阅一些资料,当遇到一些优美的句子或者段落时,都会手动摘抄下来,这种记录方式不仅很耗时,还耗费精力,并且现在很多网站都已经不支持文本复制了,遇到这种情…

6.验证面试高频问题整理(附答案)

目录 Q126.top-down phase、bottom-up phase有哪些 Q127.为什么build_phase是top-down phase,connect_phase是bottom-up phase Q128.$size用于packed array和unpacked array分别得到的什么 Q129.class和struct的异同 Q130.class和module的异同 Q131.对象创建的…