四元数是一个复数,下面就一步一步讲解下复数怎么和坐标系旋转勾搭上的!
在网上查了一些资料,对于四元数的讲解基本上没有让我满意的,可能是我水平不够或者思路跟不上!所以我打算自己总结一篇浅显易懂有不漏知识点的四元数浅析文章!
首先四元数是一个复数,什么是复数?应该初中还是高中的数学肯定是学过的,估计大部分人都还给老师了! 复数1、概述一下复数 任意一个复数z都可以表示为z=a+bi 的形式.我们将a称之为这个复数的实部,b称之为这个复数的虚部。 其中i的平方等于-1!怪不怪!我理解的复数的发明就是为了让它的虚部也能参与运算,因为数学里有的地方会出现i平方等于-1的情况,如果没发明复数,那么就无法完成计算! 复数的模长|z|; 模长
复数参与运算主要靠上面这几个关系互相转换,算到最后可以把虚数算没了,就像个中间变量一样;兔死狗烹,鸟尽弓藏! 2、复数怎么和旋转矩阵勾搭上的? 推导 首先写z1=a+bi,z2=c+di两个复数;
由于i平方等于-1;进而化简:
再化简:
写成矩阵形式 右侧的矩阵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可以写成如下矩阵形式: 写成复数形式就是:
对比下 :
如此,复数和旋转矩阵的关系大家应该知晓了! 数学真好玩,把两个不相关的东西硬是紧密的勾搭到了一起,佩服! 单位四元数(模为1)概述
标准里我们把四元数表示为:
应用 单位四元数的复数形式怎么和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() 以上就是四元数的简单介绍,第一部分主要让大家搞懂四元数怎么能表示旋转的,第二部分就是简单的应用了,可以看出应用非常简单,如果实际写应用程序,四元数法会简单明了,节省时间,也可以让程序更流畅!
|
|