四元数与旋转变换
参考资料:
一.四元数的定义
1.1 四元数的基本概念
四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton)在1843年引入的数学概念,可以看作是一种新的数值类型。四元数与复数的联系比较密切,可以视为是一种复数的拓展(复数是实数的复数,四元数是复数的复数)。四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。所有的四元数
q
q
q 都可以写成如下形式:
q
=
a
+
b
i
+
c
j
+
d
k
,
(
a
,
b
,
c
,
d
∈
R
)
q = a + bi + cj + dk,(a,b,c,d \in R)
q=a+bi+cj+dk,(a,b,c,d∈R)
其中
i
,
j
,
k
i,j,k
i,j,k 为四元数的三个虚数单位,
b
,
c
,
d
b,c,d
b,c,d为四元数的三个虚部,
a
a
a为四元数的实部。与复数类似,四元数其实就是对于基 ${1, 𝑖, 𝑗, 𝑘} $ 的线性组合,所以四元数也可以写成如下向量的形式:
q
=
[
a
b
c
d
]
q = \left[\begin{matrix}a \\b \\c \\d \end{matrix}\right]
q=
abcd
除此之外,我们经常将四元数的实部与虚部分开,并用一个三维的向量来表示虚部,将它表示为标量
s
s
s和向量
v
v
v的有序对形式如下:
q
=
[
s
,
v
]
T
,
(
s
=
a
,
v
=
[
b
,
c
,
d
]
T
且
a
,
b
,
c
,
d
∈
R
)
q = [s,v]^T,(s=a,v=[b,c,d]^T 且 a,b,c,d \in R)
q=[s,v]T,(s=a,v=[b,c,d]T且a,b,c,d∈R)
如果一个四元数的虚部全为0,即
q
=
[
s
,
0
]
T
q = [s,0]^T
q=[s,0]T ,则该四元数被称为实四元数。反之,若一个四元数的实部为0,即
q
=
[
0
,
v
]
T
q = [0,v]^T
q=[0,v]T ,则该四元数被称为虚四元数或纯四元数。我们可以将任意的 3D 向量
v
v
v 转换为纯四元数 [0,
v
v
v] ,也可以将任意实数
s
s
s 转化为实四元数 [
s
s
s,0].
1.2 四元数的基本性质
(1)基本等式关系
{
i
2
=
j
2
=
k
2
=
i
j
k
=
−
1
i
j
=
k
,
j
i
=
−
k
j
k
=
i
,
k
j
=
−
i
k
i
=
j
,
i
k
=
−
j
\left\{ \begin{array}{c} i^2 = j^2 = k^2 = ijk = -1 \\ ij = k,ji = -k \\ jk = i,kj = -i \\ ki = j,ik = -j \end{array} \right.
⎩
⎨
⎧i2=j2=k2=ijk=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
(2)模长(范数)
仿照复数的定义,我们可以将一个四元数
q
=
a
+
b
i
+
c
j
+
d
k
q = a + bi + cj + dk
q=a+bi+cj+dk (
q
=
[
s
,
v
]
T
q = [s,v]^T
q=[s,v]T)的模长(或者说范数(Norm))定义如下:
∣
∣
q
∣
∣
=
a
2
+
b
2
+
c
2
+
d
2
=
s
2
+
∣
∣
v
∣
∣
2
||q|| = \sqrt{a^2 + b^2 + c^2 + d^2} = \sqrt{s^2 + ||v||^2}
∣∣q∣∣=a2+b2+c2+d2=s2+∣∣v∣∣2
特别的,如果
∣
∣
q
∣
∣
=
1
||q|| = 1
∣∣q∣∣=1,则称
q
q
q 为单位四元数。
二.四元数的基本运算
在介绍之前,我们先定义三个用来运算的基本四元数分别为
q
,
q
a
,
q
b
q,q_a,q_b
q,qa,qb ,其中 :
q
=
s
+
x
i
+
y
j
+
z
k
(
向量有序对形式
:
q
=
[
s
,
v
]
,
v
=
x
i
+
y
j
+
z
k
)
q
a
=
s
a
+
x
a
i
+
y
a
j
+
z
a
k
(
q
a
=
[
s
a
,
v
a
]
,
v
a
=
x
a
i
+
y
a
j
+
z
a
k
)
q
b
=
s
b
+
x
b
i
+
y
b
j
+
z
b
k
(
q
b
=
[
s
b
,
v
b
]
,
v
b
=
x
b
i
+
y
b
j
+
z
b
k
)
\begin{aligned} & q = s + xi + yj + zk (向量有序对形式: q = [s,v],v = xi + yj + zk)\\ & q_a = s_a + x_ai + y_aj + z_ak ( q_a = [s_a,v_a],v_a = x_ai + y_aj + z_ak)\\ & q_b = s_b + x_bi + y_bj + z_bk ( q_b = [s_b,v_b],v_b = x_bi + y_bj + z_bk) \end{aligned}
q=s+xi+yj+zk(向量有序对形式:q=[s,v],v=xi+yj+zk)qa=sa+xai+yaj+zak(qa=[sa,va],va=xai+yaj+zak)qb=sb+xbi+ybj+zbk(qb=[sb,vb],vb=xbi+ybj+zbk)
2.1 四元数加减法
与复数类似,四元数的加减法只需要将对应分量相加减就可以了,运算可以表示如下:
q
a
±
q
b
=
(
s
a
±
s
b
)
+
(
x
a
±
x
b
)
i
+
(
y
a
±
y
b
)
j
+
(
z
a
±
z
b
)
k
=
[
s
a
±
s
b
,
v
a
±
v
b
]
\begin{aligned} q_a \pm q_b & = (s_a \pm s_b) + (x_a \pm x_b)i + (y_a \pm y_b)j + (z_a \pm z_b)k \\ & = [s_a \pm s_b,v_a \pm v_b] \end{aligned}
qa±qb=(sa±sb)+(xa±xb)i+(ya±yb)j+(za±zb)k=[sa±sb,va±vb]
2.2 标量乘法
标量乘法又称数乘,指四元数可以与实数r ∈ R 相乘。四元数与标量的乘法是遵守交换律的,也就是说
r
q
=
q
r
rq = qr
rq=qr
r
q
=
r
(
s
+
x
i
+
y
j
+
z
k
)
=
r
s
+
r
x
i
+
r
y
j
+
r
z
k
r
q
=
r
[
s
,
v
]
=
[
r
s
,
r
v
]
\begin{aligned} & rq = r(s + xi + yj + zk) = rs + rxi + ryj + rzk\\ & rq = r[s,v] = [rs,rv] \end{aligned}
rq=r(s+xi+yj+zk)=rs+rxi+ryj+rzkrq=r[s,v]=[rs,rv]
2.3 四元数乘法
(1)乘法过程推导
四元数之间的乘法比较特殊,它们是不遵守交换律的,即
q
a
q
b
≠
q
b
q
a
q_aq_b \neq q_bq_a
qaqb=qbqa 。但经常使用的结合律和分配律在四元数内都是成立的。四元数乘法
q
a
q
b
q_aq_b
qaqb 是把
q
a
q_a
qa的每一项与
q
b
q_b
qb 的每一项相乘,最后再相加,乘积可以表示为(整理合并后):
q
a
q
b
=
(
s
a
+
x
a
i
+
y
a
j
+
z
a
k
)
(
s
b
+
x
b
i
+
y
b
j
+
z
b
k
)
=
s
a
s
b
+
s
a
x
b
i
+
s
a
y
b
j
+
s
a
z
b
k
+
x
a
s
b
i
−
x
a
x
b
+
x
a
y
b
k
−
x
a
z
b
j
+
y
a
s
b
j
−
y
a
x
b
k
−
y
a
y
b
+
y
a
z
b
i
+
z
a
s
b
k
+
z
a
x
b
j
−
z
a
y
b
i
−
z
a
z
b
=
(
s
a
s
b
−
x
a
x
b
−
y
a
y
b
−
z
a
z
b
)
+
(
x
a
s
b
+
s
a
x
b
−
z
a
y
b
+
y
a
z
b
)
i
+
(
y
a
s
b
+
z
a
x
b
+
s
a
y
b
−
x
a
z
b
)
j
+
(
z
a
s
b
−
y
a
x
b
+
x
a
y
b
+
s
a
z
b
)
k
\begin{aligned} q_aq_b & = (s_a + x_ai + y_aj + z_ak)(s_b + x_bi + y_bj + z_bk) \\ & = s_as_b + s_ax_bi + s_ay_bj + s_az_bk \quad + \\ & \quad x_as_bi - x_ax_b + x_ay_bk - x_az_bj \quad + \\ & \quad y_as_bj - y_ax_bk - y_ay_b + y_az_bi \quad +\\ & \quad z_as_bk + z_ax_bj - z_ay_bi - z_az_b \\ & = (s_as_b - x_ax_b - y_ay_b - z_az_b) \quad+ \\ & \quad (x_as_b + s_ax_b - z_ay_b + y_az_b)i \quad + \\ & \quad (y_as_b + z_ax_b + s_ay_b - x_az_b)j \quad + \\ & \quad (z_as_b - y_ax_b + x_ay_b + s_az_b)k \end{aligned}
qaqb=(sa+xai+yaj+zak)(sb+xbi+ybj+zbk)=sasb+saxbi+saybj+sazbk+xasbi−xaxb+xaybk−xazbj+yasbj−yaxbk−yayb+yazbi+zasbk+zaxbj−zaybi−zazb=(sasb−xaxb−yayb−zazb)+(xasb+saxb−zayb+yazb)i+(yasb+zaxb+sayb−xazb)j+(zasb−yaxb+xayb+sazb)k
或者说也可以表示为:
(2)乘法的矩阵形式
可以看到,四元数的相乘结果其实也是一个线性组合,我们同样可以将它写成矩阵的形式(
q
b
q_b
qb左乘
q
a
q_a
qa或
q
a
q_a
qa右乘
q
b
q_b
qb):
q
a
q
b
=
[
s
a
−
x
a
−
y
a
−
z
a
x
a
s
a
−
z
a
y
a
y
a
z
a
s
a
−
x
a
z
a
−
y
a
x
a
s
a
]
[
s
b
x
b
y
b
z
b
]
q_aq_b = {\left[ \begin{matrix} s_a & -x_a & -y_a & -z_a \\ x_a & s_a & -z_a & y_a \\ y_a & z_a & s_a & -x_a \\ z_a & -y_a & x_a & s_a \end{matrix} \right]} {\left[ \begin{matrix} s_b \\ x_b \\ y_b \\ z_b \end{matrix} \right]}
qaqb=
saxayaza−xasaza−ya−ya−zasaxa−zaya−xasa
sbxbybzb
(3)Graßmann 积 (Graßmann Product)
上述乘法的推导结果过于繁杂,于是我们重新进行一下整理与化简。已知 :
- 根据定义: v a = [ x a , y a , z a ] T , v b = [ x b , y b , z b ] T v_a = [x_a,y_a,z_a]^T,v_b = [x_b,y_b,z_b]^T va=[xa,ya,za]T,vb=[xb,yb,zb]T
- 根据向量点乘: v a ⋅ v b = x a x b + y a y b + z a z b v_a \cdot v_b = x_ax_b + y_ay_b + z_az_b va⋅vb=xaxb+yayb+zazb
- 根据向量叉乘: v a × v b = ∣ i j k x a y a z a x b y b z b ∣ = ( y a z b − z a y b ) i − ( x a z b − z a x b ) j + ( x a y b − y a x b ) k v_a \times v_b = \begin{vmatrix}i &j &k \\ x_a &y_a &z_a\\ x_b &y_b &z_b\end{vmatrix} = (y_az_b - z_ay_b)i - (x_az_b - z_ax_b)j + (x_ay_b - y_ax_b)k va×vb= ixaxbjyaybkzazb =(yazb−zayb)i−(xazb−zaxb)j+(xayb−yaxb)k
写成这种形式结果应该就非常清楚了,如果使用标量向量有序对形式来表示,
q
a
q
b
q_aq_b
qaqb 的结果可以用向量点乘和叉乘的形式表示出来,将乘法结果进一步整理化简。则对于任意四元数
q
a
=
[
s
a
,
v
a
]
,
q
b
=
[
s
b
,
v
b
]
q_a = [s_a,v_a],q_b = [s_b,v_b]
qa=[sa,va],qb=[sb,vb],
q
a
q
b
q_aq_b
qaqb的相乘结果可以表示如下,这个结果也被叫做Graßmann 积:
q
a
q
b
=
[
s
a
s
b
−
v
a
⋅
v
b
,
s
a
v
b
+
s
b
v
a
+
v
a
×
v
b
]
=
[
s
a
s
b
−
v
a
T
v
b
,
s
a
v
b
+
s
b
v
a
+
v
a
×
v
b
]
\begin{aligned} q_aq_b & = [s_as_b - v_a \cdot v_b,s_av_b + s_bv_a + v_a \times v_b] \\ & = [s_as_b - v_a^Tv_b,s_av_b + s_bv_a + v_a \times v_b] \end{aligned}
qaqb=[sasb−va⋅vb,savb+sbva+va×vb]=[sasb−vaTvb,savb+sbva+va×vb]
该定理是四元数与旋转变换联系起来的关键桥梁。
2.4 四元数的共轭
对于四元数
q
=
s
+
x
i
+
y
j
+
z
k
=
[
s
,
v
]
q = s + xi + yj + zk = [s,v]
q=s+xi+yj+zk=[s,v] 来说,四元数的共轭是把虚部取成相反数,我们将其表示为
q
∗
q^*
q∗ (
q
q
q star ),即:
q
∗
=
s
−
x
i
−
y
j
−
z
k
=
[
s
,
−
v
]
q^* = s - xi - yj - zk = [s,-v]
q∗=s−xi−yj−zk=[s,−v]
共轭四元数的三个非常有用的性质如下:
- q q ∗ = q ∗ q = [ s 2 + v ⋅ v , 0 ] = [ ∣ ∣ q ∣ ∣ 2 , 0 ] qq^* = q^*q = [s^2 + v \cdot v,0] = [||q||^2,0] qq∗=q∗q=[s2+v⋅v,0]=[∣∣q∣∣2,0] ,其实部正是该四元数模长的平方。证明如下:
q q ∗ = [ s , v ] ⋅ [ s , − v ] = [ s 2 − v ⋅ ( − v ) , s ( − v ) + s v + v × ( − v ) ] = [ s 2 + v ⋅ v , 0 ] = [ ∣ ∣ q ∣ ∣ 2 , 0 ] ( q ∗ q 同 ) \begin{aligned} qq^* & = [s,v] \cdot [s,-v] \\ & = [s^2 - v \cdot (-v),s(-v) + sv + v \times (-v)] \\ & = [s^2 + v \cdot v,0] \\ & = [||q||^2,0] (q^*q 同) \end{aligned} qq∗=[s,v]⋅[s,−v]=[s2−v⋅(−v),s(−v)+sv+v×(−v)]=[s2+v⋅v,0]=[∣∣q∣∣2,0](q∗q同)
- ( q ∗ ) ∗ = q (q^*)^* = q (q∗)∗=q ,四元数共轭的共轭等于本身
- ( q a q b ) ∗ = q b ∗ q a ∗ (q_aq_b)^* = q_b^*q_a^* (qaqb)∗=qb∗qa∗,乘积的共轭等于相反共轭的乘积
2.5 四元数的逆
对于四元数
q
q
q 来说,我们定义
q
−
1
q^{-1}
q−1 为
q
q
q 的逆,并规定:
q
q
−
1
=
q
−
1
q
=
1
(
q
≠
0
)
qq^{-1} = q^{-1}q = 1 (q \neq 0)
qq−1=q−1q=1(q=0)
四元数逆的两个非常有用的性质如下:
- 共轭与四元数逆的关系: q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q^{-1} = \frac{q^*}{||q||^2} q−1=∣∣q∣∣2q∗ (计算四元数的逆),证明如下:
q q − 1 = 1 q ∗ ( q q − 1 ) = q ∗ ( q ∗ q ) q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 ⋅ q − 1 = q ∗ q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 \begin{aligned} & qq^{-1} = 1 \\ & q^*(qq^{-1}) = q^* \\ & (q^*q)q^{-1} = q^* \\ & ||q||^2 \cdot q^{-1} = q^* \\ & q^{-1} = \frac{q^*}{||q||^2} \end{aligned} qq−1=1q∗(qq−1)=q∗(q∗q)q−1=q∗∣∣q∣∣2⋅q−1=q∗q−1=∣∣q∣∣2q∗
- 如果 ∣ ∣ q ∣ ∣ = 1 ||q|| = 1 ∣∣q∣∣=1, 也就是说 q q q 是一个单位四元数 (Unit Quaternion),那么则有: q − 1 = q ∗ 1 2 = q ∗ q^{-1} = \frac{q^*}{1^2} = q^* q−1=12q∗=q∗ 。即其逆和共轭就是同一个量。
三.四元数与旋转的关系
3.1 四元数旋转公式
我们可以使用四元数来表达对一个点/向量的旋转变换。之前所学的旋转矩阵表示使用九个量来描述三个自由度的旋转,具有一定的冗余性;欧拉角和旋转向量表示虽然比较紧凑,但是存在万向锁问题,具有奇异性。而四元数是一种四维的表示方式,它既是紧凑的,也没有奇异性。如果说缺点,四元数不够直观,其运算稍复杂些。
(1)基本旋转
假设有一个空间三维点
v
=
[
x
,
y
,
z
]
v = [x,y,z]
v=[x,y,z] ,其对应的虚四元数形式为
V
=
[
0
,
x
,
y
,
z
]
=
[
0
,
v
]
V = [0,x,y,z] = [0,v]
V=[0,x,y,z]=[0,v]。现有一个由单位四元数
q
q
q 指定的旋转,三维点
v
v
v 经过
q
q
q 的旋转后变为
v
′
v'
v′,我们可以将这个旋转变换过程表示如下:
V
′
=
q
V
q
−
1
=
q
V
q
∗
V' = qVq^{-1} = qVq^*
V′=qVq−1=qVq∗
其中,表示旋转的四元数
q
q
q 一定是个单位四元数;这里的乘法均为四元数乘法,结果
V
′
V'
V′ 也是一个虚四元数(实部为0);最后把结果的虚部取出,即得旋转之后点坐标
v
′
v'
v′。
(2)复合旋转
假设有两个表示沿着不同轴,不同角度旋转的四元数 q 1 , q 2 q_1,q_2 q1,q2,我们先对 v v v 进行 q 1 q_1 q1 的变换,再进行 q 2 q_2 q2 的变换,复合变换的结果是什么呢?我们不妨将这两次变换分步进行。首先,我们对初始 v v v 实施 q 1 q_1 q1 的变换,变换之后的 v ′ = q 1 v q 1 ∗ v' = q_1vq_1^* v′=q1vq1∗
接下来,我们对 v ′ v' v′ 继续进行 q 2 q_2 q2 的变换,得到 v ′ ′ = q 2 ( q 1 v q 1 ∗ ) q 2 ∗ = q 2 q 1 v q 1 ∗ q 2 ∗ v'' = q_2(q_1vq_1^*)q_2^* = q_2q_1vq_1^*q_2^* v′′=q2(q1vq1∗)q2∗=q2q1vq1∗q2∗ ,根据性质 2.4-3 ,原式可以改写为 v ′ ′ = ( q 2 q 1 ) v ( q 2 q 1 ) ∗ = q n e t v q n e t ∗ v'' = (q_2q_1)v(q_2q_1)^* = q_{net}vq_{net}^* v′′=(q2q1)v(q2q1)∗=qnetvqnet∗ ,其中 q n e t = q 2 q 1 q_{net} = q_2q_1 qnet=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 的两个旋转轴进行的两次旋转。它是沿着一个全新的旋转轴进行的一次等价旋转,仅仅只有旋转的结果相同。
3.2 推导证明过程
推导证明过程与旋转向量中罗德里格斯公式的推导过程类似,具体请参考文章开头所列出的参考资料,此处不再赘述。
3.3 四元数与其他旋转表示的转换
3.3.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
q 表示为:
q
=
[
c
o
s
(
1
2
θ
)
,
s
i
n
(
1
2
θ
)
u
]
q = [cos(\frac{1}{2} \theta),sin(\frac{1}{2} \theta)u]
q=[cos(21θ),sin(21θ)u]
即:
{
q
0
=
c
o
s
(
1
2
θ
)
q
1
=
u
x
s
i
n
(
1
2
θ
)
q
2
=
u
y
s
i
n
(
1
2
θ
)
q
3
=
u
z
s
i
n
(
1
2
θ
)
\begin{cases} q_0 = cos(\frac{1}{2} \theta) \\ q_1 = u_xsin(\frac{1}{2} \theta) \\ q_2 = u_ysin(\frac{1}{2} \theta) \\ q_3 = u_zsin(\frac{1}{2} \theta) \\ \end{cases}
⎩
⎨
⎧q0=cos(21θ)q1=uxsin(21θ)q2=uysin(21θ)q3=uzsin(21θ)
换句话说,如果我们有
q
=
[
c
o
s
(
θ
)
,
s
i
n
(
θ
)
u
]
q = [cos(\theta),sin(\theta)u]
q=[cos(θ),sin(θ)u] ,那么
v
′
=
q
v
q
∗
v' = qvq^*
v′=qvq∗ 可以将
v
v
v 沿 着
u
u
u 旋转
2
θ
2\theta
2θ 度。
(2)四元数=>旋转向量
假设有一个单位四元数
q
=
[
a
,
b
]
=
[
a
,
b
0
,
b
1
,
b
2
]
q = [a,\pmb b] = [a,b_0,b_1,b_2]
q=[a,b]=[a,b0,b1,b2],如果我们想要提取它所对应旋转的角度和旋转轴向量,则可直接逆表示如下:
{
θ
=
2
a
r
c
c
o
s
(
a
)
u
=
b
s
i
n
(
1
2
θ
)
=
b
s
i
n
(
a
r
c
c
o
s
(
a
)
)
\begin{cases} \theta = 2arccos(a) \\ \pmb u = \frac{\pmb b}{sin(\frac{1}{2} \theta)} = \frac{\pmb b}{sin(arccos(a))} \end{cases}
{θ=2arccos(a)u=sin(21θ)b=sin(arccos(a))b
3.3.2 旋转矩阵
(1)四元数 => 旋转矩阵
-
转换方法一:四元数 => 旋转向量 => 旋转矩阵(罗德里格斯公式)
已知单位四元数 q = [ q 0 , q 1 , q 2 , q 3 ] q = [q_0,q_1,q_2,q_3] q=[q0,q1,q2,q3], 根据之前推导的旋转向量表示中罗德里格斯公式展开式以及上述旋转向量和四元数转换的关系,将单位旋转向量 u u u及旋转角 θ \theta θ 替换为单位四元数 q q q的形式,省去计算过程,便可以得到单位四元数到旋转矩阵的转换公式:
R = [ 1 − 2 q 2 2 − 2 q 3 2 2 ( q 1 q 2 − q 0 q 3 ) 2 ( q 1 q 3 + q 0 q 2 ) 2 ( q 1 q 2 + q 0 q 3 ) 1 − 2 q 1 2 − 2 q 3 2 2 ( q 2 q 3 − q 0 q 1 ) 2 ( q 1 q 3 − q 0 q 2 ) 2 ( q 2 q 3 + q 0 q 1 ) 1 − 2 q 1 2 − 2 q 2 2 ] R = {\left[ \begin{matrix} 1-2q_2^2-2q_3^2 & 2(q_1q_2-q_0q_3) & 2(q_1q_3+q_0q_2) \\ 2(q_1q_2 + q_0q_3) & 1-2q_1^2-2q_3^2 & 2(q_2q_3-q_0q_1) \\ 2(q_1q_3 - q_0q_2) & 2(q_2q_3+q_0q_1) & 1-2q_1^2-2q_2^2 \end{matrix} \right]} R= 1−2q22−2q322(q1q2+q0q3)2(q1q3−q0q2)2(q1q2−q0q3)1−2q12−2q322(q2q3+q0q1)2(q1q3+q0q2)2(q2q3−q0q1)1−2q12−2q22 -
转换方法二:四元数 => 矩阵形式 => 旋转矩阵
(2)旋转矩阵 => 四元数
假设已知旋转变换矩阵
R
R
R 如下:
R
=
[
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
]
R = {\left[ \begin{matrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{matrix} \right]}
R=
r11r21r31r12r22r32r13r23r33
则根据上述四元数 => 旋转矩阵的转换公式,推导计算对应的单位四元数为:
{
q
0
=
1
2
⋅
1
+
r
11
+
r
22
+
r
33
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
\begin{cases} q_0 = \frac{1}{2} \cdot \sqrt{1+r_{11}+r_{22}+r_{33}} \\ 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{cases}
⎩
⎨
⎧q0=21⋅1+r11+r22+r33q1=4q0r32−r23q2=4q0r13−r31q3=4q0r21−r12
3.4 双倍覆盖
四元数与 3D 旋转的关系并不是一对一的,同一个 3D 旋转可以使用两个不同的四元数来表示.对任意的单位四元数
q
=
[
c
o
s
(
1
2
θ
)
,
s
i
n
(
1
2
θ
)
u
]
q = [cos(\frac{1}{2} \theta),sin(\frac{1}{2} \theta)u]
q=[cos(21θ),sin(21θ)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
)
v
(
−
q
)
∗
=
(
−
1
)
2
q
v
q
∗
=
q
v
q
∗
(-q)v(-q)^* = (-1)^2qvq^* = qvq^*
(−q)v(−q)∗=(−1)2qvq∗=qvq∗
所以,我们经常说单位四元数与 3D 旋转有一个 「2 对 1 满射同态」 (2-1 Surjective Homomorphism) 关系,或者说单位四元数双倍覆盖 (Double Cover) 了 3D 旋转。有一点需要注意的是,虽然 𝑞 与 −𝑞 是两个不同的四元数,但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,它们的旋转矩阵是完全相同的。旋转矩阵并不会出现双倍覆盖的问题。