四元数与旋转--来历和结论

依旧是前言

我在前一篇欧拉角的介绍里介绍过欧拉角,这是一种很直观的旋转表示。直观并没有什么不对的地方,但是我们人认为的直观,和机器认为的直观是有区别的......

欧拉角,这个旋转的表达方式从欧拉提出开始沿用至今,依然有顽强的生命力。现在的几种流行的MOCAP文件格式,ASF/AMC, BVH, C3D,除了最后一种存的是三维坐标,前两种的旋转全部是用欧拉角表示的。说实话,这并不是什么好事儿。都0202年了,欧拉角已经两百多年了,居然还在沿用。要说这个表示方法是什么很完美,很经典的方式也就算了,可欧拉角有很多严重的缺陷:比如万向节死锁的问题,会导致一个自由度完全失效。

所以,人们其实研究了一些替代品,比如轴角法表示,以及进一步的四元数表示。四元数表示起来最大的好处就是,连续。这一篇将会简单讲讲四元数的来历,以及与三维旋转的关系。

四元数是怎么来的

形式主义思维

感性来说,四元数就是这样的一个数:

\[q = a + bi + cj + dk \]

其中\(a, b, c, d\in R\), \(i, j, k\)是三个虚数单位。

哈,这篇文章当然不会只有这些,只是这个形式其实是很重要的。

复数是怎么来的

先看两元数复数的由来。

最开始数学家想啊,\(x^2=-1\)这个方程无解,这多不好看啊。要是存在一个数 \(i\),它的平方是\(-1\),这不就很有趣了吗,这样一来所有\(n\)阶方程就都有\(n\)个根了。有了这个虚数单位,就有了我们最经典的复数形式:

\[z = a +bi \]

其中有两个条件:

  1. \(a, b\in R\)

  2. 人为规定\(i^2=-1\).

这一下子就把数域给拓宽了。数学家们又发现\(i\)有很良好的周期性,于是他们把复数和平面的几何变换结合起来,诶,还挺合适的,复数在平面几何里面发挥了意想不到的作用。

两元到四元

平面几何有二元复数可以参与运算,那么立体几何呢?一般复数的两个自由度显然是不够的,因为立体的变换,起码得有三个自由度才够看。我们还回到这个复数的形式上,考虑这个操作:把\(a, b \in R\) 这个条件给删掉。这时的 \(a\)\(b\),或者表示成 \(A\)\(B\) 要更合适一些,代表两个复数。就是这样的:

\[A=a+bi \]

\[B=c+di \]

你可能要奇怪啦:如果把这个 \(A\)\(B\) 放到上面公式的 \(a\)\(b\) 里面,结果还是一个二元复数呀,这个操作没有任何意义嘛。这就要改我们的第二个条件了,只不过 \(i\) 本身不用改,我们要做的是再加两个虚数单位 \(j\)\(k\) 进去,而且满足:

  1. \(i^2=j^2=k^2=-1\)
  2. \(ij=k, jk=i, ki=j\)
  3. \(ij=-ji, jk=-kj, ki=-ik\)

先不说这三个条件是干什么的,现在可是急着要把四元数的形式给推导出来。那么,把普通复数的虚数单位 \(i\) 换成 \(j\),就得到了:

\[q=A+Bj=(a+bi)+(c+di)j=a+bi+cj+dk \]

这就是之前看到的那个形式了。

四元数和旋三维旋转什么关系

向量的四元数表示

我们知道,三维坐标只有三个自由度,而四元数有四个成员,怎么才能把三维坐标和四元数联系在一起呢?
首先想到的肯定是削减一个自由度,保留另外三个。这里就要用到之前对\(ijk\)的定义了。相信聪明的你已经发现了,这三个单位的定义有极强的对称性,就像……三个坐标轴。而他们的乘法,有着反交换性,这让你想起了什么?

对,叉乘。这几个条件就是让 \(i, j, k\) 分别对应到三维坐标系的三个坐标轴方向的单位向量。明确这一点后,接下来说的也就不难理解了:

把上面的字母换一下,换成 \(q=w+xi+yj+zk\) ,它就可以写成 \(q=(w, \boldsymbol{v})\)。其中\(w\)就是前面的\(w\), 通常称为标量部分;\(\boldsymbol{v}=[x\quad y\quad z]\),也就是通常说的矢量部分。一个三维向量如果要写成四元数,就把这个三维向量填到四元数的矢量部分,而把标量部分置为0,也就是\((0, \boldsymbol{v})\).

按照这种表示方法,一个三维向量就和一个四元数对应起来了。三维旋转,自然而然,就是把一个四元数通过某种方式转化成为另一个四元数。下面重点来啦(咚咚咚敲黑板)

单位四元数表示的旋转

绕单位向量\(\boldsymbol{n}=[n_x\quad n_y\quad n_z]\)表示的转轴逆时针旋转角度\(\theta\)的旋转,可以用单位四元数表示成:

\[p=(\cos\frac{\theta}{2}, \boldsymbol{n}\sin\frac{\theta}{2}) \]

写成显式表达为:

\[p=\cos\frac{\theta}{2}+in_x\sin\frac{\theta}{2}+jn_y\sin\frac{\theta}{2}+kn_z\sin\frac{\theta}{2} \]

它的作用方式比较特殊。对于一个给定的向量\(\boldsymbol{v}\),四元数表示是\(q=(0, \boldsymbol{v})\). 显然直接的乘法,即\(pq\)或者\(qp\)是得不到想要的旋转结果的。这个作用方式更像是线性代数中讲的二次型,是一种对称的表达形式:

\[q^\prime=pqp^\star \]

其中\(p^\star=(\cos\frac{\theta}{2}, -\boldsymbol{n}\sin\frac{\theta}{2})\),是\(p\)共轭.

End?

到这里算结束了吗,算是吧,至少这篇只是介绍一下四元数的来历和与旋转的关系。甚至对于时间严重不足的读者,可能整篇只有加粗的那段是有用的。

实际上我本来想要介绍一下这个形式的来历,但那就要讲到四元数的运算律,这可不是一两句话能说明白的,于是我就放到下次再介绍吧。而且,这篇已经有一八百千多字了,我可不想每篇都写成一篇三四千字的报告,那样我写着也痛苦,你读着也痛苦:<

最后,这文章仅供参考。我不想写成一篇学术报告,因此说的比较口语化,也可能有些错误。如果发现请指正呀。

Thx.

posted @ 2020-11-05 15:16  滞环  阅读(999)  评论(0)    收藏  举报