这个例子回顾概念,三维旋转和四元如何被用来描述取向和旋转。四元数超复数的倾斜场。他们发现,在航空航天,计算机图形学和虚拟现实应用。在MATLAB®,四元数数学可以通过操纵来表示四元
类。
该HelperDrawRotation
类是用来说明本实施例的若干部分。
DR = HelperDrawRotation;
三维空间中所有的旋转都可以由一个旋转轴和围绕该旋转轴的旋转角度来定义。以最左边的图中茶壶的三维图像为例。在第二幅图中,茶壶围绕z轴旋转了45度。在第三个图中显示了一个更复杂的绕轴15度的旋转[1 0 1]。四元数封装了旋转轴和旋转角度,并具有操作这些旋转的代数。该四元
类,而这个例子中,用“右手法则”公约定义旋转。即,从原点观察时正旋转是顺时针方向绕旋转轴线。
dr.drawTeapotRotations;
茶壶的顶点分别围绕旋转的在参考帧中的轴。考虑的一个点(0.7,0.5)绕Z轴30度。
数字;dr.draw2DPointRotation(GCA);
框架旋转,在某种意义上说,点旋转的相反。在框架旋转,该对象的停留点固定的,但参考帧旋转。再次,考虑点(0.7,0.5)。现在参考帧是由绕Z轴旋转30度。注意的是,虽然点(0.7,0.5)保持固定,其具有在参考新,旋转框架不同的坐标。
数字;dr.draw2DFrameRotation(GCA);
取向是指物体相对于参考的帧的的角位移。典型地,取向由引起从起始取向这个角位移的旋转说明。在此示例中,取向被定义为发生在母参考帧中的量,以一个子帧参考的旋转。取向通常被给定为一个四元数,旋转矩阵,设置欧拉角,或者旋转矢量。孩子参照系是相对父框架旋转:考虑定向框架的旋转是有用的。
考虑其中子的参考帧被旋转绕矢量[1/3 2/3 2/3] 30度的例子。
数字;dr.draw3DOrientation(GCA,[1/3 2/3 2/3],30);
四元数形式的数字
在哪里
和和是实数。在这个例子中的休息,四位数字和被称为部分的四元数。
轴和旋转角度封装在四元数部件中。对于单位矢量旋转轴[X,ÿ,ž],和旋转角,描述此旋转的四元数是
注意,要使用四元数描述旋转,四元数必须是a单位四元数。单位四元数的范数为1,其中范数定义为
在MATLAB中构造四元数的方法有很多种,例如:
Q1 =四元数(1,2,3,4)
Q1 =四元数1 + 2I + 3J + 4K
四元数的阵列可以以同样的方式进行:
四元数([1 10;-1], [2 20;-2], [3 30;-3], [4 40;4 4])
ANS = 2×2四元阵列1 + 2I + 3J + 4K 10 + 20I + 30J + 40K -1 - 2I - 3J - 4K 1 + 2I + 3J + 4K
四列数组也可以用来构造四元数,每一列表示一个四元数部分:
qmgk =四元数(魔术(4))
qmgk = 4×1四元阵列16 + 2I + 3J + 13K 5 + 11i的+ 10J + 8K 9 + 7I + 6J + 12K 4 + 1141 + 15J + 1K
四元数可以被索引和操作就像任何其他阵列:
qmgk(3)
ANS =四元数9 + 7I + 6J + 12K
重塑(qmgk,2,2)
ANS = 2×2四元阵列16 + 2I + 3J + 13K 9 + 7I + 6J + 12K 5 + 11i的+ 10J + 8K 4 + 1141 + 15J + 1K
[Q1;Q1]
ans = 2×1四元数阵列1 + 2i + 3j + 4k 1 + 2i + 3j + 4k
四元数已经明确的算术运算。加法和减法类似于复数:部分添加/独立地减去。乘法是比较复杂的,因为前面的公式:
这意味着四元数的乘法不是可交换的。也就是说,对于四元和。然而,每一个四元数具有乘法逆,所以四元数可以划分。的数组四元
类可以加,减,乘,并在MATLAB分。
q =四元数(1、2、3、4);p =四元数(5、6、7、8);
除了
P + Q
ANS =四元数-4 + 8i中 - 4J + 12K
减法
p - q
ANS =四元-6 + 4I - 10J + 4K
乘法
p *
ANS =四元-28 - 56I - 30J + 20K
乘法以相反的顺序(注意不同的结果)
q * p
ans =四元数-28 + 48i - 14j - 44k
权划分p
通过q
相当于。
p./q
ANS =四元数0.6 + 2.2667i + 0.53333j - 0.13333k
左部q
通过p
相当于。
p。\问
ans =四元数0.10345 + 0.2069i + 0j - 0.34483k
四元数的共轭是通过否定每个非实部,类似于结合了复数的形成:
缀(p)的
ans =四元数-5 - 6i + 7j - 8k
四元数可以在MATLAB进行归一化:
pnormed =正常化(p)的
pnormed =四元数-0.37905 + 0.45486i - 0.53067j + 0.60648k
规范(pnormed)
ANS = 1
四元数可以用来旋转点在参考静态帧,或以旋转的参考自身的帧。该rotatepoint
功能旋转点通过以下方程使用四元数q:
在哪里是
和表明四元数共轭。注意在四元以上的四元数相乘的结果与实际的一部分,,等于0。,,结果的部分形成旋转点(,,)。
以上面的点旋转为例。点(0.7,0.5)绕z轴旋转了30度。在三维空间中,这个点的z坐标为0。利用轴角公式,可以用[0 0 1]作为旋转轴来构造四元数。
ANG = deg2rad(30);Q =四元数(COS(ANG / 2),0,0,SIN(ANG / 2));PT = [0.7,0.5,0];在X-Y平面上,% z坐标为0ptrot = rotatepoint(Q,PT)
ptrot = 0.3562 0.7830 0
同样的,rotateframe
函数接受一个四元数和点计算
再次上述四元数相乘的结果以四元数与0实部。该(,,)结果的部分形成的点的坐标在新的,旋转的参照系中。使用四元
类:
ptframerot = rotateframe(q, pt)
ptframerot = 0.8562 0.0830
四元数和它的共轭具有因为在点和框架旋转方程对称的相反的效果。由共轭“撤销”的转动而转动。
rotateframe(缀(q)中,ptframerot)
ANS = 0.7000 0.5000 0
由于方程的对称性,这个代码执行相同的旋转。
rotatepoint(Q,ptframerot)
ANS = 0.7000 0.5000 0
常旋转和取向使用替代来描述:欧拉角,旋转矩阵,和/或旋转矢量。所有这些互操作在MATLAB四元数。
欧拉角被频繁使用,因为它们很容易解释。考虑的参考框架旋转了绕Z轴30度,然后绕Y轴20度,然后-50绕X轴度。这里注意,并在整个围绕各轴的旋转是固有:每个随后的旋转是围绕所述新创建的组轴。换句话说,第二旋转是围绕“新的” Y轴由所述第一旋转所产生,而不是周围的原始Y轴。
数字;euld = [30 20 -50]。dr.drawEulerRotation(GCA,euld);
为了建立从这些欧拉角为框架旋转的目的,四元数,使用四元
构造函数。因为旋转的顺序是先绕z轴,然后绕新的y轴,最后绕新的x轴,所以使用'ZYX'
旗。
qeul =四元数(函数(euld),“欧拉”,'ZYX','帧')
qeul =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
该“欧拉”
标志表示第一个参数的单位是弧度。如果参数以度为单位,则使用'eulerd'
旗。
qeuld =四元数(euld,'eulerd','ZYX','帧')
qeuld =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
若要重新转换为欧拉角:
rad2deg(欧拉(qeul,'ZYX','帧'))
ans = 30.0000 20.0000 -50.0000
同样,eulerd
可以使用的方法。
eulerd(qeul,'ZYX','帧')
ans = 30.0000 20.0000 -50.0000
可替代地,这个相同的旋转可被表示为一个旋转矩阵:
RMAT = rotmat(qeul,'帧')
RMAT = 0.8138 0.4698 -0.3420 -0.5483 0.4257 -0.7198 -0.1926 0.7733 0.6040
转换回四元数是相似的:
四元数(rmat'rotmat','帧')
ans =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
正如四元数既可以用于点旋转,也可以用于帧旋转,它可以转换为一个旋转矩阵(或欧拉角集)专门用于点或帧旋转。点旋转的旋转矩阵是坐标系旋转矩阵的转置。要在旋转表示之间进行转换,必须指定'点'
或'帧'
。
对于本实施例的点旋转部的旋转矩阵为:
rotmatPoint = rotmat(Q,'点')
rotmatPoint = 0.8660 -0.5000 0 0.5000 0.8660 0 0 0 1.0000
为了找到旋转点的位置,正确的乘rotmatPoint
通过转置阵pt
。
rotmatPoint * (pt)
ANS = 0.3562 0.7830 0
对于本实施例的框架旋转部的旋转矩阵为:
rotmatFrame = rotmat(Q,'帧')
rotmatFrame = 0.8660 0.5000 0 -0.5000 0.8660 0 0 0 1.0000
为了找到该点的位置在旋转参考系中,右乘rotmatFrame
通过转置阵pt
。
rotmatFrame *(PT“)
ANS = 0.8562 0.0830 0
旋转向量是一个替代的,紧凑的旋转封装。旋转向量是简单地表示旋转单位长度轴线按比例放大的通过旋转的以弧度为单位的角度的三元素向量。存在与旋转矢量相关联没有帧的烦躁或点的烦躁。要转换为旋转矢量:
RV = rotvec(qeul)
RV = -0.9349 0.0935 0.6375
要转换为四元数:
四元数(RV,'rotvec')
ans =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
四元数相对于欧拉角的一个优点是不存在不连续。欧拉角的不连续点根据使用的约定而变化。该经销
函数比较旋转由两个不同的四元数的作用。其结果是在0至范围内的数π
。考虑从欧拉角建造两个四元:
eul1 = [0,10,0];eul2 = [0,15,0];qdist1 =四元数(deg2rad(eul1),“欧拉”,'ZYX','帧');qdist2 =四元数(deg2rad(eul2),“欧拉”,'ZYX','帧');
减去欧拉角,你会发现在z轴或x轴上没有旋转。
eul2——eul1
ANS = 0 5 0
这两个旋转的差是绕y轴5度。该经销
节目的差别也是如此。
rad2deg (dist (qdist1 qdist2))
ANS = 5.0000
为欧拉角如eul1
和eul2
中,计算的角距离是微不足道的。一个更复杂的例子中,其跨越的欧拉角的不连续,是:
eul3 = [0,89,0];eul4 = [180,89,180]。qdist3 =四元数(deg2rad(eul3),“欧拉”,'ZYX','帧');qdist4 =四元数(函数(eul4),“欧拉”,'ZYX','帧');
虽然eul3
和eul4
代表几乎相同的方向,简单的欧拉角减法给人的印象是这两个方向都相距甚远。
euldiff = eul4 - eul3
euldiff = 180 0 180
使用经销
在四元数表明,只有在这些旋转两度差函数:
euldist = rad2deg(DIST(qdist3,qdist4))
euldist = 2.0000
四元数和负数表示相同的旋转。这是不是从四元减去明显,但经销
功能使得它清除。
QPOS =四元数(-cos(π/ 4),0,0,SIN(π/ 4))
QPOS =四元数-0.70711 + 0I + 0j的+ 0.70711k
qneg = -qpos
qneg =四元数0.70711 + + 0I 0j的 - 0.70711k
qdiff = QPOS - qneg
qdiff =四元数-1.4142 + 0I + 0j的+ 1.4142k
dist (qpo qneg)
ANS = 0
该四元
类允许您在MATLAB中有效地描述旋转和方向。方法可以找到受四元数支持的函数的完整列表金宝app方法
功能:
方法(“四元”)
类四元数的方法:猫ismatrix权力classUnderlying isnan prod紧凑isrow四元数连词isscalar rdivide ctranspose isvector重塑disp ldivide rotateframe dist长度rotatepoint双日志rotmat eq meanrot rotvec欧拉- rotvecd eulerd mtimes单一exp ndims大小horzcat ne slerp iscolumn标准乘以isempty正常化转置isequal元素个数uminus isequaln部分validateattributes isfinite排列vertcat isinf +静态方法:0