欧拉角与旋转

旋转矩阵与欧拉角的相互转换及代码 这篇博客将会分享旋转矩阵和欧拉角的相互转换。 三维旋转矩阵有三个自由度,旋转能够使用多种方法表示,比如一个3x3的矩阵,比如四元数,甚至可以将旋转表示为三个数字,即绕三个轴x,y,z的旋转角度。在原始的欧拉角公式中,旋转是通过围绕Z轴,Y轴,X轴分别旋转得到的。它分别对应于偏航,俯仰和横滚。 当定义一个旋转时,可能还会引起歧义,比如对于一个给定的点(x,y,z),可以把这个点视为行向量(x,y,z... 阅读详情

原文地址:http://blog.youkuaiyun.com/mysniper11/article/details/8766574


欧拉角是一种常用的描述方位的方法。这项技术是著名数学家Leonhard Euler(1707~1783)的名字命名的,他证明了角位移序列等价于单个角位移。想详细了解的请点击维基百科:http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92#.E5.88.A5.E7.A8.AE.E9.A0.86.E5.BA.8F

1,什么是欧拉角

      欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。这听起来复杂,其实它是非常直观的。之所以有“角位移”的说法正是因为欧拉角能用来描述任意旋转,但最有意义的是使用笛卡尔坐标系并按照一定顺序所组成的旋转序列。最常用的约定,即所谓“heading-pitch-bank”约定。在这个系统中,一个方位被定义为一个heading角,一个pitch角,和一个bank角。它的基本思想就是让物体开始于“标准”方位——就是物体坐标轴和惯性坐标轴对齐。在标准方位上,让物体作heading,pitch,bank旋转,最后物体到达我们想要描述的方位。

     在精确定义术语“heading”“pitch”“bank”前,先让我们简要回顾本书中使用的坐标空间约定。我们使用左手坐标系,+x向右,+y向上,+z向前。

     heading为绕y轴的旋转量,向右旋转为正,旋转正方向是顺时针方向,经过heading旋转之后,pitch为绕x轴的旋转量,注意是物体坐标系的x轴,不是原惯性坐标系的x轴,依然遵守左手法则,向下旋转为正。最后,经过了heading,pitch后,bank为绕z轴的旋转量,依然是物体坐标系的z轴。

     当我们说到旋转的顺序是heading-pitch-bank时,是指从惯性坐标系到物体坐标系,如果从物体坐标系到惯性坐标系则相反。

2,关于欧拉角的其他约定

     前面曾提到过,heading-pitch-bank系统不是惟一的欧拉角系统,绕任意三个互相垂直轴的任意旋转序列都能定义一个方位。所以,多种选择导致了欧拉角约定的多样性:

     1)heading-pitch-bank系统有两个名称,当然,不同的名字并不代表不同的约定,这其实并不重要,一组常用的术语是roll-pitch-yaw,其中的roll对应与bank,yaw对应于heading,它定义了从物体坐标系到惯性坐标系的旋转顺序

     2)任意三个轴都能作为旋转轴,不一定必须是笛卡尔轴,但是用笛卡尔轴最有意义

     3)也可以选用右手坐标规则

     4)旋转可以以不同的顺序进行

3,优点:1)容易使用;2)表达简洁;3)任意三个角都是合法的

4,缺点:1)给定方位的表达方式不唯一;2)两个角度间求插值非常困难

采用限制欧拉角的方法来避免以上问题的出现:heading限制在+-180,pitch为+-90。

    以上为欧拉角的定义。旋转的方法如下:

从欧拉角矢量转换很容易,困难的部分是转换回来。XNA提供了一个方法可以创建旋转矩阵,但它并没有提供转换回来的方法,因此我们将不得不自己实现。

首先,我们转换为旋转矩阵,Matrix.CreateFromYawPitchRoll()方法可以做到这一点。如果这里使用欧拉角,我们需要以以下顺序提供坐标:

  • Yaw(偏航):欧拉角向量的y轴
  • Pitch(俯仰):欧拉角向量的x轴
  • Roll(翻滚): 欧拉角向量的z轴
想象一下飞机,yaw指水平方向的机头指向,它绕y轴旋转。Pitch指与水平方向的夹角,绕x轴旋转。Roll指飞机的翻滚,绕z轴旋转。下面的代码演示了这一过程:

[cpp]  view plain copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">// Converts a rotation vector into a rotation matrix  
  2. Matrix Vector3ToMatrix(Vector3 Rotation)  
  3. {  
  4.     return Matrix.CreateFromYawPitchRoll(Rotation.Y, Rotation.X, Rotation.Z);  
  5. }</span>  

这种方法可以提供一个表示旋转的矩阵。下面是最难的部分:将矩阵转换为欧拉角。

