此示例评论了三维旋转中的概念以及数量如何用于描述方向和旋转。四元数是超拷贝数的偏斜场。它们在航空航天,计算机图形和虚拟现实中找到了应用。在MATLAB®中,可以通过操纵来表示四元数学数学四元数
班级。
的HelperDrawRotation
类用于演示本示例的几个部分。
博士= HelperDrawRotation;
所有三维旋转都可以由旋转轴和绕旋转轴旋转的角度来定义。考虑最左边的图中一个茶壶的三维图像。茶壶在第二个图中围绕z轴旋转45度。在第三张图中显示了一个更复杂的绕轴[1 0 1]旋转15度。四元数封装了轴和旋转角度,并有一个操作这些旋转的代数。的四元数
类和此示例,使用“右侧规则”惯例定义旋转。也就是说,当从原点观察时,正旋转围绕旋转轴线顺时针。
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]旋转30度的例子。
图;Dr.Draw3Dorientation(GCA,[1/3 2/3 2/3],30);
四元数是数字的形式
在哪里
和和是真实的数字。在这个例子的其余部分,四个数字和被称为部分四元数。
轴和旋转角度被封装在四元数部分中。为单位矢量旋转轴[x,y,z,以及旋转角度,描述这个旋转的四元数是
注意,要用四元数来描述旋转,四元数必须是单位四元数.单位四元数的范数为1,范数定义为
在MATLAB中有多种构造四元数的方法,例如:
q1 =四元数(1、2、3、4)
Q1 =四元数1 + 2i + 3J + 4K
四元数数组可以用同样的方法来制作:
四元数([1 10;-1 1], [2 20;-2 2], [3 30;-3 3], [4 40;4 4])
Ans = 2x2四元数数组1 + 2i + 3j + 4k 10 + 20i + 30j + 40k -1 - 2i - 3j - 4k 1 + 2i + 3j + 4k
有四列的数组也可以用来构造四元数,每一列表示四元数的一部分:
魔法qmgk =四元数((4))
qmgk = 4x1四元数阵列16 + 2i + 3j + 13k 5 + 11i + 10j + 8k 9 + 7i + 6j + 12k 4 + 14i + 15j + 1k
可以像其他数组一样索引和操作四分之一:
qmgk (3)
ans =四元数9 + 7i + 6j + 12k
重塑(QMGK,2,2)
Ans = 2x2四元数数组16 + 2i + 3j + 13k 9 + 7i + 6j + 12k 5 + 11i + 10j + 8k 4 + 14i + 15j + 1k
[q1;第一季度)
Ans = 2x1四元数数组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
通过问
相当于.
p / q
ANS =四元数0.6 + 2.2667i + 0.5333J - 0.13333K
左部问
通过p
相当于.
p。\问
Ans =四元数0.10345 + 0.2069i + 0j - 0.34483k
四元数的共轭是通过对每一个非实数部分求负而形成的,类似于复数的共轭:
结合(p)
Ans =四元数-5 - 6i + 7j - 8k
四元数可以在MATLAB中归一化:
pnormed =正常化(p)
pnormmed =四元数-0.37905 + 0.45486i - 0.53067j + 0.60648k
规范(pnormed)
ans = 1
四元数可用于在静态参考框架中旋转点,或者旋转参考框架本身。的rotatepoint
函数旋转一个点使用四元数q通过下列方程:
在哪里是
和表明四元数接合。注意上面的四元数乘法会得到一个实数部分的四元数,,等于0。的,,部分结果由旋转后的点(,,).
考虑上面的点旋转的例子。点(0.7,0.5)绕z轴旋转30度。在三维空间中,这个点的z坐标为0z。使用轴-角公式,可以用[0 0 1]作为旋转轴构造四元数。
ang =函数(30);Q =四元数(cos(ang/2), 0,0, sin(ang/2))Pt = [0.7, 0.5, 0];% z坐标在X-Y平面上为0ptrot = rotatepoint(q,pt)
Ptrot = 0.3562 0.7830 0
类似地,旋转框架
函数取四元数和点来计算
同样,上述四元数乘法导致0个实物的四元数。这 (,,)结果的一部分构成该点的坐标在新的旋转的参考系中。使用四元数
班级:
Ptframerot = rotateframe(q, pt)
Ptframerot = 0.8562 0.0830 0
由于点和坐标系旋转方程的对称性,四元数及其共轭具有相反的作用。通过共轭旋转“解除”旋转。
旋转框架(结合(q),ptframerot)
ans = 0.7000 0.5000 0
由于方程的对称性,这段代码执行相同的旋转。
rotatepoint (q, ptframerot)
ans = 0.7000 0.5000 0
通常使用替代装置来描述旋转和取向:欧拉角,旋转矩阵和/或旋转矢量。所有这些都在matlab中与季圈互操作。
欧拉角经常使用,因为它们很容易解释。考虑围绕Z轴旋转30度旋转30度的框架,然后围绕y轴20度,然后围绕x轴围绕-50度。请注意,始终,每个轴周围的旋转是固有的:每个后续旋转都在新创建的一组轴上。换句话说,第二旋转是由第一旋转产生的“新”y轴,而不是在原始y轴周围产生。
图;euld = [30 20 -50];Dr.Draweulerrotation(GCA,Euld);
为了框架旋转的目的,从这些欧拉角度构建四元度,使用四元数
构造函数。因为旋转的顺序是先绕z轴旋转,然后绕新的y轴旋转,最后绕新的x轴旋转,所以使用“ZYX股票”
旗帜。
qeul =四元数(函数(euld),'euler',“ZYX股票”,“帧”)
q =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
的'euler'
标志指示第一个参数以弧度为单位。如果参数是度数,则使用“eulerd”
旗帜。
qeuld =四元数(euld,“eulerd”,“ZYX股票”,“帧”)
qeud =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
要换算回欧拉角:
rad2deg(欧拉(qeul,“ZYX股票”,“帧”))
Ans = 30.000 20.0000 -50.000
同样,eulerd
方法可以使用。
eulerd(Qeul,“ZYX股票”,“帧”)
Ans = 30.000 20.0000 -50.000
或者,同样的旋转可以表示为一个旋转矩阵:
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 000 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
旋转向量是一种交替的、紧凑的旋转封装。旋转矢量是一个简单的三元素矢量,它表示单位长度的旋转轴,按旋转角度(以弧度为单位)放大。不存在与旋转向量相关的帧数或点数。转换为旋转矢量:
房车= rotvec (qeul)
Rv = -0.9349 0.0935 0.6375
转换为四元数:
四元数(房车,'rotvec')
Ans =四元数0.84313 - 0.44275i + 0.044296j + 0.30189k
四元数比欧拉角的一个优点是没有不连续。欧拉角有不连续点,它的变化取决于所使用的惯例。的经销
函数比较两种不同四元数的旋转效果。结果是一个范围为0到π
.考虑由欧拉角构建的两季度:
Eul1 = [0,10, 0];Eul2 = [0,15, 0];qdist1 =四元数(函数(eul1),'euler',“ZYX股票”,“帧”);qdist2 =四元数(函数(eul2),'euler',“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 =四元数(函数(eul3),'euler',“ZYX股票”,“帧”);qdist4 =四元数(函数(eul4),'euler',“ZYX股票”,“帧”);
虽然eul3
和eul4
表示几乎相同的方向,简单的欧拉角减法给人的印象是这两个方向相差很远。
Euldiff = eul4 - eul3
Euldiff = 180 0 180
使用经销
四元数上的功能表明,这些旋转中只有两度差异:
= rad2deg(dist(qdist3, qdist4)))
euldist = 2.0000
四元数及其负数表示相同的旋转。这在减四元数时并不明显,但是经销
功能明确。
Qpos =四元数(-cos(/4), 0,0, sin(/4))
Qpos =四元数-0.70711 + 0i + 0j + 0.70711k
qneg = qpo
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 prod cat四元数类隐含的isrow rdivide compact isscalar reconj isvector rotateframe ctranspose ldivide rotatepoint disp length rotmat dist log rotvec double meanrot rotvecd eq - single euler mtimes size eulerd slerp ne times horzcat范数转置iscolumn normalize uminus isempty nummelvalidateattributes isequal parts vertcat isequaln permute isfinite plus isinf power静态方法:1 0