四元数

摘要

在学习三维空间中的刚体运动时,我们提到四元数在描述旋转时只有四个自由度而且也没有奇异性。
这篇博客将简单记录四元数的相关内容

四元数

旋转矩阵具有冗余性,欧拉角和旋转向量不冗余但是具有奇异性。
接下来出场的四元数就厉害了,只有四个自由度而且也没有奇异性。它是一种类似于复数的表达方式。
四元数内容较多,另外再单独记录。
四元数$q$拥有一个实部和三个虚部。如下:
$q=q_0+q_1 i+q_2 j + q_3k$
其中:
$
\left\{
\begin{align}
&i^2=j^2=k^2=-1 \\
&ij=k,ji=-k \\
&jk=i,kj=-i \\
&ki=j,ik=-j
\end{align}
\right.
$

假设某个旋转绕单位向量$n=[n_x, n_y, n_z]^T$进行了角度$\theta$的旋转,那么对应的四元数为:
$
q = [\cos{\dfrac{\theta}{2}}, n_x\sin \dfrac{\theta}{2}, n_y \sin \dfrac{\theta}{2}, n_z \sin \dfrac{\theta}{2}]
$

反之也可以从单位四元数中计算出对应旋转轴和夹角:
$
\left\{
\begin{align}
&\theta = 2\arccos q_0 \\
&[n_x, n_y, n_z]^T=[q_1, q_2, q_3]^T / \sin{\dfrac{\theta}{2}} \\
\end{align}
\right.
$

对$\theta$加上$2\pi$可以得到一个相同的旋转,但此时对应的四元数变成了$-q$。因此任意的旋转都可以由两个互为相反数的四元数表示。

四元数的运算

假设有两个四元数$q_a$和$q_b$。如下:

$
q_a=[s_a,v_a]=[s_a+x_ai+y_aj+z_ak] \\
q_b=[s_b,v_b]=[s_b+x_bi+y_bj+z_bk]
$

1.加法和减法
$q_a \pm q_b = [s_a \pm s_b, v_a \pm v_b]$

2.乘法
乘法是把$q_a$的每一项与$q_b$每项相乘,最后相加。
$q_aq_b = [s_a s_b - v_a^Tv_b, s_av_b+s_bv_a + v_a \times v_b]$

3.共轭
四元数的共轭是把虚部去成相反数:
$q_a^* = [s_a, -v_a]$

四元数共轭与自己本身相乘,会得到一个实四元数,其实部为模长的平方:
$q^*q = [s_a^2 + v^Tv, 0]$

4.模长
$\parallel q_a \parallel = \sqrt{s_a^2+x_a^2+y_a^2+z_a^2}$

可以验证两个四元数乘积的模即为模的乘积。这保证单位四元数相乘后仍然是单位四元数。
$ \parallel q_a q_b \parallel = \parallel q_a \parallel \parallel q_b \parallel $

5.逆
$q^{-1}=q^* / \parallel q \parallel ^2$

6.数乘与点乘
$kq = [ks, kv]$

点乘是指两个四元数每个位置上的数值分别相乘:
$q_a q_b = s_as_b + x_ax_bi + y_ay_bj + z_a z_b k$

四元数的旋转表示

假设空间中有一点$p=[x,y,z]$,其绕旋转轴$n$,进行了角度为$\theta$的旋转得到了点$p’$,对应的四元数为q。

则可以验证:
$p’ = qpq^{-1}$

参考文献

  1. 《视觉SLAM十四讲》第三讲