AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
87 stars 11 forks source link

从复数(二元数)到四元数 #163

Open AlexiaChen opened 2 years ago

AlexiaChen commented 2 years ago

前言

最近在学ROS,个人写了一波学习笔记,学到TF变换那里的时候,需要用到欧拉角和四元数这些知识,欧拉角的roll, pitch, yaw倒是很好理解,更接近人的理解(欧拉角是说人话),同时也理解欧拉角造成的万向锁问题,但是我看example上的3D角度旋转都是把欧拉角转换成四元数,再通过四元数来旋转。因为四元数没有欧拉角的万向锁问题,可以做全姿态变换。我会尽可能参考很多资料,用历史的脉络来尝试讲解是四元数是怎么联系到3D旋转的,因为它不好直观形象的理解,目前从代数形式上反而容易。

正文

复数(二元数)与2D的关系

大家查过资料的都知道四元数(quatiernion),是复数(Complex Number)的推广(扩展)。所以我们先要从复数入手,以及推导它与二维平面旋转之间的关系。

先来回顾一下复数的定义把,任意一个复数 $z \in \mathbb{C}$,都可以表示为$z = a + bi$的形式,其中$a, b \in \mathbb{R}$ 两个都是实数,a是实部,b是虚部。当你仔细观察这个公式定义,你会发现,它是一个线性的,如果学过线性代数的都知道,这样的线性组合形式可以引出向量空间和基(Basis)的概念,所以从这个公式出发,你可以认为其实任意的复数z都可以是$(1, i)$这个基的线性组合来表示,$1和i$就是这个复数空间的基向量,基向量的线性组合张成(span)了整个线性空间,当然,这个空间是一个二维的复平面。为了简化二维复平面的概念,我们可以只用实部和虚部的标量来化简,所以我们也可以用一个二维向量来表示复数:

$$ z = \begin{bmatrix} a \ b \ \end{bmatrix} \quad $$

接下来我们看复数的加减法,加减法就是实部与实部加减,虚部与虚部加减了。这里我们并不太关注,只是回顾基本知识。我们需要关注的是复数的乘法。

考虑两个复数 $z_1 = a+bi ,z_2 = c + di $ ,根据$i^2 = -1$的性质,利用乘法分配律,我们$$(a+bi)(c + di) $$最后可以得到$ac - bd + (bc + ad)i $, 好了这时候你发现了,得到了一个新的复数,这个复数的虚部是$(bc + ad)$ 。 并且实部是$(ac - bd) $。

好了,这下子有趣的来了,因为结果是个新复数,我们这个新的复数写成向量的形式:

$$ z_1z_2 = z_1 \begin{bmatrix} c \ d \ \end{bmatrix} \ = (ac - bd) + (bc + ad)i \ = \begin{bmatrix} ac - bd \ bc + ad \ \end{bmatrix} \ \ = \begin{bmatrix} a & -b \ b & a \ \end{bmatrix} \begin{bmatrix} c \ d \ \end{bmatrix} \ = \begin{bmatrix} a & -b \ b & a \ \end{bmatrix} \begin{bmatrix} c & -d \ d & c \ \end{bmatrix} \ = \ \begin{bmatrix} ac - bd & -(bc+ad) \ bc + ad & ac - bd \ \end{bmatrix} \ $$

如果有点线性代数基础的同学就可以从以上推导看到,当两个复数相乘,其实是把第二个乘法因子的$z_2$变换成了一个新的复数,从线性代数的角度来看,就是一个二维向量,经过乘法,变换到了一个新的二维向量,二维向量的变换无非就是通过线性变换,这里的线性变换就是一个2*2的的矩阵 ,说人话就是二维向量在二维空间的的旋转。这里的矩阵是复数$z_1$。

所以,复数的乘法可以理解为一个矩阵与向量相乘,也就是向量的变换。你也可以说,复数的相乘与这个矩阵所代表的二维变换是等价的,

其实到这里,聪明的人就已经发现了,$i^2 = -1$为什么是这个结果了,我们来推导一下,设两个复数都为i,它们相乘那么可以写成:

$$ z_1z_2= i^2 = ii = \begin{bmatrix} 0 & -1 \ 1 & 0\ \end{bmatrix} \begin{bmatrix} 0 \ 1 \ \end{bmatrix} \ = \begin{bmatrix} 0 & -1 \ 1 & 0\ \end{bmatrix} \begin{bmatrix} 0 & -1 \ 1 & 0\ \end{bmatrix} \ = \begin{bmatrix} -1 & 0 \ 0 & -1 \ \end{bmatrix} = -I $$

