之前说到,使用欧拉角积分和方向余弦积分求得角度并不合适,而比较合适的是四元数。
在讨论「四元数」之前,我们来想想对三维直角坐标而言,在物体旋转会有何影响,可以扩充三维直角坐标系统的旋转为三角度系统(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=−1 , i0=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
乘法遵循分配律:
- q1∗q2=(w1∗w2−x1∗x2−y1∗y2−z1∗z2)+(w1∗x2+x1∗w2+y1∗z2−z1∗y2)i+(w1∗y2−x1∗z2+y1∗w2+z1∗x2)j+(w1∗z2+x1∗y2−y1∗x2+z1∗w2)k
单位四元数,范数(模长)为1:
- N(q)=|q|=x2+y2+z2+w2=1
定义四元数 q=w1+x1i+y1j+z1k 的共轭为:
- q=w1−x1i−y1j−z1k
四元数的倒数为:
- 1q=q∗N(q)
具体的四元数的运算在这里就不说了,维基百科四元数里有比较详细的解释。
总之,四元数是类似复数的超复数,有三个虚数单位。为了延伸到三维空间产生,可以表示三维空间里的点,三维空间的旋转。
二、四元数表示旋转的约定
用四元数来表示旋转要解决两个问题,一是如何用四元数表示三维空间里的点,二是如何用四元数表示三维空间的旋转。
四元数表示空间中的点
若三维空间里的一个点的笛卡尔坐标为 (x,y,z),则它用纯四元数(类似于纯虚数,即实部为0的四元数) xi+yj+zk 表示。
单位四元数表示一个三维空间旋转
设 q 为一个单位四元数,而 p 是一个纯四元数,定义
Rq(p)=qpq−1
则 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θ (这里 r2=a2+b2 )
则对于复数z和单位复数
eiθ=cosθ+isinθ
的乘积
zeiθ
可以解读为点
z
在二维复平面中逆时针旋转了
类比于此,四元数 z=a+bi+cj+dk=reiθ 也可以表示一个旋转,不过不如复数那样明确,难以想象在 R4 中的四元数是对 R3 中的向量怎样执行运算的。
仿照关于单位复数的欧拉公式的证明方法,可以得到单位四元数的欧拉公式:
eθ2(xi+yj+zk)=cosθ2+(xi+yj+zk)sinθ2,for x,y,z∈R s.t. x2+y2+z2=1 (引自维基百科:四元数与空间旋转)
这里直接给出四元数表示旋转的约定。首先明确一点:
- 只有特征四元数(范数为1)才能表示旋转。(至于为什么,不知道……)
一个有固定点的刚体通过绕该轴旋转特定角度就可以达到任何姿态。
转轴可以表示成为一个单位向量:
- n= cosα⋅i+cosβ⋅j+cosγ⋅k
描述该转动的四元数为:
- q=cosθ2+sinθ2⋅ n
最终表示为:
- q=cosθ2+sinθ2cosα⋅i+sinθ2cosβ⋅j+sinθ2cosγ⋅k
四元数可以表示旋转的转轴和角度。
主要参考资料:
1、百度百科:四元数
2、维基百科:四元数
3、维基百科:四元数与空间旋转
4、線代啟示錄:四元數與三維空間旋轉
5、線代啟示錄:四元數