本系列参考自 Quaternions for Computer Graphics, 四元数与三维旋转 和 视觉SLAM十四讲(第二版)
复数的旋转
首先来研究一下复数是怎么旋转的.
首先把复数乘法写成矩阵形式:
\[ z_{1}z_{2}=\begin{bmatrix} a &-b\\ b & a \end{bmatrix}\begin{bmatrix} c\\ d \end{bmatrix} \]
如果 \(z_{1}\) 的模长为 \(k\), 我们可以把上式改写:
\[ z_{1}z_{2}=k\begin{bmatrix} \cos{\theta} &-\sin{\theta}\\ \sin{\theta} & \cos{\theta} \end{bmatrix}\begin{bmatrix} c\\ d \end{bmatrix} \]
熟悉的东西是不是出现了! 没错, 旋转矩阵! 实际上, 复数乘法不但实现了旋转操作(逆时针旋转 \(\arctan{\frac{a}{b}}\)), 还实现了缩放操作(即前面的系数 \(k\)).
极坐标形式
欧拉公式: \(e^{i\theta}=\cos{\theta}+i\sin{\theta}\)
所以我们可以得到复数的极坐标形式: \(z_{1}=ke^{i\theta}\)
由此就得到了一个简单的旋转公式: \(z^{'}=e^{i\theta}z\)
旋转的复合操作也很容易得到: \(z^{''}=e^{i\theta_{2}}e^{i\theta_{1}}z=e^{i(\theta_{1}+\theta_{2})}z\)
四元数与旋转
纯四元数
我们把实部为 \(0\) 的四元数称为纯四元数, 将它的三个虚部分别看作 \(x,y,z\) 轴坐标, 就可以用它表示空间中的点了.
下面介绍纯四元数的一个重要性质:
\[ v=\begin{bmatrix}0, \boldsymbol{v}\end{bmatrix}^{T}, \qquad u=\begin{bmatrix}0, \boldsymbol{u}\end{bmatrix}^{T}\\ vu=\begin{bmatrix}0-\boldsymbol{v}\cdot\boldsymbol{u}, 0+\boldsymbol{v}\times\boldsymbol{u}\end{bmatrix}^{T} =\begin{bmatrix}-\boldsymbol{v}\cdot\boldsymbol{u}, \boldsymbol{v}\times\boldsymbol{u}\end{bmatrix}^{T} \]
旋转
参考Rodrigues' rotation formula的推导过程, 我们可以拆分 \(\boldsymbol{v}\) 得到 \(\boldsymbol{v_{1}}\perp\boldsymbol{k}\) 以及 \(\boldsymbol{v_{2}}\parallel\boldsymbol{k}\) (对应的纯四元数用非粗体形式表示).
\(v_{1}\) 的旋转
\[ \boldsymbol{v_{1}^{'}} = \cos{\alpha}\cdot\boldsymbol{v_{1}} + \sin{\alpha}\cdot(\boldsymbol{k} \times \boldsymbol{v_{1}}) \]
接下来将其推广到四元数形式, 除了叉乘以外都能简单地直接替换.
对于叉乘, 考虑将其转换为四元数乘法, 利用 \(\boldsymbol{v_{1}}\perp\boldsymbol{k}\) 和纯四元数的性质可以得到:
\[ \begin{align*} kv_{1} &=\begin{bmatrix} -\boldsymbol{k}\cdot\boldsymbol{v_{1}}, \boldsymbol{k} \times \boldsymbol{v_{1}} \end{bmatrix} \\ &=\begin{bmatrix} 0, \boldsymbol{k} \times \boldsymbol{v_{1}} \end{bmatrix} \end{align*} \]
所以用四元数形式表示 \(v_{1}\) 的旋转就是:
\[ \begin{align*} v_{1}^{'} &=\cos{\alpha}\cdot v_{1} + \sin{\alpha}\cdot kv_{1} \\ &=\left(\cos{\alpha}+ \sin{\alpha}\cdot k\right)\cdot v_{1} \\ &= qv_{1} \end{align*} \]
构造一个四元数 \(q=\begin{bmatrix}\cos{\alpha}, &\sin{\alpha}\cdot \boldsymbol{k}\end{bmatrix}\) 就可以完成这个旋转.
还可以得到一个小性质: 因为 \(\boldsymbol{k}\) 是单位向量, 所以 \(q\) 的模长为 \(1\).
\(v_{2}\) 的旋转
由于 \(v_{2}\) 平行于旋转轴, 由此直接保留即可. 即:
\[ v_{2}^{'}=v_{2} \]
合并
显然:
\[ \begin{align*} v^{'} &=v_{1}^{'}+v_{2}^{'} \\ &= qv_{1}+v_{2} \end{align*} \]
令 \(p=\begin{bmatrix}\cos{\frac{\alpha}{2}}, &\sin{\frac{\alpha}{2}}\cdot \boldsymbol{k}\end{bmatrix}\), 则有(涉及到的一些引理可以参考 四元数与三维旋转 ):
\[ \begin{align*} v^{'} &= qv_{1}+v_{2} \\ &= ppv_{1}+pp^{-1}v_{2} \\ &= ppv_{1}+pp^{*}v_{2} \\ &= pv_{1}p^{*}+pv_{2}p^{*} \\ &= p(v_{1}+v_{2})p^{*} \\ &= pvp^{*} = pvp^{-1} \end{align*} \]