对于机器人姿态的转换前面一直介绍欧拉角的方式,其实对于三维坐标的转换四元数法和欧拉角用得都比较多,在内部算法里四元数法占比例更大,欧拉角多用于原理讲解!

四元数是一个复数,下面就一步一步讲解下复数怎么和坐标系旋转勾搭上的!

四元数顾名思义对于旋转的变换只需要四个参数,而欧拉角的旋转矩阵则是3*3的矩阵,有9个元素,所以四元数法用来优化程序,好处显而易见!

在网上查了一些资料,对于四元数的讲解基本上没有让我满意的,可能是我水平不够或者思路跟不上!所以我打算自己总结一篇浅显易懂有不漏知识点的四元数浅析文章!

四元数是一个标量加一个向量,标量一个数,向量三个数!

首先四元数是一个复数,什么是复数?应该初中还是高中的数学肯定是学过的,估计大部分人都还给老师了!

复数

1、概述一下复数

任意一个复数z都可以表示为z=a bi 的形式.我们将a称之为这个复数的实部,b称之为这个复数的虚部。 其中i的平方等于-1!怪不怪!我理解的复数的发明就是为了让它的虚部也能参与运算,因为数学里有的地方会出现i平方等于-1的情况,如果没发明复数,那么就无法完成计算!

复数的模长|z|;

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(1)

模长

它的共(轭)是z1=a-bi;

z*z1=a*a b*b也就是模长的平方;

加减乘除法则和正常运算一样,如z1=a bi,z2=c di;z1 z2=a b bi di; z1*z2=ac adi bci bdi^2;

复数参与运算主要靠上面这几个关系互相转换,算到最后可以把虚数算没了,就像个中间变量一样;兔死狗烹,鸟尽弓藏!

2、复数怎么和旋转矩阵勾搭上的?

推导

首先写z1=a bi,z2=c di两个复数;

z1*z2=ac adi bci bdi^2

由于i平方等于-1;进而化简:

z1*z2=ac-bd adi bci;

再化简:

z1*z2=ac-bd (ad bc)*i;

写成矩阵形式

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(2)

右侧的矩阵c d;就是用向量的形式表示z2;为啥呢?因为复数可以图像化表示,复数z=a bi可以用如下图表示:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(3)

既然右侧的列矩阵c d 表示z2,那么复数z1就是左侧的二维矩阵表示的!进而可以推断出z2的二维矩阵形式;

最终得出,z1*z2就是两个二维矩阵相乘,如下图公式:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(4)

上面的式子里面i不见了,我们就是当i=1;或者让矩阵乘以一个二维矩阵,但是结果不变,那么这个矩阵就是如下形式,得出i的二维矩阵形式,后面会用到这个i矩阵:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(5)

以上这些公式就可以和旋转矩阵眉目传情有点关系了;下面继续推导,把复数z1的矩阵形式再变换一下,就彻底勾搭上了,如下:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(6)

配合下面这个图看一下,就知道为啥彻底勾搭上了:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(7)

这不就是三角函数吗!

那么上面的公式就可以写成三角函数的形式了,加上求模的公式,再加上上面得出的i二维矩阵,最终可以把公式写成如下形式:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(8)

右边的矩阵就是二维里面的旋转矩阵了;

左边的其实就是缩放矩阵;

验证

实验一下我们将一个点坐标 (1,0),旋转θ角度带入上面这个公式,最终得到如下;

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(9)

就是对点(1,0)逆时针旋转了θ角度,然后再缩放|z|倍;同理代入点(1,0)也是一样的原理,如下图显示两个点的旋转图;

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(10)

如果复数的模为1,那么就只剩旋转矩阵了!

总结一下:

如果(模)等于1,复数z可以写成如下矩阵形式:

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(11)

写成复数形式就是:

Z=cosθ sinθ*i;

对比下 :

Z=a b*i;

如此,复数和旋转矩阵的关系大家应该知晓了!

数学真好玩,把两个不相关的东西硬是紧密的勾搭到了一起,佩服!

单位四元数(模为1)

概述

四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。

四元数q写成如下形式:

q=s v1i v2j v3k;

根据复数的定义:i平方=j平方=k平方=ijk=-1;

使用的时候把虚部和实部分开,写成:

q=s v;

标准里我们把四元数表示为:

q=s<v1,v2,v3>;

应用

单位四元数的复数形式怎么和3D旋转扯上关系,推理方法和上面复数推理2D旋转矩阵一样,就不详细讲了,下面我们直接使用它,用matlab写程序案例,直接到应用层次!

直接调用函数UnitQuaternion,下面的0.1、0.2、0.3表示绕x绕y绕z旋转;

>> q = UnitQuaternion( rpy2tr(0.1, 0.2, 0.3) )

q =

0.98335 < 0.034271, 0.10602, 0.14357 >

用q.R可以输出旋转矩阵:

>> q.R

ans =

0.7536 -0.4993 0.4275

0.5555 0.8315 -0.0081

-0.3514 0.2436 0.9040

输出图形如下:

>> q.plot()

定点数和浮点数思维导图(浅析机器人学位姿之单位四元数)(12)

以上就是四元数的简单介绍,第一部分主要让大家搞懂四元数怎么能表示旋转的,第二部分就是简单的应用了,可以看出应用非常简单,如果实际写应用程序,四元数法会简单明了,节省时间,也可以让程序更流畅!

各位朋友感觉有用的话多谢关注我!我会持续给大家输出工控领域的经验和容易理解的知识点!

,