其中i就是:

$$ i = \begin{bmatrix} 0 & -1 \ 1 & 0\ \end{bmatrix} $$

I是单位矩阵:

$$ I = \begin{bmatrix} 1 & 0 \ 0 & 1 \ \end{bmatrix} $$

所以本质上复数$z = a+bi$也可以写成这样实部与虚部配合的矩阵形式:

$$ z = \begin{bmatrix} a & -b \ b & a \ \end{bmatrix} = a \begin{bmatrix} 1 & 0 \ 0 & 1 \ \end{bmatrix} \ + b \begin{bmatrix} 0 & -1 \ 1 & 0 \ \end{bmatrix} \ = \ \begin{bmatrix} a & 0 \ 0 & a \ \end{bmatrix} \ + \begin{bmatrix} 0 & -b \ b & 0 \ \end{bmatrix} \ = a + bi $$

好了,到目前为止,你就可以看到复数,甚至虚数都与线性代数的矩阵有莫大关系,既然涉及到2D矩阵,那么又可以以几何的方式来理解复数和虚数了。当然你看到虚数$i$的矩阵形式后,用一个向量(1, 0) 去乘以这个虚数$i$看看会有什么变化:

$$ \begin{bmatrix} 0 & -1 \ 1 & 0 \ \end{bmatrix} \begin{bmatrix} 1 \ 0 \ \end{bmatrix} \ = \begin{bmatrix} 0 \ 1 \ \end{bmatrix} \ + \begin{bmatrix} 0 \ 0 \ \end{bmatrix} \ = \begin{bmatrix} 0 \ 1 \ \end{bmatrix} $$

从以上公式上来看,如果把输入向量和输出向量在二维复平面画出来的话,你会发现,输入向量(1, 0)在二维复平面上被逆时针旋转了90°。

image

从这里你豁然开朗,难怪以前看到的复数和虚数相关的领域很多都用角度来表示(三角函数),包括量子力学,相对论,信号处理,傅里叶变换等方向。

当然,这里我们只关注复数的乘法的几何意义,不做太多太多的扩展,复数相乘得到一个新的复数,实际上就是复平面上二维向量的旋转,一个复数a 乘以 复数b,那么复数a对应的向量就旋转了复数b所对应的角度。

举个例子, 对于 $(3+4i)(1+i)=(-1 + 7i)$

image

image

image

从上图就可以看到向量(3,4) 旋转了45°,得到的目标向量是(-1, 7)。但你仔细一看!这个向量(-1,7)经过复数相乘运算后比原向量(3,4) 的长度更长了,好了,你又发现了一个重要的点,就是,复数相乘就是表示2D旋转,还附加了缩放功能,也就是说复数的乘法是旋转与缩放的复合。

下面我们来详细推导下这个关系,把旋转矩阵和缩放矩阵分别推导出来。

在推导之前,我们需要回顾下复数的模长和共轭复数的关系:

$$ |z| = \sqrt{a^2 + b^2}
\quad \ z\bar z = (a+bi)(a-bi) = a^2 + b^2 = |z|^2
\quad \ |z| = \sqrt{z\bar z} $$

既然与复数相乘(乘以一个复数)意味着乘以复数对应的矩阵

$$ \begin{bmatrix} a & -b \ b & a \ \end{bmatrix} $$

,那么这个矩阵变换代表什么呢?我们提取一下公因子:

$$ \begin{bmatrix} a & -b \ b & a \ \end{bmatrix} \ = \sqrt{a^2 + b^2} \begin{bmatrix} \frac{a}{\sqrt{a^2 + b^2}} & \frac{-b}{\sqrt{a^2 + b^2}} \ \frac{b}{\sqrt{a^2 + b^2}} & \frac{a}{\sqrt{a^2 + b^2}} \ \end{bmatrix} $$

image

看到上图你就知道大概了,可以写出对应的三角函数,$\frac{a}{\sqrt{a^2+b^2}} = cos(\theta)$ $\frac{b}{\sqrt{a^2+b^2}} = sin(\theta)$。

这样就可以变成:

