旋转,方向和四元数

这个例子回顾概念,三维旋转和四元如何被用来描述取向和旋转。四元数超复数的倾斜场。他们发现,在航空航天,计算机图形学和虚拟现实应用。在MATLAB®,四元数数学可以通过操纵来表示四元数类。

HelperDrawRotation类是用来说明本实施例的若干部分。

博士= 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);

取向

取向是指物体相对于参考的帧的的角位移。典型地,取向由引起从起始取向这个角位移的旋转说明。在此示例中,取向被定义为发生在母参考帧中的量,以一个子帧参考的旋转。取向通常被给定为一个四元数,旋转矩阵,设置欧拉角,或者旋转矢量。孩子参照系是相对父框架旋转:考虑定向框架的旋转是有用的。

考虑一个例子,其中子参考系围绕向量旋转了30度[1/3 /3 /3]。

图;dr.draw3DOrientation(GCA,[1/3 2/3 2/3],30);

四元数

四元数是表单的数字

$$a + b\textbf{i} + c\textbf{j} + d\textbf{k}$$

在哪里

$ $ i ^ 2 = j ^ 2 = k ^ 2 = ijk = 1美元美元

$ A,B,C,$$ d $是实数。在这个例子中的休息,四位数字$ A,B,C,$$ d $被称为部分的四元数。

旋转和方向的四元数

轴和旋转角度封装在四元数部件中。对于单位矢量旋转轴[x,y,z,以及旋转角度$ \ $阿尔法,描述该旋转的四元数为

$ $ \因为\离开(\压裂{\α}{2}\右)+ & # xA;罪\ \离开(\压裂{\α}{2}\)\离开(x \ textbf{我}+ y \ textbf {j} & # xA; + z \ textbf {k} \右)$ $

注意,要使用四元数描述旋转,四元数必须是a单位四元数。单位四元数的范数为1,其中范数定义为

$$范数(Q)= \ SQRT {A ^ 2 + B ^ 2 + C ^ 2 + d ^ 2} $$

在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

四元数的数学

四元数有定义良好的算术运算。加减法类似于复数:加减部分是独立的。乘法更复杂,因为前面的方程:

$ $ i ^ 2 = j ^ 2 = k ^ 2 = ijk = 1美元美元

这意味着四元数的乘法不是可交换的。也就是说,$ PQ \ NEQ QP $对于四元$ p $问美元。然而,每一个四元数具有乘法逆,所以四元数可以划分。的数组四元数类可以在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 (^ {1})

p / q
ANS =四元数0.6 + 2.2667i + 0.53333j  -  0.13333k

左部通过p相当于$ P ^ { -  1} $ q

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功能旋转点$v = (v_x, v_y, v_z通过以下方程使用四元数q:

$ $ p v_ p{皮疹}^ * $ $

在哪里美元v_{皮疹}$

$ $ v_{皮疹}= 0 + v_x \ textbf{我}+ v_y \ textbf {j} + v_z \ textbf {k} $ $

$ P ^ * $表明四元数接合。注意以上四元数乘法的结果是一个实部四元数,$ A $等于0。的$ B $,$ C $,$ d $旋转后的部分结果($ B $,$ C $,$ d $)。

以上面的点旋转为例。点(0.7,0.5)绕z轴旋转了30度。在三维空间中,这个点的z坐标为0。利用轴角公式,可以用[0 0 1]作为旋转轴来构造四元数。

ang =函数(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函数接受一个四元数问美元和点五美元来计算

$$ P 1 * V_ {季铵盐} p $$

再次上述四元数相乘的结果以四元数与0实部。该($ B $,$ C $,$ d $结果的各部分构成该点的坐标五美元在新的,旋转的参照系中。使用四元数类:

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 (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

旋转矢量是一种替代的、紧凑的旋转封装。一个旋转向量是一个简单的三元素向量,它表示单位长度的旋转轴,旋转角度按弧度放大。不存在与旋转向量相关的帧度或点度。转换为旋转矢量:

房车= 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 =四元数(函数(eul1),“欧拉”,“ZYX股票”,“帧”);qdist2 =四元数(函数(eul2),“欧拉”,“ZYX股票”,“帧”);

减去欧拉角,你会发现在z轴或x轴上没有旋转。

eul2——eul1
ans = 0 5 0

这两个旋转的差是绕y轴5度。的经销也显示了不同之处。

rad2deg (dist (qdist1 qdist2))
ans = 5.0000

为欧拉角如eul1eul2中,计算的角距离是微不足道的。一个更复杂的例子中,其跨越的欧拉角的不连续,是:

eul3 = [0,89, 0];eul4 = [180, 89, 180];qdist3 =四元数(函数(eul3),“欧拉”,“ZYX股票”,“帧”);qdist4 =四元数(函数(eul4),“欧拉”,“ZYX股票”,“帧”);

虽然eul3eul4代表几乎相同的方向,简单的欧拉角减法给人的印象是这两个方向都相距甚远。

euldiff = eul4 - eul3
euldiff = 180 0 180

使用经销在四元数表明,只有在这些旋转两度差函数:

euldist = rad2deg(dist(qdist3, qdist4))
euldist = 2.0000

四元数和它的负数代表相同的旋转。这在减去四元数时并不明显,但是经销功能使得它清除。

qpos =四元数(-cos(pi/4), 0,0, sin(pi/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

万博1manbetx支持功能

四元数类允许您在MATLAB中有效地描述旋转和方向。方法可以找到受四元数支持的函数的完整列表万博1manbetx方法功能:

方法(“四元数”)
类四元数的方法:猫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