这个例子评论概念在三维旋转和如何使用四元数来描述取向和旋转。四元数是一个倾斜的超复杂数字领域。他们发现应用在航空航天、计算机图形学和虚拟现实。在MATLAB®,四元数数学可以通过操作来表示四元数
类。
的HelperDrawRotation
类是用来说明这个例子的几个部分。
博士= HelperDrawRotation;
所有旋转3 d可以定义一个旋转轴和一个转动角轴。考虑一个茶壶的3 d图像在最左边的阴谋。茶壶在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 2/3 2/3)。
图;甘氨胆酸dr.draw3DOrientation (, (1/3 2/3 2/3), 30);
四元数的数字形式
在哪里
和和是实数。在这个例子中,剩下的四个数字和被称为部分四元数。
轴和旋转的角度是封装在四元数的部分。对于一个单位向量旋转轴(x,y,z),和旋转角度,这个旋转四元数描述
注意,使用四元数来描述一个旋转,四元数必须是单位四元数。一个单位四元数的标准是1,定义为标准
有各种各样的方法来构建一个四元数在MATLAB中,例如:
q1 =四元数(1、2、3、4)
q1 j =四元数1 + 2 + 3 + 4 k
四元数的数组可以以同样的方式:
四元数([1 10;1 1],[2 20;2 2],[3 30;3 3],[4 40;4 4])
ans = 2 x2四元数j数组1 + 2 + 3 + 4 k 10 + 20 + 30 j + 40 k 1 - 2 i - 3 j - j 4 k 1 + 2 + 3 + 4 k
与四列数组也可以用来构造四元数,每一列代表一个四元数的部分:
魔法qmgk =四元数((4))
qmgk = 4 x1四元数阵列16 + 2 + 3 j + 13 k 5 + 11 + 10 j + 8 k 9 + 7 + 6 j + 12 j k 4 + 14 + 15 + 1 k
四元数可以被索引和操作就像任何其他数组:
qmgk (3)
ans =四元数9 + 7 + 6 j + 12 k
重塑(qmgk 2 2)
ans = 2 x2四元数阵列16 + 2 + 3 j + 13 k 9 + 7 + 6 j + 12 k 5 + 11 + 10 j + 8 k 4 + 14 + 15 j + 1 k
[q1;第一季度)
ans = 2 x1四元数j数组1 + 2 + 3 + 4 j k 1 + 2 + 3 + 4 k
四元数定义良好的算术运算。复数加法和减法是相似的:部分添加/独立减去。乘法更复杂,因为早期的方程:
这意味着四元数的乘法是不可交换的。也就是说,对四元数和。然而,每一个四元数的乘法逆元,所以四元数可分为。数组的四元数
类可以加,减,乘,在MATLAB和分裂。
q =四元数(1、2、3、4);p =四元数(5、6、7、8);
除了
p + q
ans =四元数4 + 8 i - 4 j + 12 k
减法
p - q
ans =四元数6 + 4 i - 10 j + 4 k
乘法
p *
ans =四元数-28 - 56我j + 20 - 30 k
乘法按照相反的顺序(注意不同的结果)
q * p
ans =四元数-28 + 48 k i - 14 j - 44
正确的分工p
通过问
相当于。
p / q
ans =四元数0.6 + 2.2667 + 0.53333 j - 0.13333 k
左部问
通过p
相当于。
p。\问
ans =四元数0.10345 + 0.2069 + 0 j - 0.34483 k
的共轭四元数是由否定的每个非部分,类似于共轭复数:
连词(p)
ans =四元数5 - 6 + 7 j - 8 k
四元数在MATLAB可以归一化:
pnormed =正常化(p)
pnormed =四元数-0.37905 + 0.45486 - 0.53067 j + 0.60648 k
规范(pnormed)
ans = 1
四元数可用于旋转点在一个静态的参照系,或旋转参照系本身。的rotatepoint
函数旋转一个点使用四元数问通过以下方程:
在哪里是
和表明四元数接合。注意上面的四元数乘法的结果在一个四元数的实部,,等于0。的,,部分结果形成旋转点(,,)。
从上面考虑点旋转的例子。点(0.7,0.5)是在z轴旋转30度。在三维空间中这一点有一个0 z坐标。使用轴角公式,可以构建使用四元数(0 0 1)旋转轴。
ang =函数(30);q =四元数(cos (ang / 2), 0, 0, sin (ang / 2));pt = (0.7, 0.5, 0);% z坐标是0在x - y平面ptrot = rotatepoint (q, pt)
ptrot = 0.3562 - 0.7830 0
类似地,rotateframe
函数接受一个四元数和点来计算
再上面的四元数乘法结果与0四元数实部。(,,)的部分结果的坐标点在新、旋转参考系。使用四元数
类:
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度,然后在轴20度,-50度绕x轴。注意,在每个轴的旋转内在:每个后续新创建的组轴旋转。换句话说,第二是在“新”轴旋转由第一旋转,不是在原来的轴。
图;euld = (20 -50);甘氨胆酸dr.drawEulerRotation (euld);
从这些欧拉角来构建一个四元数为目的的坐标系旋转,使用四元数
构造函数。因为在z轴旋转的顺序是第一,然后在新的轴,最后围绕新轴,使用“ZYX股票”
国旗。
qeul =四元数(函数(euld),“欧拉”,“ZYX股票”,“帧”)
qeul =四元数0.84313 - 0.44275 + 0.044296 j + 0.30189 k
的“欧拉”
国旗表明,第一个参数是在弧度。如果参数是在度,使用“eulerd”
国旗。
qeuld =四元数(euld,“eulerd”,“ZYX股票”,“帧”)
qeuld =四元数0.84313 - 0.44275 + 0.044296 j + 0.30189 k
将回到欧拉角:
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.44275 + 0.044296 j + 0.30189 k
就像一个四元数可用于旋转点或框架,它可以转换成一个旋转矩阵(或组欧拉角)专门为旋转点或框架。点旋转的旋转矩阵的转置矩阵坐标系旋转。旋转表示之间的转换,它指定是必要的“点”
或“帧”
。
点的旋转矩阵旋转部分的例子是:
rotmatPoint = rotmat (q,“点”)
rotmatPoint = 0.8660 - -0.5000 0 0 0 0 0.8660 0.5000 1.0000
找到的位置旋转点,right-multiplyrotmatPoint
转置的数组pt
。
rotmatPoint * (pt)
ans = 0.3562 - 0.7830 0
坐标系的旋转矩阵旋转部分的例子是:
rotmatFrame = rotmat (q,“帧”)
rotmatFrame = 0.8660 - 0.5000 0 0 0 0 0.8660 -0.5000 1.0000
找点的位置旋转参考系,right-multiplyrotmatFrame
转置的数组pt
。
rotmatFrame * (pt)
ans = 0.8562 - 0.0830 0
旋转矢量是一个备用,紧凑的旋转封装。旋转向量是一个简单的三元素向量表示单位长度旋转轴比例增大的旋光角的弧度。没有frame-ness或point-ness旋转矢量。转换为旋转矢量:
房车= rotvec (qeul)
房车= -0.9349 0.0935 0.6375
转换为一个四元数:
四元数(房车,“rotvec”)
ans =四元数0.84313 - 0.44275 + 0.044296 j + 0.30189 k
四元数在欧拉角的一个优点是不连续的缺乏。欧拉角不连续,取决于所使用的约定。的经销
函数比较旋转由两个不同的四元数的影响。结果是一个数字0到的范围π
。考虑两个四元数由欧拉角:
eul1 = [0, 10 0];eul2 =[0] 0, 15日;qdist1 =四元数(函数(eul1),“欧拉”,“ZYX股票”,“帧”);qdist2 =四元数(函数(eul2),“欧拉”,“ZYX股票”,“帧”);
减去欧拉角中,您可以看到没有绕z轴或轴旋转。
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),“欧拉”,“ZYX股票”,“帧”);qdist4 =四元数(函数(eul4),“欧拉”,“ZYX股票”,“帧”);
虽然eul3
和eul4
代表了几乎相同的取向,简单的欧拉角减给人的印象,这两个方向相距很远。
euldiff = eul4 - eul3
euldiff = 180 0 180
使用经销
函数的四元数显示,只有在这些旋转2摄氏度的区别:
euldist = rad2deg (dist (qdist3 qdist4))
euldist = 2.0000
一个四元数和其负面表示相同的旋转。这是四元数相减后的不明显,但是经销
功能很清楚。
qpo =四元数(cos(π/ 4),0,0,sin(π/ 4))
qpo =四元数-0.70711 + 0 + 0 j + 0.70711 k
qneg = qpo
qneg =四元数0.70711 + 0 + 0 j - 0.70711 k
qdiff = qpo - qneg
qdiff =四元数-1.4142 + 0 + 0 j + 1.4142 k
dist (qpo qneg)
ans = 0
的四元数
类可以让你有效地描述旋转并在MATLAB取向。quaternion-supported函数的完整列表可金宝app以发现的方法
功能:
方法(“四元数”)
类四元数的方法:angvel ismatrix刺激猫isnan四元数classUnderlying isrow rdivide紧凑isscalar重塑连词isvector rotateframe ctranspose ldivide rotatepoint disp长度rotmat dist日志rotvec双meanrot rotvecd eq -单欧拉mtimes大小eulerd ndims slerp exp ne乘以horzcat规范转置iscolumn正常化uminus isempty元素个数validateattributes isequal部分vertcat isequaln排列isfinite + isinf权力静态方法:0