钾肥喵的窝

我在 CODING 部署的 Hexo 博客

0%

四元数系列——2.四元数与旋转

本系列参考自 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*} \]