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,b∈R 且 i 2 = − 1 i^2 = -1 i2=−1,而复数的乘法则表示复平面上的旋转:例如,乘上复数 i i i 相当于逆时针把一个复向量旋转 90 ° 90\degree 90°。类似的,在表达三维空间旋转时,也有一种类似于复数的代数:四元数(Quaternion)。
1.2 四元数的形式
四元数的定义和复数非常相似,唯一的区别在于四元数有三个虚部,而复数只有一个。所有的四元数
q
∈
H
q \in \mathbb{H}
q∈H(
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}
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;
如果把
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=q0∈R,v=[q1,q2,q3]T∈R3(1.2)
在这里,
s
s
s 称为四元数的实部,而
v
v
v 称为四元数的虚部。如果一个四元数的虚部为 0,则称为实四元数;如果一个四元数的实部为 0,则称为虚四元数或纯四元数。
1.3 四元数的重要性
-
避免奇异性
欧拉角的表示方式会导致万向锁的出现,而万向锁只是方向角在实际物理实现上会出现的一个问题,理论上要规避万向锁,选择合适的旋转顺序就行了,但问题是决定顺序也要花费判定成本。
用方向角表示旋转,虽然直观,但没有考虑到歧义,以及计算和存储的需求。所谓歧义,即我们一般是先知道欧拉角再去计算唯一的旋转(旋转向量、旋转矩阵、四元数等能唯一表示三维旋转的方式),但给定一个三维旋转,我们却有至少两种欧拉角表示方式。
-
优化存储和计算
用欧拉角来计算旋转,大致如下:
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
由此,其运算可以表示如下:
-
加减法:
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) -
数乘:
又称为四元数的标量乘法,四元数可以与任意实数 k ∈ R k \in \mathbb{R} k∈R 相乘, 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) -
内积或点积:
假设 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} qa⋅qb=∣∣qa∣∣∣∣qb∣∣cosα=sasb+xaxb+yayb+zazb=sasb+va⋅vb=2qa∗qb+qb∗qa(2.3) -
外积或叉积:
一般意义上,四元数的乘法指的是外积或叉积,它是把 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=sasb−xaxb−yayb−zazb+(saxb+xasb+yazb−zayb)i+(sayb−xazb+yasb+zaxb)j+(sazb+xayb−yaxb+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=[sasb−vaTvb,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,b∈R(2.6) -
共轭:
四元数的共轭是把虚部取成相反数:
q ∗ = s − x i − y j − z k = [ s , − v ] (2.7) q^* = s - xi - yj - zk = [s,-v] \tag{2.7} q∗=s−xi−yj−zk=[s,−v](2.7)
四元数共轭与其本身相乘,会得到一个实四元数,其实部为模长的平方:
q ∗ q = q q ∗ = [ s 2 + v T v , 0 ] T q^*q = qq^* = [s^2 + v^Tv,0]^T q∗q=qq∗=[s2+vTv,0]T
此外,共轭的乘积满足以下性质:
( q a q b ) ∗ = q b ∗ q a ∗ (q_aq_b)^* = q_b^*q_a^* (qaqb)∗=qb∗qa∗ -
模长或范数:
四元数的模长或范数定义为:
∣ ∣ 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∣∣ -
逆:
四元数 q ∈ H 0 q \in \overset{0}{\mathbb{H}} q∈H0 的逆为:
q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 (2.9) q^{-1} = \frac{q^*}{||q||^2} \tag{2.9} q−1=∣∣q∣∣2q∗(2.9)
按此定义,四元数和自己的逆的乘积为实四元数 1:
q q − 1 = q − 1 q = q q ∗ ∣ ∣ q ∣ ∣ 2 = 1 qq^{-1} = q^{-1}q = \frac{qq^*}{||q||^2} = 1 qq−1=q−1q=∣∣q∣∣2qq∗=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=qb−1qa−1
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 v′∈R13 和 θ ∈ [ − π , π ] \theta \in [-\pi , \pi] θ∈[−π,π],使得 q = [ c o s θ , v ′ s i n θ ] q = [cos\theta, v'sin\theta] q=[cosθ,v′sinθ]。
接下来,我们具体介绍四元数的高阶运算:
-
对数运算:
使 q ∈ H 1 q\in \mathbb{H}_1 q∈H1, 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,v∈R3,∣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 不是单位四元数。 -
指数运算:
对于以下形式的四元数: 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,v∈R3,∣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,q∈H1,t∈R,它的指数方程形式:
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(tθ),vsin(tθ)](2.12) -
微分运算:
此处给出常用的微分性质和证明,并将用于四元数插值曲线的推导:
-
当指数为常数时的微分法则:
对于 q t , q ∈ H 1 , t ∈ R q^t,q\in \mathbb{H}_1,t\in \mathbb{R} qt,q∈H1,t∈R,有:
d d t q t = q t l o g ( q ) \frac{d}{dt}q^t = q^t log(q) dtdqt=qtlog(q) -
当指数为函数时的微分法则:
在此之前,给出乘积微分法则和链式微分法则:
乘积微分法则:使 f , g ∈ C 1 ( R , H ) f,g \in C^1(\mathbb{R},\mathbb{H}) f,g∈C1(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}) f∈C1(H,H),g∈C1(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}) q∈C1(R,H1),r∈C1(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′=qwq−1(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}
qq∗q−1p′p′=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]=[22,0,0,22]=[q0,−q1,−q2,−q3]=[22,0,0,−22]=∣∣q∣∣q∗=q∗=[22,0,0,−22]=qpq−1=[22,0,0,22][0,1,1,0][22,0,0,−22]=(22+22k)(i+j)(22−22k)=−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(2∣w∣∣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=2⋅arccos(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=
1−2q22−2q322q1q2+2q0q32q1q3−2q0q22q1q2−2q0q31−2q12−2q322q2q3+2q0q12q1q3+2q0q22q2q3−2q0q11−2q12−2q22
(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=4q0r32−r23=4q0r13−r31=4q0r21−r12(4.4)
4.3 四元数与欧拉角
在不同的旋转顺序下,欧拉角和四元数之间的转换公式是不一样的,下述推导使用的旋转顺序为: Z → Y → X Z\rightarrow Y \rightarrow X Z→Y→X(绕固定坐标系的 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),1−2(q12+q22))arcsin(2(q0q2−q1q3))atan2(2(q0q3+q1q2),1−2(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(q0q2−q1q3)) 的定义域为
[
−
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(q0q2−q1q3)=±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θ))=22cos2θ−φ=22(cos(2φ)sin(2θ)−sin(2φ)cos(2θ))=22sin2θ−φ=22(cos(2φ)cos(2θ)+sin(2φ)sin(2θ))=22cos2θ−φ=22(sin(2φ)cos(2θ)−cos(2φ)sin(2θ))=−22sin2θ−φ
此时我们将四元数带入逆向公式发现:
[
θ
ψ
φ
]
=
[
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),1−2(q12+q22))arcsin(2(q0q2−q1q3))atan2(2(q0q3+q1q2),1−2(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′′=q2v′q2∗=q2q1vq1∗q2∗=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)^*
q1∗q2∗=(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=[−u⋅u,0]=−∣∣u∣∣2=−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θve−uq2θ
有了四元数的指数定义,我们就能够定义四元数的更多运算了。
-
自然对数 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θ] -
单位四元数的幂运算:
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(tθ)=[cos(tθ),sin(tθ)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] q∈H1,p=[a,bv],其中 a , b , r ∈ R , v ∈ R 3 a,b,r \in \mathbb{R},v \in \mathbb{R}^3 a,b,r∈R,v∈R3,如果 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,p∈H1,p=[cosθ,sinθv],t∈R,那么 q p t q ∗ = ( q p q ∗ ) t qp^tq^* = (qpq^*)^t qptq∗=(qpq∗)t。
定理证明:
根据推论:存在
v
′
∈
R
3
v' \in \mathbb{R}^3
v′∈R3,使得
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,tθv])q∗=[costθ,sintθv′]=exp(t[0,θv′])=exp(tlog[cosθ,sinθv′])=exp(tlog(qpq∗))=(qpq∗)t