主要内容

旋转,方向和四元数

此示例评论了三维旋转中的概念以及数量如何用于描述方向和旋转。四元数是超拷贝数的偏斜场。它们在航空航天,计算机图形和虚拟现实中找到了应用。在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);

四元数

四元数是数字的形式

$ textbf{i} + $ textbf{j} + $ textbf{k}$

在哪里

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

$ a,b,c,$$ d $是真实的数字。在这个例子的其余部分,四个数字$ a,b,c,$$ d $被称为部分四元数。

旋转和方向的四元数

轴和旋转角度被封装在四元数部分中。为单位矢量旋转轴[xyz,以及旋转角度$ \ Alpha $,描述这个旋转的四元数是

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

注意,要用四元数来描述旋转,四元数必须是单位四元数.单位四元数的范数为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 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

四元数的数学

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

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

这意味着四元数的乘法是不可交换的。也就是说,$ pq \ neq $对于四元数$ 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.5333J  -  0.13333K

左部通过p相当于美元$ p ^{1}问

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函数旋转一个点$v = (v_x, v_y, v_z)$使用四元数q通过下列方程:

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

在哪里美元v_{皮疹}$

$$ v_ {quat} = 0 + v_x \ textbf {i} + v_y \ textbf {j} + v_z \ textbf {k} $$

$ p ^ * $表明四元数接合。注意上面的四元数乘法会得到一个实数部分的四元数,$ a $,等于0。的$ b $$ C $,$ d $部分结果由旋转后的点($ b $$ C $$ d $).

考虑上面的点旋转的例子。点(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

类似地,旋转框架函数取四元数问美元和点五美元来计算

$$ p ^ * v_ {quat} p $$

同样,上述四元数乘法导致0个实物的四元数。这 ($ b $$ C $$ d $)结果的一部分构成该点的坐标五美元在新的旋转的参考系中。使用四元数班级:

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

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

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

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

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.

金宝app支持功能

四元数类可以有效地在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