这个过程是将矩阵拆散:一个表示位置的Vecto3,另一个表示缩放,而四元数表示旋转。然后,我们必须将这个四元数转换为一个欧拉角矢量。我不打算详细讨论代码背后的数学原理,但如果你有兴趣,可以到前面链接中的网址上去看看。

下面是将旋转矩阵转换为欧拉角的代码。

[cpp]  view plain copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">// Returns Euler angles that point from one point to another  
  2. Vector3 AngleTo(Vector3 from, Vector3 location)  
  3. {  
  4.     Vector3 angle = new Vector3();   
  5.     Vector3 v3 = Vector3.Normalize(location - from);   
  6.   
  7.     angle.X = (float)Math.Asin(v3.Y);  
  8.     angle.Y = (float)Math.Atan2((double)-v3.X, (double)-v3.Z);  
  9.   
  10.     return angle;  
  11. }  
  12.   
  13. // Converts a Quaternion to Euler angles (X = Yaw, Y = Pitch, Z = Roll)  
  14. Vector3 QuaternionToEulerAngleVector3(Quaternion rotation)  
  15. {  
  16.     Vector3 rotationaxes = new Vector3();  
  17.     Vector3 forward = Vector3.Transform(Vector3.Forward, rotation);  
  18.     Vector3 up = Vector3.Transform(Vector3.Up, rotation);  
  19.   
  20.     rotationaxes = AngleTo(new Vector3(), forward);  
  21.   
  22.     if (rotationaxes.X == MathHelper.PiOver2)  
  23.     {  
  24.         rotationaxes.Y = (float)Math.Atan2((double)up.X, (double)up.Z);  
  25.         rotationaxes.Z = 0;  
  26.     }  
  27.     else if (rotationaxes.X == -MathHelper.PiOver2)  
  28.     {  
  29.         rotationaxes.Y = (float)Math.Atan2((double)-up.X, (double)-up.Z);  
  30.         rotationaxes.Z = 0;  
  31.     }  
  32.     else  
  33.     {  
  34.         up = Vector3.Transform(up, Matrix.CreateRotationY(-rotationaxes.Y));  
  35.         up = Vector3.Transform(up, Matrix.CreateRotationX(-rotationaxes.X));  
  36.   
  37.         rotationaxes.Z = (float)Math.Atan2((double)-up.Z, (double)up.Y);  
  38.     }   
  39.   
  40.     return rotationaxes;  
  41. }  
  42.   
  43. // Converts a Rotation Matrix to a quaternion, then into a Vector3 containing  
  44. // Euler angles (X: Pitch, Y: Yaw, Z: Roll)  
  45. Vector3 MatrixToEulerAngleVector3(Matrix Rotation)  
  46. {  
  47.     Vector3 translation, scale;  
  48.     Quaternion rotation;  
  49.   
  50.     Rotation.Decompose(out scale, out rotation, out translation);  
  51.   
  52.     Vector3 eulerVec = QuaternionToEulerAngleVector3(rotation);  
  53.   
  54.     return eulerVec;  
  55. }</span>  

同时,欧拉角的顺序规定一共有12种,在转化的时候一定要弄清楚规定是怎样的。
欧拉角(Euler Angle) / 译注:direction代表摄像机的前轴(Front),这个前轴是和本文第一幅图片的第二个摄像机的方向向量是相反的。分别绕着原坐标z轴(蓝),一次旋转以后的x轴(绿)以及两次旋转以后的z轴(红)旋转,最终产生的红色坐标系即表示出目标方向。// 注意我们先把角度转为弧度。2. 一共有3种欧拉角:俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll)... 阅读详情

相关推荐

欧拉角,轴角,四元数与旋转矩阵详解

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。目录一、欧拉角1、静态定义2、欧拉角的表示 3、欧拉角表示的优缺点 4、欧拉角的万向节死锁(静态不存在万向锁的问题)二、四元数1、提出意义和定义 (含轴角)2、四元数的相关计算法则3、四元数的极形式4、四元数的使用举例5、四元数的优缺点三、四元数和欧拉角间的相互转化1、四元数转为欧拉角2、欧拉角转为四元数四、旋转矩阵对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。来一个经典的示例

tt丫的博客 1万+

欧拉角(Euler angles)详解

欧拉角是由 Leonhard_Euler 引入的三个角度,用于描述刚体相对于固定坐标系的方向。它们也可以表示物理学中移动参考系的方向或三维线性代数中基的方向。欧拉角是一种基于三种较简单旋转运动(称为俯仰、滚动和偏航)创建一般旋转的机制。如下图,一架沿x轴方向飞行的飞机可以通过转向左或转向右(偏航),朝上飞或朝下飞(俯仰),或简单绕x轴旋转(滚动)来改变飞行方向。可以看出俯仰、偏航、滚动分别就是绕z轴、y轴、x轴旋转,上面已经给出了这三种特殊旋转的旋转矩阵。

