旋转变换(二)欧拉角
欧拉角(Euler Angles)是一种描述三维旋转的方式,其他的方式还包括矩阵、四元数、旋转轴和旋转角等方式。之所以可以用它来描述旋转是来自于欧拉旋转定理。该定理指出:任何一个旋转都可以用三个旋转的参数来表示。
1. 欧拉角的描述
欧拉角的描述方式有很多种,由于关于如何定义欧拉角目前并没有一个标准。因此不同人描述的欧拉角的旋转轴和旋转的顺序都可能是不一样的。这样就带来一个很大的隐患,当使用其他人提供的欧拉角的实现时,需要首先搞清楚他用的是那种约定。对于定义一个欧拉角,需要明确的内容包括:
1. 三个旋转角的组合方式(是xyz还是yzx还是zxy)
2. 旋转角度的参考坐标系统(旋转是相对于固定的坐标系还是相对于自身的坐标系)
3. 使用旋转角度是左手系还是右手系
4. 三个旋转角的记法
下面针对这4条进行详细的阐述:
1.1 旋转角的组合方式
为了方便,我们用x指代只绕x轴的旋转,用y指代只绕y轴进行的旋转。在描述欧拉角的时候可以有以下方式:xyz, yzx,zxy 或者是反向顺序 zyx xzy yxz。由于这些角度并不是独立的,例如当下面的旋转组合:先绕x轴旋转90度,再绕y轴旋转90度,最后绕x轴旋转-90度,这一些列组合得到的效果与只绕z轴旋转-90度是一样的。也就是说我们仅仅在2个平面上进行旋转(其中一个平面上必须进行两次旋转)就可以得到任意的三维旋转。也就是说可以使用以下的方式:xyz、xzx、yxy、yzy、zxz和zyz,总共有12种组合方式。
针对这一条,具体的解释如下:
既然两个平面上的旋转就能组合出任意的三维旋转,那么我们可以不用第三个轴向就可以得出旋转角,这种方式称为Proper Euler angles。
- Proper Euler angle(z-x-z,x-y-x,y-z-y,z-y-z, x-z-x,y-x-y)
- Tait-Bryan angle (x-y-z,y-z-x,z-x-y,x-z-y,z-y-x,y-x-z)【也称作:Cardan angles; nautical angles; heading,elevation,bank; yaw,pitch,rooll】
有时候这两种方式都被称为欧拉角,这种情况下,第一种方式被称为proper或者经典(classic)的欧拉角。
1.2 旋转的参考坐标系
在描述这3个旋转角的时候,可以是相对于某个固定的坐标系统(称为extrinsic rotations),也可以是相对于物体自身的坐标系统(称为intrinsic rotations)。因此结合上面提到旋转角的组合方式,总共的排列组合是24种。
关于这一点解释如下:
使用绕固定坐标系的旋转,看起来更加自然和易于理解,在图形学或者是游戏编程中,所有场景中的对象都有着统一的世界坐标的情况下,使用这种方式来处理场景中的旋转更加方便。后一种方式在物理学中比较常用。(关于两种方式的详细说明见参考文献5)
1.3 旋转是左手系还是右手系
并不是说坐标系统是左手系还是右手系。而是只如何确定旋转角度是正还是负,如果是右手系,那么角度是正的方式是:从旋转轴反方向观察,逆时针方向的旋转是正、顺时针方向的旋转是负。(或者这样描述:使用右手的大拇指指向旋转轴,其他4个手指在握拳过程中的指向便是正的角度)
1.4 旋转角的记法
为了便于后续的讨论,本文中使用以下的约定和记法:
顺序 | 飞行器 | 望远镜 | 符号 | 角速度 |
---|---|---|---|---|
第一 | heading | azimuth | θ\theta | yaw |
第二 | attitude | elevation | ϕ\phi | pitch |
第三 | bank | tilt | ψ\psi | roll |
关于这上表的描述图如下所示:
2. 连续的旋转
假设我们对物体进行一次欧拉角描述的旋转,三个欧拉角分别是(a1,a2,a3),之后我们再进行一次旋转,三个欧拉角描述是(b1,b2,b3),那么我们能否只用一次旋转(使用欧拉角描述(c1,c2,c3))来达到这两次旋转相同的效果呢?事实上这样是非常困难的,我们不能够仅仅使用(a1+b1,a2+b2,b3+b3)来得到这三个角度。一般来说我们会将欧拉角转换成旋转矩阵或者是四元数来进行连续旋转的叠加计算,之后再转换回欧拉角。但是这样做的次数多了可能会引入很大的误差导致旋转结果出错。因此比较好的方案是直接使用旋转矩阵或四元数来计算这类问题。
3. 万向节死锁(Gimbal lock)
万向节是一个悬挂起来的环,可以绕一个固定的轴进行旋转,一般万向节是多个嵌套在一起,实现绕多个轴向的旋转,如下图所示:
在使用欧拉角描述旋转的过程中,可能会出现一种被称为“万向节死锁”的情况。万向节死锁是指在旋转过程中丢失了旋转的一个维度,这种情况出现在旋转过程中两个轴向平行,导致旋转仅仅只能在两个维度上进行。万向节死锁的两个示例:
3.1 二维万向节死锁
假设我们使用固定的望远镜来跟踪一架飞机,望远镜可以在水平和垂直方向自由的转动,当飞机正好飞过望远镜的头顶时,突然转向90度飞行,这时候我们发现如果不调整望远镜的垂直角度,我们是没有办法再跟踪飞机了。也就是说我们必须执行一次不连续的操作,才能去继续观察飞机,不可能一直连续的跟踪飞机,这里出现的就是万向节的死锁。说“死锁”这个词其实并不准确,轴并没有被锁住,还是可以绕它进行旋转,只是绕它的旋转没有任何意义,不能改变望远镜的指向。
3.2 三维万向节死锁
如下图所示,使用欧拉角(pitch、yaw、roll)来描述飞机的状态,当飞机pitch为90度后(绿色),在进行roll和yaw实际上是相同的效果(蓝色和牡丹红色),不能在实现yaw的旋转了。也就说出现了死锁
3.3 数学意义上的解释
当我们用欧拉角来描述一个旋转时,一种矩阵的描述是:
当β\beta角为π/2\pi/2时,得到:
使用矩阵乘法得到:
使用三角函数公式,化简得到:
这种情况下,当我们修改α\alpha或者修改γ\gamma,事实上效果是一样的(只有这时候我们不改变β\beta),这时候实际上出现的就是我们所说的万向节死锁。
4. 解决方案
由于上文中提到的欧拉角的诸多问题,因此在使用中要格外的小心,如果一定要使用欧拉角,在使用中需要注意:
1. 选择欧拉角的约定一定要一致
2. 根据具体的应用,尽量选择能够避免产生万向节死锁的约定
更好的描述旋转的方式可以使用 四元数、旋转矩阵或者是单一的方向向量和旋转角的方式(不要把旋转分割成三个的值)
参考文献:
- Maths - Euler Angles
- Wiki-Euler angles
- Euler Angles
- Wiki-Gimbal lock
- 欧拉角、内部旋转、外部旋转
旋转变换(二)欧拉角相关推荐
- 旋转矩阵与欧拉角之间的转换
简 介: 对于欧拉角与旋转矩阵之间的转换公式和程序实现进行了测试.也显示了这其中的转换关系的复杂性,来自于欧拉角的方向.范围.转换顺序.这在实际应用中需要特别的关注. 关键词: 欧拉角,旋转矩阵 #m ...
- 【计算机图形学】小白谈计算机图形学(四)二维三维图形变换—1
小白谈计算机图形学(四)二维三维图形变换-1 窗口与视图 二维图形的几何变换 平移变换 比例变换 旋转变换 二维图形变换的矩阵表示 三种变换 齐次坐标变换 原二维线性变换 齐次坐标法 复合变换 例题: ...
- 二维(三维)坐标系中旋转矩阵详细推导
求三维坐标系的旋转矩阵通常需要求分别沿3个坐标轴的二维坐标系下的旋转矩阵,二维坐标系下的旋转矩阵的推导过程通常以某一点逆时针旋转 θ \theta θ角度进行推理.以下将通过此例来详细讲解二维坐标系下 ...
- C#中的矩阵乘法——对图像应用变换
目录 介绍 源代码 矩阵乘法 转换 旋转变换 拉伸/缩放转换 单位矩阵 翻转变换 颜色密度变换 将事物连接在一起 创建客户端 性能说明 结论 介绍 今天,我将向您展示我的矩阵乘法的C#实现以及如何使用 ...
- 计算机图形学算法总结
图形学算法总结 文章目录 图形学算法总结 直线生成算法 数值微分法(DDA) 中点画线法 Bresenham算法 圆弧生成算法 中点Bresenham画圆法 多边形填充算法 逐点判断法 1)射线法 2 ...
- MATLAB机器人工具箱(一 机器人运动学)
目录 一.三维空间位姿表示与坐标变换方法 三维空间的位置与姿态表示 位置描述 姿态描述 旋转矩阵 坐标系绘制 坐标变换 平移坐标变换 旋转变换 二.机器人运动学 D-H参数法 创建一个连杆对象 创建一 ...
- 姿态篇:一.初识姿态估计
[深入浅出多旋翼飞控开发][姿态篇][一][初识姿态估计] 作者:Sky 一.什么是姿态 在学习姿态估计之前,我们先来了解一下,什么是 "姿态". 想象一架飞机准备起飞,于是它在机 ...
- 【飞控理论】【惯性导航基础】二维平面的旋转如何用代数表示?三维平面的旋转如何用代数表示?什么是四元数?四元数、欧拉角、方向余弦之间有什么关系?
上一篇欧拉角 由于欧拉角在描述三维空间物体旋转问题时存在万向节死锁问题(详情戳这里),所以引入四元数概念. 目录 1.二维平面的旋转 2.三维平面的旋转(什么是四元数) 3.<捷联惯性导航> ...
- 飞行器控制笔记(二)——姿态解算之坐标变换与欧拉角更新姿态
飞行器控制笔记(二)--姿态解算之坐标变换与欧拉角更新姿态 飞行器控制笔记(二)--姿态解算之坐标变换与欧拉角更新姿态 一.基本假定 二.坐标变换矩阵 2.1绕z轴旋转 2.2绕y轴旋转 2.3绕x轴 ...
- 欧拉角和旋转变换:易混淆概念区分MATLAB计算
关于用欧拉角表示的坐标系姿态旋转变换,大多数教科书和博客上的讲解不甚明晰,自己多方研究分析后,根据自己的理解做如下记录,一方面帮助自己加深巩固,另一方面欢迎各位方家指正. 1. 概念定义 绕坐标系单轴 ...
最新文章
- 开源代码维护人员大诉苦水,超半正考虑或已经决定放弃
- python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...
- jsoncpp和rapidjson哪个好用?
- 硬链接与软链接的区别
- 视频编码H.264的应用
- HTML5移动端触摸事件
- ORACLE EBS 多账套总结
- [Web开发] 微软的RSS协议扩展 - FeedSync 介绍 (2)
- Centos7安装Nginx实战
- 图灵奖得主 John E. Hopcroft 等 300 余位 AI 学者“穿越”回宋代开国际 AI 大会,这场面你见过吗?
- 对WebBrowser控件设置代理
- Linux安装gcc和运行代码教程
- poj 1436 Horizontally Visible Segments(线段树)
- 恒流源差分放大电路静态分析_带有恒流源的差动放大电路
- GaussDB ETCD 服务异常实例分析处理的5种方法
- C语言深度学习之嵌套循环例题(金字塔模型)
- VMware-workstation中文版修改成英文版简单方法
- PVT(Process Voltage Temperature)
- k-nearest neighbor,k近邻法
- 程序人生-感受湖光景色随笔
热门文章
- python:批量修改文件夹名称
- UE4蓝图API翻译【节点】---? Is Valid
- WPS的标题样式如何保存成默认
- pda扫描枪屏幕_PDA扫描枪的介绍
- QLineEdit屏蔽扫描枪输入自带回车的方法
- HTML菜鸟教程学习笔记
- 世界顶级职场中,为什么印度人可以做到CEO,中国人却最多只是架构师?
- linux让别人电脑蓝屏,愚人节必备,教你制作整人神器,用代码实现计算机蓝屏...
- target is null for setProperty(null,)错误的引发原因及解决办法
- 双基因突变患者_我的肺癌没有基因突变,这是好是坏?