主要内容

旋转、方向和四元数

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

辅助绘图旋转类用于演示本示例的几个部分。

Dr = HelperDrawotation;

三维旋转

三维中的所有旋转都可以由旋转轴和围绕该轴的旋转角度来定义。考虑最左边的一个茶壶的三维图像。茶壶在第二个图中绕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);

方向

方向是指物体相对于参照系的角位移。通常情况下,方向是由从起始方向引起角位移的旋转来描述的。在这个例子中,方向被定义为在父参照系中取一个量到子参照系的旋转。方向通常是四元数,旋转矩阵,欧拉角集合,或旋转向量。将方向看作是坐标系旋转是很有用的:子坐标系相对于父坐标系进行旋转。

考虑一个例子,其中子参考帧围绕矢量旋转30度[1/3 2/3 2/3]。

图;dr.draw3DOrientation(gca, [1,2,3 /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.]和旋转角度\α美元,描述此旋转的四元数是

$$\cos\left(\frac{\alpha}{2}\right)+
\sin\left(\frac{\alpha}{2}\right)\left(x\textbf{i}+y\textbf{j}
;+z\textbf{k}\right)$$

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

$ q =√{a^2 + b^2 + c^2 + d^2}$

在MATLAB中构造四元数有多种方法,例如:

q1 =四元数(1、2、3、4)
Q1 =四元数1 + 2i + 3j + 4k

可以以同样的方式制作四季阵列:

四元数([110-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+13k9+7i+6j+12k5+11i+10j+8k4+14i+15j+1k
[q1;第一季度)
ans=2x1四元数数组1+2i+3j+4k 1+2i+3j+4k

四元数学

四元数具有明确定义的算术运算。加法和减法类似于复数:单独添加/减去部分。乘法是更复杂的,因为早期的等式:

$$ i ^ 2 = j ^ 2 = k ^ 2 = ijk = -1 $$

这意味着四元数的乘法不是可交换的。就是,pq \ neq qp美元对四元数$ p $.$ q $.然而,每一个四元数都有一个乘逆,所以四元数可以被除。数组的四元素可以添加,减去,乘以和在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*q
ans = quaternion -28  -  56i  -  30j + 20k

以相反的顺序乘法(注意结果)

q*p
ans=四元数-28+48i-14j-44k

正确的分工P.经过问:相当于$p(q^{-1})$

P./Q.
Ans =四元数0.6 + 2.2667i + 0.53333j - 0.13333k

左除法问:经过P.相当于美元$ p ^{1}问

p、 \q
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

点和帧旋转与四元数

四元数可以用来旋转静态参照系中的点,或者旋转参照系本身。这旋转点函数旋转一个点$v=(v_x,v_y,v_z)$通过以下等式使用四元数q:

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

哪里$ v_ {quat} $

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

$ p ^ * $表示四元缀合。注意上述四元数乘法导致与实际部分的四元数,一个美元,等于0.b美元美元加元,及$ d $结果的一部分形成旋转点(b美元美元加元$ d $)。

考虑从上面点旋转的例子。点(0.7,0.5)绕Z轴旋转30度。在三维中,该点的Z坐标为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 = rotatepoint(q, pt)
Ptrot = 0.3562 0.7830 0

同样,rotateframe函数采用四元数$ q $和点$v$计算

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

同样,上述四元数乘法得到实数部分为0的四元数。(b美元美元加元$ d $)结果的部分形成了该点的坐标$v$在新的旋转的参考系中。使用四元素类:

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

由于点和框架旋转方程中的对称性,四元数及其缀合物具有相反的效果。通过共轭“撤消”旋转旋转。

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

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

旋转点(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'国旗。

qeul=四元数(deg2rad(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

转换回四元数是类似的:

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

旋转点*(pt')
Ans = 0.3562 0.7830 0

本例中框架旋转部分的旋转矩阵为:

rotmatFrame = rotmat (q,'框架'
rotmatFrame = 0.8660 0.5000 0 -0.5000 0.8660 000 1.0000

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

rotmatFrame * (pt)
Ans = 0.8562 0.0830 0

旋转矢量是替代,紧凑的旋转封装。旋转矢量仅仅是一个三元素矢量,表示通过弧度中的旋转角度缩放的单位长度旋转轴线。没有与旋转向量相关联的帧 - 状态或点NESS。转换为旋转向量:

RV = Rotvec(Qeul)
RV = -0.9349 0.0935 0.6375

转换为四元数:

四元数(房车,“rotvec”
ans=四元数0.84313-0.44275i+0.044296j+0.30189k

距离

与欧拉角相比,四元数的一个优点是缺少不连续性。欧拉角具有不连续性,这取决于所使用的约定。这个距离功能比较了两个不同的四元数的旋转效果。结果是0到0的数字圆周率.考虑两个由欧拉角构成的四元数:

Eul1 = [0,10,0];Eul2 = [0,15,0];qdist1 =四元数(Deg2rad(Eul1),“欧拉”'Zyx''框架');QDIST2 =四元数(DEG2RAD(EUL2),“欧拉”'Zyx''框架');

减去Euler角度,可以看到没有绕Z轴或X轴旋转。

eul2-eul1
ans = 0 5 0

这两次旋转之间的差值是围绕Y轴旋转五度。这个距离表现出差异。

rad2deg(区(qdist1、qdist2))
ans = 5.0000

对于欧拉角eul1eul2,计算角度距离是很简单的。一个更复杂的例子,跨越了欧拉角间断,是:

Eul3 = [0,89,0];Eul4 = [180,89,180];QDIST3 =四元数(DEG2RAD(EUL3),“欧拉”'Zyx''框架'); qdist4=四元数(deg2rad(eul4),“欧拉”'Zyx''框架');

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

euldiff=eul4-eul3
Euldiff = 180 0 180

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

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

四元数及其负代表相同的旋转。从减去四季度并不明显,但是距离函数说明了这一点。

QPOS =四元数(-COS(PI / 4),0,0,SIN(PI / 4))
QPOS = QuaterNion -0.70711 + 0i + 0j + 0.70711k
qneg = -qpos.
QNEG =四元数0.70711 + 0i + 0J  -  0.70711K
Qdiff = qpos - qneg
qdiff = quaternion -1.4142 + 0i + 0j + 1.4142k
地区(qpos、qneg)
ans = 0

金宝app支持函数

四元素类允许您在MATLAB中有效地描述旋转和方向。支持四元数的函数的完整列表可以通过金宝app方法功能:

方法('四元碘'
类四元数的方法:angvel ismatrix prod cat isnan四元数类基础为Row rdivide compact Iscalar整形conj Is向量旋转名称CtrTranspose ldivide旋转点显示长度rotmat dist log rotvec双平均rotvec eq减去单euler mtimes大小eulerd ndims slerp exp ne乘以horzcat范数转置列规格化uminus isempty numel验证属性等位零件顶点CAT等位置换为有限加isinf幂静态方法:1 0