qq_656236576的博客 1万+

旋转矩阵和欧拉角

参考Computing Euler angles from a rotation matrix 旋转矩阵转换为欧拉角参考代码 #Ref: https://www.learnopencv.com/rotation-matrix-to-euler-angles/ def isRotationMatrix(R): ''' checks if a matrix is a valid rotation matrix(whether orthogonal or not) ''' Rt = n.

lyyiangang的博客 7914

旋转矩阵与欧拉角之间的转换

欧拉角和旋转矩阵之间的转换 在机器人视觉应用中,经常会遇到旋转矩阵、旋转向量、四元素、欧拉角之间的相互转换。其中最容易出错的是旋转矩阵与欧拉角之间的相互转换。 ▲ 图1 坐标系旋转变换   §01 欧拉角 基本概念 欧拉角的名称 欧拉角的叫法不固定,跟坐标轴的定义强相关。 在图1中,假设X是车头,Y是车左方,Z是车上方,那么绕X轴旋转得到的是roll,绕Y轴旋转得到的是pitch,绕Z轴得到的是yaw。 在图1中,假设Y是车头,X是车右方,Z是车上方,那么绕X轴旋转得到的是pitch,绕..

TSINGHUAJOKING 3万+

欧拉角、四元数和旋转矩阵

讨论旋转矩阵、欧拉角、四元组之间的转换关系,以及旋转的合成、取逆等操作。

shenxiaolu1984的专栏 3万+

旋转矩阵、欧拉角

旋转矩阵、坐标变换、向量旋转、相似变换、齐次变换、欧拉角及rpy

weixin_40215443的博客 9789

欧拉角与旋转矩阵的转换关系

欧拉角因为其奇异性,虽然在优化和插值的不会使用,但是当我们对别人描述一个旋转的过程是怎么样的时候,欧拉角还是很有用的,比如,做无人机姿态控制的时候使用的就是欧拉角,但是搞明白欧拉角是怎么回事确实是一件头疼的事,所以就写下了这篇总结,希望对大家理解欧拉角有所帮助 需要区分每次旋转是绕固定轴旋转的,还是绕旋转之后的轴旋转的,如果不特殊指明,下面的讨论都是指:绕旋转之后的轴旋转的。不要局限于表示旋...

陋室逢雨 5万+

python旋转矩阵与欧拉角互转

说明如何实现python旋转矩阵与欧拉角互转并拓展解释什么是欧拉角

ZHUO__zhuo的博客 1万+

欧拉角旋转

欧拉角是一种表示三维旋转的描述方法,欧拉角的计算需要借助旋转矩阵,关于旋转矩阵的知识可先参考之前的文章:3维旋转矩阵推导与助记 欧拉角旋转 静态定义 对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。 参考系又称为实验室参考系,是静止不动的,可以先简单的理解理解为大地坐标系,也称惯性坐标系。 坐标系则固定于刚体,随著刚体的旋转而旋转,比如飞行器自身的坐标系,也称载体坐标系。 如上图为一种ZYZ顺序旋转的欧拉角示意图: 设蓝色的xyz-轴为惯性系的参考轴,即大地坐标系的3个轴。

码农爱学习的博客 6158

欧拉角和旋转矩阵相互转换

欧拉角和旋转矩阵可同样表示刚体在三维空间的旋转,下面分享这两者互相转换的方法和核心代码 欧拉角转旋转矩阵 欧拉角通过将刚体绕过原点的轴(i,j,k)旋转θ,分解成三步,如下图(蓝色是起始坐标系,而红色的是旋转之后的坐标系) 如果将每一个角度用旋转矩阵表示如下: 所以,容易得到,欧拉角转旋转矩阵如下: 旋转矩阵转欧拉角 将旋转矩阵表示如下: 则可以如下表示欧拉...

发现问题,解决问题. 3万+

旋转矩阵、欧拉角、万向锁详解

旋转矩阵、欧拉角、万向锁详解 物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接。用坐标系{B}的三个单位主矢量{Xb,Yb,Zb}相对于参考坐标系{A}的方向余弦组成的3*3的矩阵来表示刚体B相对于坐标系{A}的方位,(_B^A)R称为旋转矩阵。 式中,上标A代表参考坐标系{A},下表B代表被描述的坐标系{B},(_B^A)R共9个元素,但只有三个式独立的。三个单位列矢量两两相互垂直,长度为1,因而它的9给元素满足正交条件: 旋转矩阵

w1050321758的博客 4911

欧拉角与旋转矩阵

欧拉角的使用总结。

Walking_roll的博客 5163

