主要内容

旋转、方向和四元数

这个例子回顾了三维旋转中的概念,以及如何使用四元数来描述方向和旋转。四元数是超复数的歪斜场。它们已经在航空航天、计算机图形学和虚拟现实领域得到了应用。在MATLAB®中,四元数数学可以通过操纵四元数类。

HelperDrawRotation类用于演示此示例的几个部分。

dr = HelperDrawRotation;

三维旋转

三维中所有的旋转都可以用一个旋转轴和围绕该轴的旋转角度来定义。考虑最左边的一个茶壶的3d图像。在第二个图中,茶壶围绕z轴旋转45度。第三个图显示了更复杂的绕轴[10 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], 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 $被称为部分四元数的。

旋转和方向的四元数

轴和旋转角度被封装在四元数部分中。对于单位矢量旋转轴[xyz]和旋转角度\α美元,描述此旋转的四元数为

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

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

$$norm(q) = \√{a²+ b²+ c²+ d²}$$

在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

四列数组也可以用来构造四元数,每一列表示一个四元数部分:

四元数(魔术(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

四元数的数学

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

$ $ 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}问

p。\问
Ans =四元数0.10345 + 0.2069i + 0j - 0.34483k

四元数的共轭是通过对每一个非实数部分求负来形成的,类似于复数的共轭:

连词(p)
Ans =四元数-5 - 6i + 7j - 8k

四元数可以在MATLAB中归一化:

pnormmed =正常化(p)
pnormmed =四元数-0.37905 + 0.45486i - 0.53067j + 0.60648k
规范(pnormed)
Ans = 1

四元数的点和帧旋转

四元数可用于旋转静态参照系中的点,或旋转参照系本身。的rotatepoint函数旋转一个点$v = (v_x, v_y, v_z)$使用四元数问美元通过以下公式:

$$q v_{quat} q^*$$

在哪里美元v_{皮疹}$

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

而且问^ * $美元表示四元数共轭。注意,上面的四元数乘法的结果是带有实数部分的四元数,一个美元等于0。的b美元美元加元,$ d $由旋转后的点(b美元美元加元$ d $).

考虑上面的点旋转的例子。点(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];% z坐标在X-Y平面上为0Ptrot =旋转点(q, pt)
Ptrot = 0.3562 0.7830 0

类似地,rotateframe函数接受四元数问美元和点五美元来计算

$$q^* v_{quat} q$$

同样,上述四元数相乘的结果是实部为0的四元数。(b美元美元加元$ d $)结果的各部分构成该点的坐标五美元在新的,旋转的参考系中。使用四元数类:

Ptframerot = rotateframe(q, pt)
Ptframerot = 0.8562 0.0830 0

四元数和它的共轭有相反的影响,因为对称在点和框架旋转方程。通过共轭旋转“取消”旋转。

rotateframe(连词(q), ptframerot)
Ans = 0.7000 0.5000 0

由于方程的对称性,这段代码执行相同的旋转。

rotatepoint (q, ptframerot)
Ans = 0.7000 0.5000 0

其他旋转表示

旋转和方向通常使用交替的方法来描述:欧拉角、旋转矩阵和/或旋转向量。所有这些都可以在MATLAB中与四元数互操作。

欧拉角经常被使用,因为它易于解释。考虑一个参考系绕z轴旋转30度,然后绕y轴旋转20度,然后绕x轴旋转-50度。注意这里和整个过程中,围绕每个轴的旋转是内在:每个后续旋转都围绕新创建的轴集。换句话说,第二次旋转是围绕第一次旋转创建的“新”y轴,而不是围绕原始y轴。

图;Euld = [30 20 -50];甘氨胆酸dr.drawEulerRotation (euld);

若要从这些欧拉角构建用于帧旋转的四元数,请使用四元数构造函数。由于旋转的顺序是首先围绕z轴,然后围绕新的y轴,最后围绕新的x轴,使用“ZYX股票”国旗。

四元数(deg2rad(euld),“欧拉”“ZYX股票”“帧”
奎尔=四元数0.84313 - 0.44275i + 0.044296j + 0.30189k

“欧拉”Flag表示第一个参数以弧度为单位。如果参数是度数,则使用“eulerd”国旗。

四元数=四元数“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

或者,同样的旋转也可以表示为旋转矩阵:

rat = rotmat(qeul,“帧”
马币= 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 000 1.0000

要在旋转的参考系中找到点的位置,右乘rotmatFrame通过转置数组pt

rotmatFrame * (pt')
Ans = 0.8562 0.0830 0

旋转向量是交替的、紧凑的旋转封装。旋转向量是一个简单的三元素向量,它表示单位长度的旋转轴按弧度旋转角度缩放。旋转矢量没有框架性或点性。转换为旋转向量:

Rv = 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 =四元数(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 =四元数(deg2rad(eul4),“欧拉”“ZYX股票”“帧”);

虽然eul3而且eul4表示几乎相同的方向,简单的欧拉角减法给人的印象是这两个方向相隔很远。

Euldiff = eul4 - eul3
Euldiff = 180 0 180

使用经销四元数上的函数表明,在这些旋转中只有2度的差异:

Euldist = rad2deg(dist(qdist3, qdist4))
欧拉主义者= 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.4142 2k
dist (qpo qneg)
Ans = 0

支持功能

四元数类让你在MATLAB中有效地描述旋转和方向。四元数支持的函数的完整列表可以使用方法功能:

方法(“四元数”
类四元数方法:angvel ismatrix prod cat isnan四元数class下面的isrow rdivide compact isscalar conj isvector rotateframe c转置ldivide rotatepoint disp length rotmat dist log rotvec double meanrot rotvecd eq minus single euler mtimes size eulerd ndims slerp exp ne times horzcat norm转置iscolumn normalize uminus是空数字validateattributes是等量vertcat isequal permute isfinite plus isinf power静态方法:1 0
Baidu
map