$$ \sqrt{a^2 + b^2} \begin{bmatrix} \frac{a}{\sqrt{a^2 + b^2}} & \frac{-b}{\sqrt{a^2 + b^2}} \ \frac{b}{\sqrt{a^2 + b^2}} & \frac{a}{\sqrt{a^2 + b^2}} \ \end{bmatrix} \ = |z| \begin{bmatrix} cos(\theta) & -sin(\theta) \ sin(\theta) & cos(\theta) \ \end{bmatrix} \ = \begin{bmatrix} |z| & 0 \ 0 & |z| \ \end{bmatrix} \begin{bmatrix} cos(\theta) & -sin(\theta) \ sin(\theta) & cos(\theta) \ \end{bmatrix} $$

从上面就可以看到左边的对角矩阵就是缩放矩阵,右边的矩阵就是2D旋转矩阵。

从矩阵的乘法上来看,就是先做了旋转,再做了缩放。

如果复数的模 $|z| = 1$, 那么这个复数所代表的变换就只剩下旋转矩阵了。所以在2D中,我们想让一个向量v,进行旋转,就需要乘以一个2D旋转矩阵,2D旋转矩阵的复数形式是: $cos(\theta) + sin(\theta)i$。

当然因为矩阵和复数形式都是等价的,所以让一个向量v旋转,也可以直接乘以它的复数形式 $cos(\theta) + sin(\theta)i$。这里的向量v也可以看做一个复数,之前提到过的。

还有一个复数的极坐标形式,需要根据欧拉公式:

$$ cos(\theta) + sin(\theta)i = e^{i\theta} $$

所以复数也可以表示成极坐标形式,这个极坐标形式的复数形式是: $z = |z|e^{i\theta}$。|z|就是缩放因子,相当于我们可以通缩放因子和旋转角度来定义任意一个复数了。

可以看到,复数可以转换到矩阵,矩阵可以转换到复数。甚至是极坐标表示。后面我们也会在四元数上看到类似的公式推导,因为毕竟四元数是复数的推广。

  1. 2D旋转公式,矩阵型:

$$ v' = \begin{bmatrix} cos(\theta) & -sin(\theta) \ sin(\theta) & cos(\theta) \ \end{bmatrix} v $$

  1. 2D旋转公式,复数乘法型:

$$ v' = zv = (cos(\theta) + sin(\theta)i)v $$

  1. 2D旋转公式,极坐标型:

$$ v' = e^{i\theta}v $$

记住,复数的乘法符合交换律,别把矩阵不符合交换律这个搞混了。

到此为止,有些人可能就会问了,虚数i和复数,然后复数又对应到2D上的旋转,是怎么联系到一起的啊?其实我个人认为最开始的时候也没人知道,就像我们无需关心虚数i是不是真实存在的,它只是为了解决数学这样形而上学的自洽性(自圆其说)而引入的一个因子(工具)而已。刚好复数的乘法的推导结果就可以解决2D旋转的问题,这是自然而然被带出来的。这样四元数这个复数的复数,自然也被复数推广出来了,自然也可以表示更高维度的旋转。说白了虚数和复数还是数学工具,一个坐标和你可以用虚数表示也可以用实数,都可以,计算怎么方便怎么来。

复数一个很有意思的地方,就是整个复数的集合,满足域的条件。跟实数域一样。有域的概念就好办了,直接在上面可以做四则运算,所以专业一点叫复数域。

复数矩阵中的a, b如果是复数,那么这个矩阵就代表一个四元数,同时也可以说,a和b是复数,那么复数的复数就是四元数。这样四元数与三维空间的旋转你就可以有一定直觉了。接下来步入四元数的话题。

四元数与3D的关系

在开始之前,我们需要了解与欧拉角不一样的另一个旋转表达方式,那就是轴角(Axis-angle)方式。它也没有欧拉角万向锁(Gimbal Lock)的问题,而且欧拉角还依赖三个坐标轴的选定,使用四元数都是为了解决这些问题的。

假设我们有一个经过原点的旋转轴$u = (x, y, z)^T$, 我们定义一个旋转,一个向量$v$,沿着这个旋转轴旋转$\theta$度,变换到了$v'$:

image

这里是右手定则,大拇指朝着u的方向,旋转方向是其他四只手指的逆时针方向。

所以可以看到,在轴角法的表示中,一个旋转的定义需要使用四个参数:旋转轴u的x,y,z坐标,以及一个旋转角$\theta$。参数明显多于欧拉角的roll, pitch, yaw。 实际上任何三维中的旋转只需要三个自由度就可以了,为什么这里需要多出一个自由度(参数)?

这里的u其实也是一个三维向量,既然是向量那么就有大小和方向,这里我们不关心向量的大小,也是就$|u| = \sqrt{x^2 + y^2 + z^2}$。只关心方向。以后我们都把|u|规定是1,这样可以带来方便。实际中,如果一个旋转轴向量是非单位向量,那么我们需要把它转化为一个单位向量 $\hat{u} = \frac{u}{|u|}$。

