四元数乘法计算和学习体会

关于两个四元数的乘法,网上查了一大堆,没一个说明白的。

我就想知道给我两个四元数,我该怎么算出来它们的乘积。

这么简单的需求都没法找到答案,实在对不起四元数的江湖地位。

要想计算四元数的乘法,首先需要知道四元数常见的表示方法

四元数乘法计算和学习体会_第1张图片

其中复数式、矢量式和三角式基本是一回事,都是把四元数写成一个标量和一个向量的和的形式。指数式和矩阵式就是一种表示方法,涉及到数学意义和运算还是主要用前三种。

下面介绍不同四元数表示形式的乘法:

1.复数式

这个结果这么复杂,而且看起来毫无规律,当然不能死记硬背。

其实就是简单的展开相乘,注意涉及到i*j的时候按照叉乘右手定则判断,即i*j=k;遇到i*i的时候按照复数运算,或者说按照点乘取负计算,即i*i=-1

当然也可以按照下面的乘数表进行运算

× 1 i j k
1 1 i j k
i i -1 k -j
j j -k -1 i
k k j -i -1

例如,(2+i)(i+j)=2*i+2*j+i*i+i*j=2i+2j-1+k=-1+2i+2j+k

从上面可以看出,四元数的乘法既不是叉乘,也不是点乘,是叉乘和点乘的混合,涉及到正交向量相乘如i*j时是叉乘,涉及到相同向量相乘如i*i时,却是点乘取负,或者看作复数相乘。

因此四元数乘法和叉乘类似,没有乘法交换律,如i×j=k,但是j×i=-k。

用复数式计算四元数乘法十分繁琐,只适合手动计算较简单的四元数乘法。

2.矢量式

矢量式四元数相当于把复数式四元数中的q1*i+q2*j+q3*k看成一个整体的矢量q,这样乘法的表达形式会简洁很多,如下:

四元数乘法计算和学习体会_第2张图片

其实就是展开相乘,注意q和p矢量相乘的结果等于叉乘的结果减去点乘的结果。

为什么还会多出一项q和p的点乘呢?其实在上文复数式乘法中已经介绍了,i*i不是按照叉乘等于0,而是按照点乘取负进行计算,即i*i=-1。所以矢量式的四元数乘法中才会多出一项点乘。

矢量式的四元数乘法也适用于三角式相乘。

3.矩阵式

为了方便计算机运算四元数乘法,我们把复数式乘法的结果写成矩阵的形式,方便记忆和编程。但运算本质还是前两种。‘

上述两种矩阵都是反对称矩阵,保留的乘子分别是p和q,矩阵形式也略有不同。

还是要注意QP ≠ PQ 

 

四元数的用途

顺便提一下,四元数的实际意义还是用来表示向量旋转或者坐标系转换比较方便,这主要是利用四元数三角式的性质

四元数乘法计算和学习体会_第3张图片

或者

四元数乘法计算和学习体会_第4张图片

这就把向量旋转的坐标转换变成了四元数相乘。在此之前,向量旋转的坐标变换都是用方向余弦矩阵配合欧拉角实现的。

 

四元数的优势

可以看出,四元数的矢量部分直接对应了旋转轴,标量和矢量部分共同决定了旋转角,这是比欧拉角三个角表示旋转更为接近本质的方法。

相较于欧拉角求旋转向量坐标的方法,

1、四元数方法不需要进行求三角函数的运算,因此运算精度更高;

2、四元数也不存在欧拉角的框架自锁问题。

ps:框架自锁问题如下

 

 

 

 

 

你可能感兴趣的:(学习,经验分享)