Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
AlexiaChen opened this issue Jun 11, 2022 · 2 comments
Open

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

AlexiaChen opened this issue Jun 11, 2022 · 2 comments
Labels
数学 计算机科学有关的数学笔记,知识,总结可能都在这里

Comments

@AlexiaChen
Copy link
Owner

AlexiaChen commented Jun 11, 2022

前言

最近在学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,四元数的4*4的实数矩阵表示法不唯一,难道这这个? 四元数也有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' = (q_n q_{n-1} ... q_1)v(q_n q_{n-1} ... q_1)^\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

@AlexiaChen AlexiaChen added 数学 计算机科学有关的数学笔记,知识,总结可能都在这里 WIP Work in Progress labels Jun 11, 2022
@AlexiaChen AlexiaChen changed the title [WIP] 对四元数的理解 对四元数的理解 Jun 11, 2022
@kentzhang-geek
Copy link

mark

@AlexiaChen AlexiaChen changed the title 对四元数的理解 从复数到四元数 Jun 17, 2022
@AlexiaChen AlexiaChen changed the title 从复数到四元数 从复数(二元数)到四元数 Jun 17, 2022
@AlexiaChen
Copy link
Owner Author

mark

再等几天就写完了。

@AlexiaChen AlexiaChen removed the WIP Work in Progress label Jun 22, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
数学 计算机科学有关的数学笔记,知识,总结可能都在这里
Projects
None yet
Development

No branches or pull requests

2 participants