我们在考虑旋转之前,先把向量v在轴角系统上分解一下,分解为两个向量,一个向量$v{\parallel}$,一个向量$v{\perp}$,它两一个平行于向量u,一个垂直于向量u:

image

其中,$v_{\parallel}$ 其实就是v在u上的正交投影,根据正交投影公式,我们可以推导出如下关系,其中 |u| = 1:

$$ v = v{\parallel} + v{\perp} $$

$$ v_{\parallel} = proj_u(v) = \frac{u \cdot v}{u \cdot u}u = \frac{u \cdot v}{|u|^2}u = (u \cdot v)u $$

$$ v_{\perp} = v - (u \cdot v)u $$

你从上图和公式就可以看出来,实际上向量v再3D中的旋转,$v{\parallel}$ 根本不旋转,因为它与旋转轴u重合,所以我们只需要关注$v{\perp}$,因为旋转不改变长度,又与旋转轴正交,所以可以看作在一个平面上旋转:

image

从上图可以看到,旋转后的$v_{\perp}'$是:

$$ v{\perp}' = cos(\theta)v{\perp} + sin(\theta)(u \times v_{\perp}) $$

所以我们最终可以推导向量$v$到向量$v'$在轴角下的3D变换公式了:

$$ v' = v{\parallel}' + v{\perp}'
$$

$$ \ =
v{\parallel} + cos(\theta)v{\perp} + sin(\theta)(u \times v_{\perp}) $$

$$ \ =
(u \cdot v)u + cos(\theta)(v - (u \cdot v)u) + sin(\theta)(u \times v) $$

$$ \ = cos(\theta)v + (1- cos(\theta))(u \cdot v)u + sin(\theta)(u \times v) $$

好了,我们接下来要进入我们的终极目标,四元数了。四元数与之前所铺垫的公式推导有很大相似之处。

首先定义四元数有三个虚部,也就是三个虚数,一个实部。四元数 $ q \in \mathbb{H} $, 为什么是H,因为四元数的发现者是哈密顿,表示形式为下:

$$ q = a + bi + cj + dk, (a,b,c,d \in \mathbb{R}) $$

其中

$$ i^2 = j^2 = k^2 = ijk = -1 $$

所以跟复数一样,四元数q也可以写成向量的形式,它的基是(1, i, j, k), 任何一个四元数都是其基向量的线性组合:

$$ q = \begin{bmatrix} a \ b \ c \ d \ \end{bmatrix} $$

有些时候也用有序对的方式表示,把虚部通过三维向量表示, 实部是标量:

$$ q = [s, v] \ 其中 \quad v = \begin{bmatrix} x \ y \ z \ \end{bmatrix} s, x, y, z \in \mathbb{R} $$

四元数的模长(范数)跟二元数类似,就是 $q = \sqrt{a^2+b^2 + c^2 + d^2} = \sqrt{s^2 + v \cdot v} = \sqrt{s^2+ |v|^2}$。二元数是二维,四元数是四维,多了一维,三元数不符合一些抽象的规则,一般不存在三元数这东西。

四元数的加减也是加减标量就行了,四元数的标量乘法就是:$sq = s(a+bi+cj+dk) = sa + sbi + scj + sdk = qs$,四元数的标量乘法,遵循交换律。

四元数跟二元数不一样,它不满足交换律,左乘和右乘是不一样的,跟矩阵差不多。

跟复数一样,我们需要重点关注四元数的乘法。

设两个四元数$q_1 和 q_2$的乘法,$q_1 = a+bi+cj+dk, q_2 = e+fi+gj+dk$:

$$ q_1 q_2 $$

$$ \ = (ae - bf - cg -dh) + \ (be + af - dg +ch)i + \ (ce + df + ag - bh)j + \ (de -cf + bg + ah)k $$

$$ \ = \begin{bmatrix} a & -b & -c & -d\ b & a & -d & c \ c & d & a & -b\ d &-c & b & a\ \end{bmatrix} \begin{bmatrix} e \ f \ g \ h \ \end{bmatrix} $$

所以本质上两个四元数的乘法,从上面的矩阵你可以看到,是一个4*4的矩阵,相当于就是4维到4维线性空间的映射。哎呀,好像与复数的不一样,应该是一个3阶方阵才对啊,四维的四元数怎么做三维空间的旋转呢?这个暂时不要管,先往下看。

