有限元分析 数学 难学么:浅析机器人学位姿之单位四元数
有限元分析 数学 难学么:浅析机器人学位姿之单位四元数复数的模长|z|;任意一个复数z都可以表示为z=a bi 的形式.我们将a称之为这个复数的实部,b称之为这个复数的虚部。 其中i的平方等于-1!怪不怪!我理解的复数的发明就是为了让它的虚部也能参与运算,因为数学里有的地方会出现i平方等于-1的情况,如果没发明复数,那么就无法完成计算!四元数是一个标量加一个向量,标量一个数,向量三个数!首先四元数是一个复数,什么是复数?应该初中还是高中的数学肯定是学过的,估计大部分人都还给老师了!1、概述一下复数
对于机器人姿态的转换前面一直介绍欧拉角的方式,其实对于三维坐标的转换四元数法和欧拉角用得都比较多,在内部算法里四元数法占比例更大,欧拉角多用于原理讲解!
四元数是一个复数,下面就一步一步讲解下复数怎么和坐标系旋转勾搭上的!
四元数顾名思义对于旋转的变换只需要四个参数,而欧拉角的旋转矩阵则是3*3的矩阵,有9个元素,所以四元数法用来优化程序,好处显而易见!
在网上查了一些资料,对于四元数的讲解基本上没有让我满意的,可能是我水平不够或者思路跟不上!所以我打算自己总结一篇浅显易懂有不漏知识点的四元数浅析文章!
四元数是一个标量加一个向量,标量一个数,向量三个数!
首先四元数是一个复数,什么是复数?应该初中还是高中的数学肯定是学过的,估计大部分人都还给老师了!
复数1、概述一下复数
任意一个复数z都可以表示为z=a bi 的形式.我们将a称之为这个复数的实部,b称之为这个复数的虚部。 其中i的平方等于-1!怪不怪!我理解的复数的发明就是为了让它的虚部也能参与运算,因为数学里有的地方会出现i平方等于-1的情况,如果没发明复数,那么就无法完成计算!
复数的模长|z|;
模长
它的共(轭)是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;
写成矩阵形式
右侧的矩阵c d;就是用向量的形式表示z2;为啥呢?因为复数可以图像化表示,复数z=a bi可以用如下图表示:
既然右侧的列矩阵c d 表示z2,那么复数z1就是左侧的二维矩阵表示的!进而可以推断出z2的二维矩阵形式;
最终得出,z1*z2就是两个二维矩阵相乘 如下图公式:
上面的式子里面i不见了,我们就是当i=1;或者让矩阵乘以一个二维矩阵,但是结果不变,那么这个矩阵就是如下形式,得出i的二维矩阵形式,后面会用到这个i矩阵:
以上这些公式就可以和旋转矩阵眉目传情有点关系了;下面继续推导,把复数z1的矩阵形式再变换一下,就彻底勾搭上了,如下:
配合下面这个图看一下,就知道为啥彻底勾搭上了:
这不就是三角函数吗!
那么上面的公式就可以写成三角函数的形式了,加上求模的公式,再加上上面得出的i二维矩阵,最终可以把公式写成如下形式:
右边的矩阵就是二维里面的旋转矩阵了;
左边的其实就是缩放矩阵;
验证
实验一下我们将一个点坐标 (1,0),旋转θ角度,带入上面这个公式,最终得到如下;
就是对点(1,0)逆时针旋转了θ角度,然后再缩放|z|倍;同理代入点(1,0)也是一样的原理,如下图显示两个点的旋转图;
如果复数的模为1,那么就只剩旋转矩阵了!
总结一下:
如果(模)等于1,复数z可以写成如下矩阵形式:
写成复数形式就是:
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()
以上就是四元数的简单介绍,第一部分主要让大家搞懂四元数怎么能表示旋转的,第二部分就是简单的应用了,可以看出应用非常简单,如果实际写应用程序,四元数法会简单明了,节省时间,也可以让程序更流畅!
各位朋友感觉有用的话多谢关注我!我会持续给大家输出工控领域的经验和容易理解的知识点!