0摘要

因为我个人是做六轴机械臂轨迹规划,所以大部分学习和博客重点与此有关。本篇文章主要讲述四元数的定义数学基础(没有推导只有公式结果)、四元数是如何表示旋转位姿,四元数表示位姿在轨迹规划过程中的插值方法、四元数的优缺点(主要是优点)。

1.四元数基础

1.1四元数作用
从复数的定义是w = a+bj,我们发现其实给一个复数w1乘上另外一个复数w2,实际上可以实现对w1的旋转和缩放,如果我们将w2单位化,那么我们就可以将w1旋转,但是这个变化是平面上的,我们可以用w = a + bi +cj+dk,来实现三维空间的位姿旋转表示,这就是四元数在位姿表述上的使用。
1.2四元数的定义


其中

有时我们也这样表示四元数

其中s是实数部分,v是虚数部分


1.2四元数计算
关于四元数数学基础
加减、点乘、叉乘、系数缩放
纯四元数和实四元数
单位四元数
共轭四元数、四元数的逆
参见bloghttps://www.qiujiawei.com/understanding-quaternions
1.3旋转四元数
前面我们定义了一个特殊的复数:旋转数。它是用来旋转2D复数平面的点的

根据四元数和复数的相似性,应该有可能设计一个可以旋转3D空间的点的四元数:
由于种种数学原因
我们最终采取的旋转四元数的一般形式为

2.旋转四元数插值

2.1SLERP
SLERP可以在2个朝向之间平滑地插值。
第一个朝向设为q1,第二个朝向设为q2
(请记住,这2个指示朝向的四元数是单位四元数,不然阅读下文会混乱)。被插值前的点设为p,插值后的点设为p′。而插值参数t,当t=0时会把p转到q1,当t=1时会转到q2。
标准的线性插值公式是(译注:这个公式是笛卡尔坐标系下的,不是指四元数):
应用这个等式的一般步骤是:
计算p1、p2之间的差。
根据参数t,计算两个点的差的小数值(因为0<=t<=1)
把第二步的值加上原始点的值,算出结果
2.2SQUAD
正如一个SLERP可以被用来计算四元数之间的插值,一个SQUAD (Spherical and Quadrangle)可以被用来对旋转路径进行平滑插值。
如果我们有四元数序列:
q1,q2,q3,qn−2,qn−1,qn
然后我们再定义一个”辅助”四元数(si),它是一个中间控制点:

所以,沿着子曲线的朝向可以定义为:
在t时刻的朝向就是:

然后我们再定义一个”辅助”四元数(si),它是一个中间控制点:

3.旋转四元数与其他旋转表述方法

3.1旋转四元数和欧拉,RPY、以及旋转矩阵之间的换算

欧拉角:


R矩阵

参考blog https://blog.csdn.net/u012814946/article/details/

3.2旋转四元数的优缺点
优点
计算量偏小,计算时间短
可以避免万向节锁现象
可以提供平滑插值
缺点
舍入误差会引起四元数无效,需要重新单元化
理解难度更大,还是需要自己进行案例的数学计算才有助于对旋转的理解
拓展
GLM(OpenGL Math Library)是一个优秀的数学库,它的四元数的实现极其不错。如果你对在你的程序中使用四元数感兴趣,那么我会推荐你使用这个数学库。

4.预告

下篇博客会对旋转矩阵的插值做具体案例演示
下下篇预计写到四元数其中对于四元数的旋转效果也会做代码演示