接着上一篇博客四元数研究:www.cnblogs.com/liuzhenbo/p/10749458.html
加法:
乘法:
将四元数用于计算轴角表示运算时,我们通常写成向量形式(vector representation) ,为了表达清晰和计算方便,我们将w,x,y,z的取值定位 ,并称之为单位四元数,在方向计算时单位四元数中w,x,y,z分饰的角色我们后面会解释。此时,复数乘法可表示为向量形式:
要注意这里出现的向量叉乘没有交换率。
同时,我们也可以将乘法写成矩阵形式,以用于和欧拉角计算作比较:
观察此式,我们发现两个四元数相乘,需要存储8个单位数据,也就是说,每个参与运算的四元数只要存储4个单位数据 即可。
此外我们还需要几个特殊量和性质:
- 四元数的模:
- 四元数共轭:
- 共轭的向量形式:
- 四元数倒数:
- 共轭与倒数的关系: 可见对于单位四元数
- 共轭与倒数的性质: ,
- 四元数运算同时满足结合律和分配律:
了解了上面的计算法则,我们就可以利用四元数来计算方向变换过程了。还记得我们之前说过计算时四元数我们用向量形式表示,且保证它是单位四元数吗?其实四元数的向量形式我们还可以进一步改写为极形式(polar representation)
,
其中 代表了四元数的模,单位四元数模为1,而 是四元数表示的旋转过程的半角大小,也就是说 就是旋转角大小, 则是表示旋转轴方向的单位向量。用这种表示方法,四元数即可表示任意轴角表达的方向变换。方向变换的计算方法我们这里给出结论,大家可以自己通过计算来验证一下,如有兴趣也可以推导一下过程:
先将原向量坐标表示为四元数 ,将旋转角度及旋转轴表示为单位四元数 ,旋转后的向量坐标可通过 或 计算得出。
至此,四元数算是正式引入完了,下面我们来看看为什么我们要引入四元数。
先说结论,四元数的引用是为了减少计算量和计算时存储占用的空间。
但是,如果你足够细心,一定可以发现两个四元数相乘的过程其实是一个4×4矩阵与一个4×1矩阵相乘的过程,而四元数计算一次变换需要两次这个过程,其中包括24次加法运算和32次乘法运算,反观欧拉角的矩阵变换只要进行一次3×3矩阵和3×1矩阵的乘法运算,其中包括6次加法运算和9次乘法运算,运算量明显是四元数更大一些。如果你再细心一些可以发现,四元数运算时虽然有个4×4矩阵参与运算,但是矩阵中的每一项都是已经存储过的单位数据,而参与欧拉角运算的3×3矩阵则要通过另外已存储的单位数据进行的16次乘法运算,4次加法运算以及4次符号改变运算来求出,不过即使加上这些运算过程,矩阵运算也只要25次乘法运算,10次加法运算以及4次符号改变运算,运算量上来说,欧拉角的矩阵运算依然比四元数运算要有优势。
但事实上,我们一般遇到的运动学问题很少会有只做一次方向转换的情况出现,对于复杂的系统和机器人来说,我们往往会面对数量庞大的转变方向过程。这种情况下四元数的优势就体现出来了,我们考虑多次变换的四元数运算:
,
我们利用结合律来看:
,
考虑到四元数共轭有性质: ,我们可以把原式改写为
,
可以发现,原向量 左右两侧括号里的运算结果是一对共轭四元数,也就是说可以利用3次易号运算代替n次四元数相乘运算,大大减少了计算量。反观欧拉角的矩阵计算,虽然一次旋转时,仅仅是3×3矩阵和3×1矩阵的乘法运算,但是对于多次运算来说, 的运算却是多个3×3矩阵相乘,与四元数 的每组4×4矩阵与4×1矩阵的相乘相比运算量要大上不少,加上3×3矩阵中多数元素都是需要通过单位数据再次运算才能得到的,更是增加了运算量的需求。总体看来,在复杂的多次变换情况下,四元数比矩阵运算所需要的运算量更小。
另外,我们之前提到过,每一个3×3的矩阵至少需要存储6个单位数据才可以记录,而每个四元数仅需要4个单位数据即可(其实考虑到四元数是单位四元数,在保证w已知的前提下,x,y,z缺少任意一个都是可以通过运算推导出四元数的,也就是说可能只要占用三个数据的存储空间,前提是对x,y,z的定义域要有限制),在大量变换的运算中,四元数的应用可以节约非常多的存储空间。
拥有以上两个优点,加上规避了Ambiguity的问题,我们在表示方向和方向变换时会经常使用四元数的运算。不过四元数也是有缺点的,在复杂运动中,方向旋转和位移往往是同时发生的,在运用欧拉角矩阵运算时,我们考虑平移运算只要改写矩阵为4×4 homogeneous matrix 即可,而四元数则必须重新写为 的形式以找到homogeneous matrix,非常麻烦。
,其中
https://www.zhihu.com/question/47736315/answer/236808639