一、四元数的定义
旋转矩阵用九个量描述三自由度的旋转,具有冗余性;
欧拉角和旋转向量是紧凑的,但具有奇异性。
事实上,我们找不到不带奇异性的三维向量描述方式。三维旋转是一个三维流形,想要无奇异性地表达它,用三个量是不够的。
回忆我们以前学习过的复数。我们用复数集 C : \mathbb{C}: C: 表示复平面上的向量,而复数的乘法则能表示复平面上的旋转: 例如,乘上复数 相当于逆时针把一个复向量旋转 90 度。类似的,在表达三维空间旋转时,也有一种类似于复数的代数:四元数 (Quaternion)。四元数是 Hamilton 找到的一种扩展的复数它既是紧凑的,也没有奇异性。如果说缺点的话四元数不够直观,其运算稍为复杂一些。
个四元数q拥有一个实部和三个虚部。像这样:
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
,
\boldsymbol{q}=q_0+q_1i+q_2j+q_3k,
q=q0+q1i+q2j+q3k,
其中
i
,
j
,
k
i,j,k
i,j,k 为四元数的三个虚部。这三个虚部满足关系式:
{
i
2
=
j
2
=
k
2
=
−
1
i
j
=
k
,
j
i
=
−
k
j
k
=
i
,
k
j
=
−
i
k
i
=
j
,
i
k
=
−
j
\begin{aligned} &\left\{\begin{array}{c}i^2=j^2=k^2=-1\\ ij=k,ji=-k\\ jk=i,kj=-i\\ ki=j, ik=-j\end{array}\right. \end{aligned}
⎩
⎨
⎧i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
由于它的这种特殊表示形式,有时人们也用一个标量和一个向量来表达四元数:
q
=
[
s
,
v
]
,
s
=
q
0
∈
R
,
v
=
[
q
1
,
q
2
,
q
3
]
T
∈
R
3
,
q=[s,\boldsymbol{v}],\quad s=q_0\in\mathbb{R},v=[q_1,q_2,q_3]^T\in\mathbb{R}^3,
q=[s,v],s=q0∈R,v=[q1,q2,q3]T∈R3,
这里,
s
s
s 称为四元数的实部,而
v
\boldsymbol{v}
v称为它的虚部。如果一个四元数虚部为0,称之为实四元数。反之,若它的实部为 0,称之为虚四元数。
我们能用单位四元数表示三维空间中任意一个旋转,不过这种表达方式和复数有着微妙的不同。
这种表达方式和旋转矩阵、旋转向量有什么关系呢?
先看旋转向量。
假设某个旋转是绕单位向量
n
=
[
n
x
,
n
y
,
n
z
]
T
\boldsymbol{n}=\left[n_x,n_y,n_z\right]^T
n=[nx,ny,nz]T进行了角度为
θ
θ
θ的旋转,那么这个旋转的四元数形式为:
q
=
[
cos
θ
2
,
n
x
sin
θ
2
,
n
y
sin
θ
2
,
n
z
sin
θ
2
]
T
.
\boldsymbol{q}=\left[\cos\frac{\theta}{2},n_x\sin\frac{\theta}{2},n_y\sin\frac{\theta}{2},n_z\sin\frac{\theta}{2}\right]^T.
q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]T.
反之,亦可从单位四元数中计算出对应旋转轴与夹角:
{
θ
=
2
arccos
q
0
[
n
x
,
n
y
,
n
z
]
T
=
[
q
1
,
q
2
,
q
3
]
T
/
sin
θ
2
\begin{cases}\theta=2\arccos q_0\\ \left[n_x,n_y,n_z\right]^T=\left[q_1,q_2,q_3\right]^T/\sin\frac\theta2\end{cases}
{θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]T/sin2θ
这式子给我们一种微妙的“转了一半”的感觉。同样,对式
q
=
[
cos
θ
2
,
n
x
sin
θ
2
,
n
y
sin
θ
2
,
n
z
sin
θ
2
]
T
\boldsymbol{q}=\left[\cos\frac{\theta}{2},n_x\sin\frac{\theta}{2},n_y\sin\frac{\theta}{2},n_z\sin\frac{\theta}{2}\right]^T
q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]T的
θ
θ
θ加上
2
π
2\pi
2π,我们得到一个相同的旋转,但此时对应的四元数变成了
−
q
\boldsymbol{-q}
−q。因此,在四元数中,任意的旋转都可以由两个互为相反数的四元数表示。同理,取
θ
θ
θ为0,则得到一个没有任何旋转的实四元数:
q
0
=
[
±
1
,
0
,
0
,
0
]
T
⋅
q_0=[\pm1,0,0,0]^T\cdot
q0=[±1,0,0,0]T⋅
二、四元数的运算
四元数和通常复数一样,可以进行一系列的运算。常见的有四则运算、数乘、求逆、共钜等等。
现有两个四元数
q
a
q_a
qa,
q
b
q_b
qb,它们的向量表示为
[
s
a
,
v
a
]
[s_a,v_a]
[sa,va],
[
s
b
,
v
b
]
[s_b,v_b]
[sb,vb],或者原始四元数表示为:
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
.
\boldsymbol{q}_a=s_a+x_ai+y_aj+z_ak,\quad\boldsymbol{q}_b=s_b+x_bi+y_bj+z_bk.
qa=sa+xai+yaj+zak,qb=sb+xbi+ybj+zbk.
那么,运算如下:
2.1 加减法
q a ± q b = [ s a ± s b , v a ± v b ] . \boldsymbol{q}_a\pm\boldsymbol{q}_b=[s_a\pm s_b,\boldsymbol{v}_a\pm\boldsymbol{v}_b]. qa±qb=[sa±sb,va±vb].
2.2 乘法
乘法是把
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
b
b
)
j
+
(
s
a
z
b
+
x
a
y
b
−
x
b
y
a
+
z
a
s
b
)
k
.
\begin{aligned} \boldsymbol{q_{a}\boldsymbol{q_{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_ab_b)j \\ &+\left(s_az_b+x_ay_b-x_by_a+z_as_b\right)k. \end{aligned}
qaqb=sasb−xaxb−yayb−zazb+(saxb+xasb+yazb−zayb)i+(sayb−xazb+yasb+zabb)j+(sazb+xayb−xbya+zasb)k.
简洁表达:
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
]
.
\boldsymbol{q}_a\boldsymbol{q}_b=\begin{bmatrix}s_a s_b-\boldsymbol{v}_a^T\boldsymbol{v}_b,s_a\boldsymbol{v}_b+s_b\boldsymbol{v}_a+\boldsymbol{v}_a\times\boldsymbol{v}_b\end{bmatrix}.
qaqb=[sasb−vaTvb,savb+sbva+va×vb].