惯性导航之认识四元数(四)

来源:互联网 发布:混沌与秩序2救赎数据库 编辑:程序博客网 时间:2024/05/21 06:56

之前说到,使用欧拉角积分和方向余弦积分求得角度并不合适,而比较合适的是四元数。

在讨论「四元数」之前,我们来想想对三维直角坐标而言,在物体旋转会有何影响,可以扩充三维直角坐标系统的旋转为三角度系统(Three-angle system),在Game Programming Gems中有提供这么一段:

  • Quaternions do not suffer from gimbal lock. With a three-angle(roll, pitch, yaw) system, there are always certain orientations in which there is no simple change to the trhee values to represent a simple local roation. You often see this rotation having “pitched up” 90 degree when you are trying to specify a local yaw for right.

简单地说,三角度系统无法表现任意轴的旋转,只要一开始旋转,物体本身即失去对任意轴的自由性。(引自四元數與旋轉)


工具:

  • 复数、四元数
  • 欧拉公式

开始正文


一、什么是四元数?

四元数是简单的超复数。 复数是由实数加上虚数单位 i 组成,其中i^2 = -1。 相似地,四元数都是由实数加上三个虚数单位 i、j、k 组成,而且它们有如下的关系: i2=j2=k2=1i0=j0=k0=1, 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示q=a+bk+cj+di,其中a、b、c 、d是实数。(引自百度百科:四元数)

四元数的表达式:

  • q=a+bi+cj+dk

虚数单位满足:

  • i2=j2=k2=ijk=1

我们可以从复数来认识四元数,顺便说一下四元数的来历。在二维空间中,复数可以和复平面中的点一一对应,并且可以表示二维空间中的旋转。但是到了三维空间中呢?爱尔兰数学家哈密顿在将复数延伸到三维空间中时,想使用q=a+bi+cj来表示和三维空间中的点对应,但是遇到了一个问题,这个‘三元数’的乘法和除法该怎么计算呢?例如,i*j应该等于多少?而最终,哈密顿牺牲了乘法交换律创造了四元数,虚数单位可以得到完整的乘法表:

– 1 i j k 1 1 i j k i i -1 k -j j j -k -1 i k k j -i -1

这样,相应的加减乘除也得到了解决。

四元数的运算:
设有两个四元数:

  • q1=w1+x1i+y1j+z1k
  • q2=w2+x2i+y2j+z2k

加法定义为:

  • q1+q2=(w1+w2)+(x1+x2)i+(y1+y2)j+(z1+z2)k

乘法遵循分配律:

  • q1q2=(w1w2x1x2y1y2z1z2)+(w1x2+x1w2+y1z2z1y2)i+(w1y2x1z2+y1w2+z1x2)j+(w1z2+x1y2y1x2+z1w2)k

单位四元数,范数(模长)为1:

  • N(q)=|q|=x2+y2+z2+w2=1

定义四元数q=w1+x1i+y1j+z1k共轭为:

  • q=w1x1iy1jz1k

四元数的倒数为:

  • 1q=qN(q)

具体的四元数的运算在这里就不说了,维基百科四元数里有比较详细的解释。

总之,四元数是类似复数的超复数,有三个虚数单位。为了延伸到三维空间产生,可以表示三维空间里的点,三维空间的旋转。


二、四元数表示旋转的约定

用四元数来表示旋转要解决两个问题,一是如何用四元数表示三维空间里的点,二是如何用四元数表示三维空间的旋转。
四元数表示空间中的点
若三维空间里的一个点的笛卡尔坐标为 (x,y,z),则它用纯四元数(类似于纯虚数,即实部为0的四元数)xi+yj+zk 表示。
单位四元数表示一个三维空间旋转
设 q 为一个单位四元数,而 p 是一个纯四元数,定义
Rq(p)=qpq1
则 Rq(p)) 也是一个纯四元数,可以证明 Rq 确实表示一个旋转,这个旋转将空间的点 p 旋转为空间的另一个点 Rq(p))。(引自维基百科:四元数与空间旋转)

看了上面的解释还是不是很好理解,那么,四元数是怎样表示空间中的旋转的呢?先从二维空间中的复数看起。

复数的表达形式:

  • 一般形式:q=a+bi
  • 向量形式
  • 指数形式:z=reiθ(或者叫极坐标形式)
  • 三角形式:z=rcosθ+irsinθ
  • 极坐标形式:z=r<θ

复数

我们还需要知道一点,欧拉公式:

  • 欧拉恒等式:eiπ+1=0
  • 欧拉公式eiθ=cosθ+isinθ

欧拉公式证明可以有泰勒级数或者求导证得,这里不多说。

由复数的各种表现形式和欧拉公式,可以推导出:

  • z=a+bi=rcosθ+irsinθ=reiθ(这里r=a2+b2

则对于复数z和单位复数eiθ=cosθ+isinθ的乘积zeiθ可以解读为点z在二维复平面中逆时针旋转了θ经度,或者向量(a,b)在复平面中逆时针旋转了θ度。即:z=a+bi可以表示为向量(a,b)旋转了θ度,θ=arctan(b/a)

类比于此,四元数z=a+bi+cj+dk=reiθ也可以表示一个旋转,不过不如复数那样明确,难以想象在R4中的四元数是对R3中的向量怎样执行运算的。

仿照关于单位复数的欧拉公式的证明方法,可以得到单位四元数的欧拉公式:
eθ2(xi+yj+zk)=cosθ2+(xi+yj+zk)sinθ2,for x,y,zR s.t. x2+y2+z2=1(引自维基百科:四元数与空间旋转)

这里直接给出四元数表示旋转的约定。首先明确一点:

  • 只有特征四元数(范数为1)才能表示旋转。(至于为什么,不知道……)

一个有固定点的刚体通过绕该轴旋转特定角度就可以达到任何姿态。
转轴可以表示成为一个单位向量:

  • n= cosαi+cosβj+cosγk

刚体旋转

描述该转动的四元数为:

  • q=cosθ2+sinθ2n

最终表示为:

  • q=cosθ2+sinθ2cosαi+sinθ2cosβj+sinθ2cosγk

四元数可以表示旋转的转轴和角度。


主要参考资料:

1、百度百科:四元数
2、维基百科:四元数
3、维基百科:四元数与空间旋转
4、線代啟示錄:四元數與三維空間旋轉
5、線代啟示錄:四元數

0 0
原创粉丝点击