两种欧拉角与其对应的旋转矩阵求解

欧拉角定义 欧拉角(Euler Angle),由著名数学家莱昂哈德·欧拉(1707-1783)提出,故而得名。欧拉角旨在用三个角度来表示刚体在三维空间的旋转。这种表示方法经历了3个世纪,其实已经非常古老了,自身有一些局限性,塞利斯基(Richard Szeliski)所著《计算机视觉:算法与应用》一书中对欧拉角甚至只是一笔带过。但是欧拉角现在依然在广泛使用,因此仍然有深入学习的必要。 首先我们统一符号: OxyzOxyzOxyz是世界坐标系,是固定不变的。 OXYZOXYZOXYZ是被旋转的局部坐标系。

hysterisis的博客 4673

旋转矩阵与欧拉角互转

参考:https://www.learnopencv.com/rotation-matrix-to-euler-angles/ 一般用Z-Y-X欧拉角,它对应于yaw偏航,pitch俯仰和roll滚转。 欧拉角 -> 旋转矩阵 C++代码: // Calculates rotation matrix given euler angles. Mat eulerAngles...

reason的博客 1万+

三维空间刚体运动3:欧拉角表示旋转(全面理解万向锁、RPY角和欧拉角)

本篇继续参照高翔老师《视觉SLAM十四讲从理论到实践》,讲解三维空间刚体运动。博文将原第三讲分为四部分来讲解:1、旋转矩阵和变换矩阵;2、旋转向量表示旋转;3、欧拉角表示旋转;4、四元数表示变换。本文相对于原文会适当精简,同时为便于理解,会加入一些注解和补充知识点,本篇为第三部分:欧拉角表示旋转,另外三部分请参照博主的其他博文。

shao918516的博客 2万+

Chapter 4 Ripple-Based Control Technique Part I

本文介绍了DC-DC转换器的纹波控制技术,重点分析了迟滞控制、恒定开通时间控制、恒定关断时间控制等方案的工作原理及优缺点。纹波控制无需补偿网络,具有快速瞬态响应和结构简单的优势,特别适合电池供电应用。其中,恒定开通时间控制在轻载时能自动延长关断时间,实现伪定频工作;而恒定关断时间控制轻载效率较低。文章还讨论了纹波注入技术解决Boost转换器右半平面零点问题,并比较了不同控制方案在负载瞬态下的性能表现。最后指出基于纹波的控制技术在提高调节精度和降低EMI方面的改进方向。

2304_76736886的博客 1300

旋转矩阵、欧拉角之间转换

MATLAB矩阵乘法从左到右依次相乘 用R表示旋转矩阵。 yaw pitch roll分别表示Z Y X轴的转角。 q=[q0,q1,q2,q3]'表示单位四元数。

weixin_43365751的博客 1万+

学习STM32的无人机控制

设计并实现无人机控制系统,使用STM32单片机进行控制。无人机控制系统主要包括飞行控制、姿态控制、定位导航等功能。以下是一个基于STM32的无人机控制系统的代码案例。以上是一个基于STM32的无人机控制系统的代码案例,包括飞行控制、姿态控制和定位导航等功能。请根据实际情况进行修改和完善。

qq_67153941的博客 837

旋转矩阵与欧拉角的相互转换

详细论述了通过GLM库实现旋转矩阵与欧拉角的旋转过程。

Charlee44的技术驿站 1万+

组建高效AI开发团队:角色、技能与协作

在当今科技飞速发展的时代,人工智能(AI)已经成为各个领域的核心驱动力。组建高效的AI开发团队对于企业和科研机构来说至关重要,它能够推动创新、提高竞争力、实现业务目标。本文的目的在于为那些希望组建或优化AI开发团队的管理者、技术负责人以及相关从业者提供全面的指导。范围涵盖了团队角色的定义、所需技能的分析、团队协作的策略,以及实际项目中的应用和相关资源的推荐。本文将首先介绍AI开发团队的核心概念与联系,包括团队角色、技能和协作之间的关系。接着阐述核心算法原理和具体操作步骤,结合数学模型和公式进行详细讲解。

2502_91592937的博客 995

北斗导航 | 卡尔曼滤波与因子图优化对比(附图优化matlab代码)

- 历史数据利用:因子图通过滑动窗口保留历史状态,优化时联合多帧数据;卡尔曼滤波仅依赖当前和上一帧状态 。 - 迭代优化:因子图通过多次迭代逼近最优解,卡尔曼滤波仅单次更新 。 - 误差抑制:因子图的多次线性化可有效抑制非线性误差(如GNSS伪距观测的非线性) 。

尘世冰封的专栏 1303
上一篇: OpenGL中的坐标系
下一篇: 指针的大小到底是由谁决定?是多少?
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值