因为四元数的乘法不满足交换律,所以$q_2q_1$的结果是

$$ q_2 q_1 \ = \begin{bmatrix} a & -b & -c & -d\ b & a & d & -c \ c & -d & a & b\ d & c & -b & a\ \end{bmatrix} \begin{bmatrix} e \ f \ g \ h \ \end{bmatrix} $$

如果你仔细观察这个4*4矩阵(特别是第一个矩阵,左乘q1的矩阵),把矩阵分成4个 2*2的小方阵你会发现,其实它就是复数的矩阵形式:

image

它就是复数$z = a + bi$的矩阵形式,只是复数形式里面的$a b$被替换成复数了:

$$ z = \begin{bmatrix} a & -b\ b & a \ \end{bmatrix} $$

只是这里的a和b就是:

$$ a = \begin{bmatrix} a & -b\ b & a \ \end{bmatrix} $$

$$ b = \begin{bmatrix} c & d\ d & -c \ \end{bmatrix} $$

但是仔细一看,b这个小矩阵好像写不出来复数的形式。

再观察第二个大矩阵的分解:

image

这个大矩阵就写不出来复数的矩阵形式,只有里面的4个小矩阵,是复数形式的矩阵。

这两个大矩阵的性质好像反过来一样。我在这里很不理解,我感觉是小矩阵也应该是复数形式,大矩阵也符合复数形式。这里有一个疑点,欢迎大神帮忙解答?

不过我查了wiki,四元数的44的实数矩阵表示法不唯一,难道这这个? 四元数也有2\2复数矩阵的表示:

image

$$ q = \begin{bmatrix} a + bi & c + di\ -c + di & a - bi \ \end{bmatrix} $$

上式矩阵,本质上就是Quaternions as pairs of complex numbers上的应用,所谓的卡莱尔-迪克森构造法构造四元数。所谓的虚数$k$,就是$ij$的积。

image

四元数的4*4实数矩阵表示:

image

好了,知道了这些性质结果,我们还要总结出更多的规律,接下来我们看Grabmann积:

$$ 对于任意四元数, q_1 = [s, \vec{v}], q_2 = [t, \vec{u}], q_1 q_2的结果是: \ q_1 q_2 = [st - v \cdot u, su+tv + v \times u] $$

所以对于实部为0的纯四元数,那么他们的结果是:

$$ q_1 q_2 = [-v \cdot u, v \times u] $$

因为四元数不满足交换律,我们规定$q^{-1}$是$q$的逆,这个两个逆是不同的,$qq^{-1}=q^{-1}q = 1 (q \ne 0)$。

定义四元数的共轭:

$$ q = a + bi + cj + dk = [s, \vec{v}] $$

$$ q^\star = a - bi -cj - dk = [s, -\vec{v}] $$

$$ qq^\star = |q|^2 = q^\star q $$

$$ q^{-1} = \frac{q^\star}{|q|^2} $$

如果q是一个单位四元数,也就是|q| = 1, 那么:

$$ q^{-1} = \frac{q^\star}{|q|^2} = q^\star $$

到此为止,我们可以通过代数的方式来了解四元数是怎样对3D旋转产生作用了。

再用轴角的系统方式,我们来继续研究,只是把轴角的向量换成纯四元数:

$$ v = [0, \vec{v}] $$

$$ v{\perp} = [0, \vec{v{\perp}}] $$

$$ v{\parallel} = [0, \vec{v{\parallel}}] $$

$$ u = [0, \vec{u}] $$

$$ v' = [0, \vec{v'}] $$

$$ v{\perp}' = [0, \vec{v{\perp}'}] $$

$$ v{\parallel}' = [0, \vec{v{\parallel}'}] $$

现在我们知道$v' = v{\parallel}' + v{\perp}'$

对于$v_{\perp}$的旋转:

$$ 当v{\perp}正交于旋转轴u时, 旋转\theta角度后的v{\perp}'可以使用四元数乘法来获得。\ 令v{\perp} = [0, \vec{v{\perp}}'], q = [cos(\theta), sin(\theta)u], 那么 \ v{\perp}' = qv{\perp} $$

对于$v_{\parallel}$的旋转:

$$ v{\parallel}' = v{\parallel} $$

为了避免繁复的四元数推导,我最后直接给出3D旋转的四元数公式吧。

对于任意向量$v$,沿着以单位向量定义的旋转轴$u$旋转$\theta$之后的$v'$可以使用四元数乘法来得到。令 $v = [0, \vec{v}], q = [cos(\frac{1}{2}\theta), sin(\frac{1}{2}\theta)u]$, 那么:

