按照zxz顺序的动态欧拉角30度,60度和45度,对应xyz顺序的静态类加载顺序欧拉角的值是多少

前言:本人也就英语4级水平,由于本篇中存在大量学术词汇,翻译时必然会有不当之处,原文可以在下面的链接中找到,具体意义各位可以自行斟酌
标红的部分是已发现存疑的翻译,也请各位指正。
& 欧拉角是由Lenhard Euler引入的,用于描述刚体方向的三个角,在3维欧几里得空间中描述这样一个方向,需要三个参数。它们(这种方向)可以多种形式给出,
欧拉角便是它们中的一种; 在中,你可以找到其它的描述方式. 欧拉角也可以用于描述一个参照系&(通常是一个坐标系)
和另一个参照系之间的位置关系. 这三个角通常被定义为&,&,&,
或者&,&,&.
& 欧拉角代表一系列的三维基本旋转,&也就是围绕一个坐标系的各轴的一系列旋转。例如,首先绕Z轴旋转一个,最后再绕Z轴来一个
固定坐标系中的轴的旋转,也可以是一个
Proper Euler angles&(z-x-z, x-y-x, y-z-y, z-y-z, x-z-x, y-x-y)Tait–Bryan angles&(x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z).
Tait–Bryan 角也被称作 万向节角(Cardan
angles), 航海角(nautical angles),前进方向(heading),
海拔(elevation), 和 倾斜(bank)&或 偏航(yaw),
这个方向可以被想成从一个初始的方向,旋转到其确切位置的方向。如下图中描述,原始的参考系的坐标轴被定义为x,y,z,旋转后的坐标系
的坐标轴被定义为X,Y,.在几何和物理中,被旋转的坐标系通常被想象成严格附着在一个刚体上。因此,它被称为一个“本地”坐标系,这也意味着
它既代表这个刚体的位置,也代表这个刚体的方向。
欧拉角的几何定义是基于上面提及的(原始的和经过旋转的)的参考系的坐标轴和一个附加的、被称作
交轨线 的轴做出的。
交轨线(N)是xy和XY坐标平面相交处的一条线。换句话说,这条线,穿过这两个坐标系原点,并且垂直于zZ平面,这三个
欧拉角被如下定义:
x轴和N轴之间的角度。β&(or&)
z轴和Z轴之间的角度。γ&(or&)
N轴和X轴之间的角度。
上面的定义含义如下
α&代表绕z轴的旋转,β&代表绕N轴的旋转,γ&代表绕Z轴的旋转.
如果β是0, 就没有绕N轴的旋转.
因此Z轴与z轴重合,&α&和&γ&代表绕同一个轴(z)的旋转,
最终的方向可以通过一个单一的绕z轴的旋转获得,这个旋转角度等于 α+γ.
经过旋转的参考系XYZ可以被想象成一个在经过欧拉角旋转之前原本与xyz对齐。
x-y-z, or&x0-y0-z0&(初始转改)x’-y’-z’, or&x1-y1-z1&(经过第一次旋转)x″-y″-z″, or&x2-y2-z2&(经过第二次旋转)X-Y-Z, or&x3-y3-z3&(经过第三次旋转的最终状态)
代表绕z轴的旋转β&(or&)
代表绕x’轴的旋转,γ&(or&)
代表绕&z″轴的旋转.
有6种为原始欧拉角选择旋转轴的方式。下面中的 1 和 6是相同的。可供选择的方式是
z-x’-z″&(内旋) 或&z-x-z&(外旋)x-y’-x″&(内旋)
或&x-y-x&(外旋)y-z’-y″&(内旋)或&y-z-y&(外旋)z-y’-z″&(内旋)或&z-y-z&(外旋)x-z’-x″&(内旋)或&x-z-x&(外旋)y-x’-y″&(内旋)或&y-x-y&(外旋)
欧拉角的定义必须基于两个相同手参考系。
标志和范围
旋转角通常根据右手坐标系进行定义。换句话说,向坐标轴的正方向看去时,一个顺时针的旋转的角度是正值,逆时针时的旋转的角度是负值。
左手坐标系的约定一般很少采用。
关于阈值:
&&对于α&和&γ,
一个合法的范围可能如:&[-π, π].
& 对于&β,
范围包含(但是不能说是).
例如可以是&[0, π]&或者[-π/2, π/2].&
角&α,&β&和&γ&一般都是单独取值的,有一种例外情况,那就是xy平面和XY平面重合的情况,z轴和Z轴拥有相同的方向或者相反的方向。
实际上,如果z轴和Z轴相同,β&=&0
并且 只有(α&+&γ)是一个特殊的定义(不是两个独立的值),并且,相似的,如果z轴和Z轴如果是方向相反,
β&=&π和&(α&-&γ)
是个特殊的定义(不是两个独立的值)。这种情况在应用中被称作“万向节锁”。
获取一个给定参考系的欧拉角最快的方式是 把给出的三个向量写到矩阵中并且与给定的矩阵对比(相关矩阵稍后会在表格中列出)
所以欧拉角是可以被计算出来的,不过,我们可以使用几何推导而不用使用矩阵代数也可以计算出相同的结果,假设一个用单位向量定义的参考系(X,Y,Z)就像下面的图表中
可以看出:
由于是单位向量在双重投影,所以有
相应的也可以类似的得出,
先向z轴和交轨线构成的平面进行投影,因为Y轴和这个平面的角度为且,可以导出:
最后可用反cosine函数可得
有趣的是反consine函数都可以获得两个可能的值,从几何的角度来看,只有一个答案才是合法的
当欧拉角被定义成一系列的旋转,所有的答案都可能是合法的,但是但是只有一个是符合旋转顺序的。这是因为如果旋转顺序不事先确定的话,得到结果参考系
的旋转序列并不是唯一的。
为了计算,使用atan2(y,x)去表示角可能会更有用。
Tait–Bryan angles.&z-y′-x″&sequence
(&N&coincides
(Tail-Bryan角。z-y'-x''顺序,
序列(内旋; N 与 y’重合))
欧拉角的第二种表达形式被叫做Tail-Bryan角,在通过Peter Guthrie Tail和Gerge H. Bryan努力之后,Tail-Bryan角的定义和表示与经典欧拉角的表示方法类似。
唯一的不同是 Tail-Bryan角 使用三个轴上的旋转角度去表示。(例如 x-y-z或者x-y'-z''),然而经典欧拉角的第一个旋转角度和第三个旋转角度都是围绕同一个轴的
例如(z-x-z,或者 z-x'-z'')。
这会产生一个不同于经典欧拉角中的交轨线。在经典欧拉角中,这个交轨线是两个相对应的笛卡尔平面的交线,(当欧拉角为0时,平行的两个笛卡尔平面,例如xy和XY平面)。
在第二种情况中Tait-Bryan角中,它是两个不对应的平面的交线(当欧拉角为0时,互相垂直的两个平面,例如:xy和YZ平面)。
基本旋转既可以围绕着原始未移动的坐标系进行(外旋),也可以围绕那些已经经过几次基本旋转的正在旋转的坐标系的轴进行(内旋)。
有6种旋转的顺序可供选择,分别是:
x-y’-z″&(内旋) or&x-y-z&(外旋)y-z’-x″&(内旋) or&y-z-x&(外旋)z-x’-y″&(内旋) or&z-x-y&(外旋)x-z’-y″&(内旋) or&x-z-y&(外旋)z-y’-x″&(内旋) or&z-y-x&(外旋):
此序列的内旋被叫做: 偏航(绕z旋转), 俯仰(绕y'旋转) 和 翻滚(绕x''旋转)&y-x’-z″&(内旋) or&y-x-z&(外旋)
可供选择的命名
泰特-布莱恩角中 z-y'-x''这个序列(内旋) 通常被叫做航海角,因为他们可以用来描述一艘船或者一架飞行棋的方向,或者可以叫做万向角,也可以把这几个
旋转叫做 heading(摆头),elevation(俯仰)和bank(倾斜),或者叫做 yaw(偏航),pith(俯仰)和roll(翻滚)。注意第二套叫法也被用在三个飞行器轴中
内旋是发生在正在旋转的坐标系中的坐标轴上的旋转
XYZ坐标系旋转,xyz坐标系静止不动,三个内旋可以使XYZ坐标系指向任何一个方向。欧拉角或者泰勒-布莱恩角中(α,&β,&γ)是这三个旋转的幅度
例如目标方向可以这样抵达:
XYZ&绕Z轴(初始时与z轴重合的那个轴)旋转角度α.
现在X&轴位于交轨线上.XYZ绕现在的X轴角度为β. Z轴现在已经位于其最终的位置, X轴还停留在交轨线上.XYZ绕新的Z轴角度为γ
上面提到的变量让我们可以总结出:
& & 三个基本旋转分别是绕着z,x',z''进行的。实际上这组旋转经常被叫做z-x'-z''序列。欧拉角和泰勒-布莱恩角中变量命名
一般都是这样的。有时这样的旋转序列也被叫做z-x-z,Z-X-Z,或者是3-1-3,但是这样命名容易与外旋产生分歧,所以有必要
指出是内旋还是外旋。
Any target orientation can be reached, starting from a known reference orientation, using a specific sequence of intrinsic rotations, whose magnitudes are the Euler angles of the target orientation. This example uses the&z-x′-z″sequence.
可以用旋转矩阵表达内旋,例如
如果使用左乘列向量表达这个旋转组合,结果是
用右乘横向量的表达式和这个是一样的。
外旋是用围绕固定坐标系xyz的坐标轴的旋转角度进行标识的。 xyz是固定不懂的,而XYZ旋转, 开始时XYZ和xyz是重合的,经过三个绕xyz轴的基本旋转
XYZ可以达到指定的方向。同样 欧拉角或泰勒-布莱恩角中的三个基本旋转的角度也用(α,&β,&γ进行表示
例如,最终旋转可以用下面的步骤进行表示:
XYZ坐标系绕z轴α. 现在X轴与x轴的角度为α.XYZ坐标系再绕x轴β. 现在Z轴与z轴的角度为β.XYZ第三次绕z轴旋转γ.
总的来说,上面过程中,这三个基本旋转是围绕z,x,z轴进行的。实际上 这个也经常被定义为z-x-z或者3-1-3,在欧拉角和泰勒-布莱恩角中都是这样命名的
一个用欧拉角表示的旋转 (α,β,&γ) = (-60°, 30°, 45°), &z-x’-z″序列&内旋
一个和上图相同的旋转 (γ, β, α) = (45°, 30°, -60°), z-x-z序列&外旋
Any extrinsic rotation is equivalent to&
用旋转矩阵可以表达外旋序列,例如
用左乘竖向量的方式可以表达为
右乘横向量的表达式与这个是一致的
Euler basic motions of the Earth. Intrinsic (green), Precession (blue) and Nutation (red)
欧拉基本移动是通过改变欧拉角中其中一个角,同时保持另外两个角不变而得到的。
欧拉旋转从来不会基于外部参考系,或基于相对旋转的参考系的旋转表示。
但是在某些混合使用的情况下,它们会组成一个混合轴的旋转系统。
如左图,第一个旋转角度使交轨线绕着外部的z轴进行旋转,第二个旋转角度是围着交轨线进行旋转的,第三个旋转角度是个围绕着在体内固定轴移动的内旋。(为何第三个被称为内旋?这里理解有误?)
这些旋转被称作 旋进 点头和内旋(自旋)。举个例子,一个陀螺,这个陀螺绕着自己的对称轴进行旋转,这个对应于他的内旋,同时它还绕着它的中轴进行旋转,这个就叫做旋进。最后,这个陀螺还会上下摆动,这个倾角就叫做它的点头角.这三个分别划分到不同的参考系中,都是一个旋转角。只有旋进是一个合法的旋转操作,并且通常只有旋进可以用一个基于空间的矩阵所表示。(翻译有问题?这个不太理解)
Left:&A three axes&z-x-z&&where the external frame and external axis&x&are
not shown and axes&Yare perpendicular to each gimbal ring.&Right:&A simple diagram showing the Euler angles and where the axes&Y&of intermediate frames are located.
我们假设有一系列的参考系,可以在之前移动的基础上分别只在一个角度上进行旋转, 类似一个万向节,这里会存在一个外部的固定参考系,一个最终参考系和两个在中间的被叫做“中间参考系”的参考系。这两个像悬浮环的、在中间的参考系可以让最终的参考系达到任何一个方向。
这样,每个欧拉旋转对应一个环,与剩下的环保持独立。
悬浮环表示中间参考系,他们也可以被静态的定义,分别在x,y,z轴上有向量i,j,k,在XYZ上有向量I,J,K,N在交轨线上,一些中间参考系可以用向量叉乘的形式进行定义如下:
初始状态: [i,j,k] (k&=&i&×&j)第一个参考系: [N,k&×&N,k]第二个参考系: [N,K&×&N,K]最终参考系: [I,J,K]
这些中间参考系和那些悬浮环是等价的,其中一个环转动,最终的方向便会产生变动。这证明了:
通过组合这三个旋转,原始参考系可以被旋转到与任何一个目标参考系.这些旋转角就是目标参考系的欧拉角.
翻译未完,后续会接着进行翻译,并对内容加深理解,修正文章中的错误翻译。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3617次
排名:千里之外
译文:14篇
(7)(2)(6)(1)1266人阅读
运动捕捉(4)
参考博客:
【Unity技巧】四元数(Quaternion)和旋转:
四元数与旋转:
三维转动的欧拉角和转轴转角参数相互转换的谢国芳公式:
静态定义:
描述定点转动刚体的位形需要三个独立坐标变量。描述定轴转动刚体的位形需要一个独立坐标变量,即转角。将定点运动的过程分解为三个相互独立的转角即欧拉角。
欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。欧拉角用来描述刚体在三维欧几里得空间的取向。对于三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。
&图1. 三个欧拉角(α,β,γ),蓝色的轴是xyz轴,红色的轴是XYZ坐标轴。绿色的线是交点线(N)。
zxz顺规的欧拉角的定义:
α是x-轴与交点线的夹角(0-2π)
β是z轴与Z轴之间的夹角(0-π,因为Z与z的夹角不可能大于180度)
γ是交点线与X-轴之间的夹角(0-2π)
对应于每一个取向,设定的一组欧拉角都是独特唯一的;除了某些例外:
两组欧拉角α,一个是0,一个是2π,而β和γ分别相等,则此两组欧拉角都描述同样的取向。
两组欧拉角的γ,一个是0,一个是2π,而α与β分别相等,则此;两组欧拉角都描述同样的取向。
动态定义:
有两种不同的动态定义。一种是绕着固定于刚体的坐标轴的三个旋转的复合。另一种是绕着实验室参考轴的三个旋转复合。注意XYZ坐标轴是旋转的刚体坐标轴,而xyz坐标轴是静止不动的实验室参考轴。
A) 绕着XYZ坐标轴旋转:最初,两个坐标系统xyz和XYZ的坐标轴都是重叠着的,开始绕着Z轴旋转α角度,然后绕着X旋转β角度,再绕Z轴旋转γ角度。
B) 绕着xyz坐标轴旋转:最初,两个坐标系统xyz和XYZ的坐标轴都是重叠着的,开始&&&&&&&& 先绕着z轴旋转γ角度,然后绕着x旋转α角度,最后绕着z轴旋转β。
对于图1 的一些解释和规范:
&&& 由定点O做出固定坐标系Oxyz和固定于刚体 的动坐标系OXYZ,以轴Oz与OZ为基本轴,以其垂直面Oxy和OXY为基本平面。
由Oz转动到OZ的角β称为章动角。平面zOZ的垂线(基本平面Oxy和OXY的交线)ON称为节线。由固定轴x到节线ON的角度α称旋进角;由节线到动轴OX的角γ称为自转角。
欧拉角的一个相关概念:万向节死锁(Gimbal Lock)简称万向节锁或者万向锁
产生原因是:三个万向节其中两个的轴发生重合,会失去一个自由度的情形。
导致的后果:由于万向锁的存在,欧拉角无法实现球面平滑插值。解决方法是使用四元数球面线性插值。
三个欧拉角是相互独立变化的,改变其中任一个不改变其它两个。确定了三个欧拉角在任意时刻的大小,也就确定了刚体在任意时刻的位形。
欧拉角描述的常用来描述物体相对于父坐标空间方位的方法。基本思想是将角位移分解为绕三个相互垂直轴的三个旋转组成的序列。对于三维空间中的一个坐标系,任何坐标系的去向都可以用三个欧拉角来表现,其中参考坐标系是静止不动的,又称为实验室坐标系。
xzx顺规的方法:初始坐标系XYZ可看做与参考坐标系xyz重合,之后先绕z轴旋转φ角度值,再绕x轴旋转θ角度值,最后绕z轴旋转ψ角度值。
ASF文件中有明确规定,应该都是xyz顺规方向。
欧拉角仅用三个角度值就可以表示方位信息,并且这三个数值的范围都是(0,2π)任取的。这两个特征是欧拉角独有的。
然而欧拉角两个致命缺点是:
(1)对于一个给定的方位存在多个欧拉角与之对应,称为“别名问题”
(2)由于欧拉角顺规的规定,欧拉角 的旋转一定要按照某个特定次序进行。等量的欧拉角变化可能引起完全不同的旋转变化结构。并且欧拉角可能导致自由度丧失,造成旋转不平衡问题,从而造成“万向锁”现象,导致抖动、路径错误等现象。
【扩展】欧拉运动学方程
角速度与欧拉角之间的关系推导:
设三个欧拉角分别为:旋进角(进动角) φ,章动角θ,自转角ψ。
在任意时刻角速度可分解为如下三个定轴转动角速度之和:
& & & & & & & & & & & & & & & & & & & & & & & & &&& & & & & &&&(1)&
四元数都是1、i、j、k的线性组合,一般可表示为d+ai+bj+ck(i*i=j*j=k*k=-1,ij=k、ji=-k、jk=i、kj=-i、ki=j、ik=-j),a,b,c,d都是实数。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维空间。
对于i,j,k本身的几何意义可以理解为一种旋转,其中i旋转代表X轴与Y轴相交平面中X轴正向向Y轴正向的旋转。J旋转代表Z轴与X轴相交平面中Z轴正向向X轴正向的旋转。K旋转代表Y轴与Z轴相交平面中Y轴正向向Z轴正向的旋转。
要把两个四元数相加,只需将相同类的系数加起来即可,就像复数一样。
两个四元数:
对于加法有:
对于乘法有:
四元数也可以描述为q=[w,v],其中V=(x,y,z)是矢量,w是标量,是四维空间中的矢量。
我们通常称这两个部分是四元数的实数部分和(三维)向量部分,那么两个四元数的乘积就可以表示为
如果交换乘积
如果向量部分外积为零,两个四元数的乘积就可以互换了
通过旋转轴和绕该轴旋转的角度可以构造一个四元数:
其中α是绕旋转轴旋转的角度,cos(βx),cos(βy),cos(βz)为方向轴在x,y,z方向的分量(由此确定了旋转轴)。
四元数的优点:
四元数表达式无奇点,角度计算的工作量较少,使误差减小,结果更加准确,其次能够避免“万向锁”问题,在插值方面有极大的优越性。最后,单位四元数可以表示三维空间中的一个转动。
三维空间中的旋转变化比二维的复杂。需要指定旋转角和旋转轴。若以坐标系的三个坐标轴xyz作为旋转轴,则点实际只是在垂直坐标轴的平面上做二维变换,可以用二维公式推出三维变换矩阵。规定,右手坐标系中,旋转正方向是右手螺旋方向,即从该轴正半轴向原点看是逆时针方向。
绕任一轴旋转公式(用v1(a1, b2, c2)和v2(a2, b2, c2)来表示旋转轴,θ表示旋转角度):
互相之间的转换
欧拉角到四元数的转换:
四元数到欧拉角的转换:
arctan和arcsin的结果是[-π/2,π/2],这并不能覆盖所有朝向(对于θ角[-π/2,π/2]的取值范围已经满足),因此需要用atan2代替arctan
【注】atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度。
旋转矩阵,欧拉角,四元数的比较
&&& 旋转矩阵,欧拉角,四元数主要用于:向量的旋转、坐标系之间的转换、角位移的计算、方位的平滑插值计算。
不同的方位表示方法适用于不同的情况:
1.&&&&&&欧拉角最容易使用。当需要为世界中的物体指定方位时,欧拉角能大大简化人机交互,包括直接键盘输入方位、在代码中指定方位(如为渲染设定摄像机)、在调试中测试。
2.&&&&&&如果需要在坐标系之间转换向量,就选择矩阵形式。另一种方法是用欧拉角作为方位的“主拷贝“,但同时维护一个旋转矩阵,当欧拉角发生改变时,矩阵也要同时进行更新。
3.&&&&&&当需要大量保存方位数据(如动画)时,就使用欧拉角或者四元数,欧拉角少占用25%内存,但是转换到矩阵慢。如果动画数据需要嵌套坐标系之间的连接,四元数可能是最好的选择。
4.&&&&&&平滑插值只能用四元数。用其它形式则必须转到四元数,插值完毕再转回去。
各方法比较
在坐标系间(物体和惯性)旋转点
不能(必须转换到矩阵)
不能(必须转换到矩阵)
连接或增量旋转
能,但是经常比四元数慢,小心矩阵蠕变的情况
能,比矩阵快
插值
能,但是容易遇到万向锁或者其他问题
Slerp提供了平滑插值
在内存或文件中存储
对给定方位的表达式是否唯一
不是,对同一方位有无数多中方法
不是,有两种方法,它们互相为互
可能导致非法
任意三个数都能构成合法的欧拉角
容易产生误差积累,从而产生非法的四元数
matlab自带函数:
angle2quat.m
function q = angle2quat( r1, r2, r3, varargin )
ANGLE2QUAT Convert rotation angles to quaternion.
Q = ANGLE2QUAT( R1, R2, R3 ) calculates the quaternion, Q, for given,
R1, R2, R3.
R1 is an M array of first rotation angles.
R2 is an M
array of second rotation angles.
R3 is an M array of third rotation
Q returns an M-by-4 matrix containing M quaternions. Q has its
scalar number as the first column.
Rotation angles are input in radians.
Q = ANGLE2QUAT( R1, R2, R3, S ) calculates the quaternion, Q, for a
given set of rotation angles, R1, R2, R3, and a specified rotation
sequence, S.
The default rotation sequence is 'ZYX' where the order of rotation
angles for the default rotation are R1 = Z Axis Rotation, R2 = Y Axis
Rotation, and R3 = X Axis Rotation.
All rotation sequences, S, are supported: 'ZYX', 'ZYZ', 'ZXY', 'ZXZ',
'YXZ', 'YXY', 'YZX', 'YZY', 'XYZ', 'XYX', 'XZY', and 'XZX'.
Determine the quaternion from rotation angles:
yaw = 0.7854;
pitch = 0.1;
q = angle2quat( yaw, pitch, roll )
Determine the quaternions from multiple rotation angles:
yaw = [0.];
pitch = [0.1 0.3];
roll = [0 0.1];
q = angle2quat( pitch, roll, yaw, 'YXZ' )
See also DCM2QUAT, QUAT2DCM, QUAT2ANGLE.
The MathWorks, Inc.
if any(~isreal(r1) || ~isnumeric(r1))
error(message('aero:angle2quat:isNotReal1'));
if any(~isreal(r2) || ~isnumeric(r2))
error(message('aero:angle2quat:isNotReal2'));
if any(~isreal(r3) || ~isnumeric(r3))
error(message('aero:angle2quat:isNotReal3'));
if (length(r1) ~= length(r2)) || (length(r1) ~= length(r3))
error(message('aero:angle2quat:wrongDimension'));
if nargin == 3
type = 'zyx';
if ischar( varargin{1} )
type = varargin{1};
error(message('aero:angle2quat:notChar'));
angles = [r1(:) r2(:) r3(:)];
cang = cos( angles/2 );
sang = sin( angles/2 );
switch lower( type )
case 'zyx'
q = [ cang(:,1).*cang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) - sang(:,1).*sang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*cang(:,2).*sang(:,3), ...
sang(:,1).*cang(:,2).*cang(:,3) - cang(:,1).*sang(:,2).*sang(:,3)];
case 'zyz'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*sang(:,3) - sang(:,1).*sang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
sang(:,1).*cang(:,2).*cang(:,3) + cang(:,1).*cang(:,2).*sang(:,3)];
case 'zxy'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*sang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3)];
case 'zxz'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
sang(:,1).*sang(:,2).*cang(:,3) - cang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3)];
case 'yxz'
q = [ cang(:,1).*cang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*cang(:,2).*sang(:,3), ...
sang(:,1).*cang(:,2).*cang(:,3) - cang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) - sang(:,1).*sang(:,2).*cang(:,3)];
case 'yxy'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
sang(:,1).*cang(:,2).*cang(:,3) + cang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*sang(:,3) - sang(:,1).*sang(:,2).*cang(:,3)];
case 'yzx'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*sang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3)];
case 'yzy'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
sang(:,1).*sang(:,2).*cang(:,3) - cang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3)];
case 'xyz'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*sang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*sang(:,2).*cang(:,3)];
case 'xyx'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
sang(:,1).*sang(:,2).*cang(:,3) - cang(:,1).*sang(:,2).*sang(:,3)];
case 'xzy'
q = [ cang(:,1).*cang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3), ...
sang(:,1).*cang(:,2).*cang(:,3) - cang(:,1).*sang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) - sang(:,1).*sang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*cang(:,2).*sang(:,3)];
case 'xzx'
q = [ cang(:,1).*cang(:,2).*cang(:,3) - sang(:,1).*cang(:,2).*sang(:,3), ...
cang(:,1).*cang(:,2).*sang(:,3) + sang(:,1).*cang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*sang(:,3) - sang(:,1).*sang(:,2).*cang(:,3), ...
cang(:,1).*sang(:,2).*cang(:,3) + sang(:,1).*sang(:,2).*sang(:,3)];
error(message('aero:angle2quat:unknownRotation', type));
quat2angle.m
function [r1, r2, r3] = quat2angle( q, varargin )
QUAT2ANGLE Convert quaternion to rotation angles.
[R1 R2 R3] = QUAT2ANGLE( Q ) calculates the calculates the set of
rotation angles, R1, R2, R3, for a given quaternion, Q.
Input Q is an
M-by-4 matrix containing M quaternions.
R1 returns an M array of
first rotation angles.
R2 returns an M array of second rotation
R3 returns an M array of third rotation angles. Each element
of Q must be a real number.
Additionally, Q has its scalar number as
the first column. Rotation angles are output in radians.
[R1 R2 R3] = QUAT2ANGLE( Q, S ) calculates the set of rotation
angles, R1, R2, R3, for a given quaternion, Q, and a
specified rotation sequence, S.
The default rotation sequence is 'ZYX' where the order of rotation
angles for the default rotation are R1 = Z Axis Rotation, R2 = Y Axis
Rotation, and R3 = X Axis Rotation.
All rotation sequences, S, are supported: 'ZYX', 'ZYZ', 'ZXY', 'ZXZ',
'YXZ', 'YXY', 'YZX', 'YZY', 'XYZ', 'XYX', 'XZY', and 'XZX'.
Determine the rotation angles from q = [1 0 1 0]:
[yaw, pitch, roll] = quat2angle([1 0 1 0])
Determine the rotation angles from multiple quaternions:
q = [1 0 1 0; 1 0.5 0.3 0.1];
[pitch, roll, yaw] = quat2angle(q, 'YXZ')
See also ANGLE2DCM, DCM2ANGLE, DCM2QUAT, ANGLE2QUAT, QUAT2DCM.
The MathWorks, Inc.
$Revision: 1.1.6.1 $
13:42:36 $
Limitations:
The limitations for the 'ZYX', 'ZXY', 'YXZ', 'YZX', 'XYZ', and 'XZY'
implementations generate an R2 angle that lies between +/- 90
degrees, and R1 and R3 angles that lie between +/- 180 degrees.
The limitations for the 'ZYZ', 'ZXZ', 'YXY', 'YZY', 'XYX', and 'XZX'
implementations generate an R2 angle that lies between 0 and
180 degrees, and R1 and R3 angles that lie between +/- 180 degrees.
% error(nargchk(1, 2, nargin,'struct'));
if nargin == 1
type = 'zyx';
if ischar( varargin{1} )
type = varargin{1};
error('aero:quat2angle:notchar','Rotation sequence is not a string.');
qin = quatnormalize( q );
switch lower( type )
case 'zyx'
[r1, r2, r3] = threeaxisrot( 2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)), ...
qin(:,1).^2 + qin(:,2).^2 - qin(:,3).^2 - qin(:,4).^2, ...
-2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)), ...
2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)), ...
qin(:,1).^2 - qin(:,2).^2 - qin(:,3).^2 + qin(:,4).^2);
case 'zyz'
[r1, r2, r3] = twoaxisrot( 2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)), ...
2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)), ...
qin(:,1).^2 - qin(:,2).^2 - qin(:,3).^2 + qin(:,4).^2, ...
2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)), ...
-2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)));
case 'zxy'
[r1, r2, r3] = threeaxisrot( -2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)), ...
qin(:,1).^2 - qin(:,2).^2 + qin(:,3).^2 - qin(:,4).^2, ...
2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)), ...
-2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)), ...
qin(:,1).^2 - qin(:,2).^2 - qin(:,3).^2 + qin(:,4).^2);
case 'zxz'
[r1, r2, r3] = twoaxisrot( 2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)), ...
-2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)), ...
qin(:,1).^2 - qin(:,2).^2 - qin(:,3).^2 + qin(:,4).^2, ...
2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)), ...
2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)));
case 'yxz'
[r1, r2, r3] = threeaxisrot( 2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)), ...
qin(:,1).^2 - qin(:,2).^2 - qin(:,3).^2 + qin(:,4).^2, ...
-2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)), ...
2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)), ...
qin(:,1).^2 - qin(:,2).^2 + qin(:,3).^2 - qin(:,4).^2);
case 'yxy'
[r1, r2, r3] = twoaxisrot( 2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)), ...
2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)), ...
qin(:,1).^2 - qin(:,2).^2 + qin(:,3).^2 - qin(:,4).^2, ...
2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)), ...
-2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)));
case 'yzx'
[r1, r2, r3] = threeaxisrot( -2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)), ...
qin(:,1).^2 + qin(:,2).^2 - qin(:,3).^2 - qin(:,4).^2, ...
2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)), ...
-2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)), ...
qin(:,1).^2 - qin(:,2).^2 + qin(:,3).^2 - qin(:,4).^2);
case 'yzy'
[r1, r2, r3] = twoaxisrot( 2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)), ...
-2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)), ...
qin(:,1).^2 - qin(:,2).^2 + qin(:,3).^2 - qin(:,4).^2, ...
2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)), ...
2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)));
case 'xyz'
[r1, r2, r3] = threeaxisrot( -2.*(qin(:,3).*qin(:,4) - qin(:,1).*qin(:,2)), ...
qin(:,1).^2 - qin(:,2).^2 - qin(:,3).^2 + qin(:,4).^2, ...
2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)), ...
-2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)), ...
qin(:,1).^2 + qin(:,2).^2 - qin(:,3).^2 - qin(:,4).^2);
case 'xyx'
[r1, r2, r3] = twoaxisrot( 2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)), ...
-2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)), ...
qin(:,1).^2 + qin(:,2).^2 - qin(:,3).^2 - qin(:,4).^2, ...
2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)), ...
2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)));
case 'xzy'
[r1, r2, r3] = threeaxisrot( 2.*(qin(:,3).*qin(:,4) + qin(:,1).*qin(:,2)), ...
qin(:,1).^2 - qin(:,2).^2 + qin(:,3).^2 - qin(:,4).^2, ...
-2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)), ...
2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)), ...
qin(:,1).^2 + qin(:,2).^2 - qin(:,3).^2 - qin(:,4).^2);
case 'xzx'
[r1, r2, r3] = twoaxisrot( 2.*(qin(:,2).*qin(:,4) - qin(:,1).*qin(:,3)), ...
2.*(qin(:,2).*qin(:,3) + qin(:,1).*qin(:,4)), ...
qin(:,1).^2 + qin(:,2).^2 - qin(:,3).^2 - qin(:,4).^2, ...
2.*(qin(:,2).*qin(:,4) + qin(:,1).*qin(:,3)), ...
-2.*(qin(:,2).*qin(:,3) - qin(:,1).*qin(:,4)));
error('aero:quat2angle:unknownrotation','Unknown rotation sequence, %s', type);
function [r1, r2, r3] = threeaxisrot(r11, r12, r21, r31, r32)
% find angles for rotations about X, Y, and Z axes
r1 = atan2( r11, r12 );
r2 = asin( r21 );
r3 = atan2( r31, r32 );
function [r1, r2, r3] = twoaxisrot(r11, r12, r21, r31, r32)
r1 = atan2( r11, r12 );
r2 = acos( r21 );
r3 = atan2( r31, r32 );
function qout = quatnormalize( q )
QUATNORMALIZE Normalize a quaternion.
N = QUATNORMALIZE( Q ) calculates the normalized quaternion, N, for a
given quaternion, Q.
Input Q is an M-by-4 matrix containing M
quaternions.
N returns an M-by-4 matrix of normalized quaternions.
Each element of Q must be a real number.
Additionally, Q has its
scalar number as the first column.
Normalize q = [1 0 1 0]:
normal = quatnormalize([1 0 1 0])
See also QUATCONJ, QUATDIVIDE, QUATINV, QUATMOD, QUATMULTIPLY,
QUATNORM, QUATROTATE.
The MathWorks, Inc.
$Revision: 1.1.6.1 $
23:39:35 $
qout = q./(quatmod( q )* ones(1,4));
function mod = quatmod( q )
QUATMOD Calculate the modulus of a quaternion.
N = QUATMOD( Q ) calculates the modulus, N, for a given quaternion, Q.
Input Q is an M-by-4 matrix containing M quaternions.
N returns a
column vector of M moduli.
Each element of Q must be a real number.
Additionally, Q has its scalar number as the first column.
Determine the modulus of q = [1 0 0 0]:
mod = quatmod([1 0 0 0])
See also QUATCONJ, QUATDIVIDE, QUATINV, QUATMULTIPLY, QUATNORM,
QUATNORMALIZE, QUATROTATE.
The MathWorks, Inc.
$Revision: 1.1.6.1 $
23:39:32 $
mod = sqrt(quatnorm( q ));
function qout = quatnorm( q )
QUATNORM Calculate the norm of a quaternion.
N = QUATNORM( Q ) calculates the norm, N, for a given quaternion, Q.
Q is an M-by-4 matrix containing M quaternions.
N returns a column vector
of M norms.
Each element of Q must be a real number.
Additionally, Q has
its scalar number as the first column.
Determine the norm of q = [1 0 0 0]:
norm = quatnorm([1 0 0 0])
See also QUATCONJ, QUATDIVIDE, QUATINV, QUATMOD, QUATMULTIPLY,
QUATNORMALIZE, QUATROTATE.
The MathWorks, Inc.
$Revision: 1.1.6.1 $
23:39:34 $
if any(~isreal(q(:)))
error('aero:quatnorm:isnotreal','Input elements are not real.');
if (size(q,2) ~= 4)
error('aero:quatnorm:wrongdim','Input dimension is not M-by-4.');
qout = sum(q.^2,2);测试文件eularquat.m
%matlab航空航天工具箱(Aerospace Toolbox)提供有:
%quat2angle函数实现四元数到欧拉角转换
%angle2quat函数实现欧拉角到四元数转换
%quat2angle调用示例
[yaw,pitch,roll]=quat2angle([1 0 1 0])
%angle2quat调用示例
q=angle2quat(0.,0)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:178110次
积分:2628
积分:2628
排名:第11872名
原创:74篇
转载:24篇
评论:670条
(8)(1)(5)(8)(5)(5)(9)(9)(3)(9)(1)(1)(3)(2)(15)(20)

我要回帖

更多关于 欧拉角顺序 的文章

 

随机推荐