$$ v' = qvq^\star = qvq^{-1} $$

所以你可以看到,把用四元数做向量的旋转,其实是把三维向量的当作一个纯四元数,也就是虚部的标量才是向量的值(坐标)。

之前说过,四元数还可以与3D旋转矩阵互相转换,所以我们接下来还要了解四元数的3D矩阵的一些性质。

下面直接罗列左乘和右乘一个四元数$q = a +bi + cj + dk$的矩阵

$$ Left(q) = \begin{bmatrix} a & -b & -c & -d \ b & a & -d & c \ c & d & a & -b \ d & -c & b & a \end{bmatrix} $$

$$ Right(q) = \begin{bmatrix} a & -b & -c & -d \ b & a & d & -c \ c & -d & a & b \ d & c & -b & a \end{bmatrix} $$

$$ Right(q^\star) = Right(q)^T $$

所以四元数的旋转乘法公式$v' = qvq^\star$ 可以写成矩阵形式,设 $a = cos(\frac{1}{2}\theta), b = sin(\frac{1}{2}\theta)u_x, c = sin(\frac{1}{2}\theta)u_y, d = sin(\frac{1}{2}\theta)u_z$。

$$ qvq^\star = Left(q)Right(q^\star)v = \ \ \begin{bmatrix} a & -b & -c & -d \ b & a & -d & c \ c & d & a & -b \ d & -c & b & a \ \end{bmatrix} \begin{bmatrix} a & b & c & d \ -b & a & d & -c \ -c & d & a & -b \ -d & -c & b & a \ \end{bmatrix} v \ \ = \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & 1-2c^2-2d^2 & 2bc - 2ad & 2ac+2bd \ 0 & 2bc+2ad & 1-2b^2-2d^2 & 2cd-2ab \ 0 & 2bd - 2ac & 2ab + 2cd & 1-2b^2-2c^2 \ \end{bmatrix} v $$

因为这个四元数是4*4的四维变换矩阵,但是恰巧矩阵第一列和第一行向量的形式不会对v做任何变换,所以可以把4*4压缩成3*3的矩阵:

$$ v' = \begin{bmatrix} 1-2c^2-2d^2 & 2bc - 2ad & 2ac+2bd \ 2bc+2ad & 1-2b^2-2d^2 & 2cd-2ab \ 2bd - 2ac & 2ab + 2cd & 1-2b^2-2c^2 \end{bmatrix} v $$

因为这里的v是个纯四元数,所以也可以把它四维向量压缩成一个3维向量,这样以上的公式就成立了。虽然旋转矩阵不如四元数形式简单,而且从实现上看,占用更多的存储空间,但是对于大量的变换,使用预计算好的矩阵是比四元数乘法更有效率的。

四元数的旋转也可以像矩阵乘法那样复合,也就是可以把连续的变换压缩成一个变换,因为对于任意四元数$q_1, q_2$:

$$ q_1^\star q_2^\star = (q_2 q_1)^\star $$

所以, 四元数的N次复合(旋转变换N次)的公式是:

$$ v' = (qn q{n-1} ... q_1)v(qn q{n-1} ... q1)^\star = q{new}vq_{new}^\star $$

四元数的旋转还有双倍覆盖问题,就是四元数与3D旋转的关系不是一一对应,也就是说,对于同一个3D旋转,可以使用两个不同的四元数来表示,对任意的单位四元数 $q = [cos(\frac{1}{2}\theta), sin(\frac{1}{2}\theta)u]$, 其实就是四元数$q$和$-q$代表同一个旋转,对应的旋转矩阵也是相同的, 如果q表示的是沿着旋转轴u旋转$\theta$度,那么-q代表的就是沿着相反的旋转轴-u旋转$2\pi - \theta$度。其实从旋转公式就可以看出来:

$$ (-q)v(-q)^\star = (-1)^2qvq^\star = qvq^\star $$

所以有些地方的资料上会说单位四元数与3D旋转有一个2对1满射同态的关系(双倍覆盖)。这里有点抽象代数的概念,因为这个映射是一个满射,所以所有的单位四元数都对应着一个3D旋转,或者说,一个四维单位超球面$\mathbb{S}^3$上任意一点所对应的四元数都对应着一个3D旋转。

References

kentzhang-geek commented 2 years ago

mark

AlexiaChen commented 2 years ago

mark

再等几天就写完了。