[视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁

article/2025/7/21 3:02:10

[视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁

  • 1 欧拉角
    • 1.1 维基百科定义
    • 1.2 ZYX欧拉角与rpy角
  • 2 万向锁
    • 2.1 万向节
    • 2.1 万向锁的产生

1 欧拉角

1.1 维基百科定义

关于欧拉角的定义,维基百科中这样给出:莱昂哈德·欧拉提出用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何参考系,一个刚体的取向是依照顺序从这参考系做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。
对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系(固定系)又称为实验室参考系,是静止不动的。而坐标系(固连系)则固定于刚体,随着刚体的旋转而旋转。
简单来说,相对于旋转向量和旋转矩阵,欧拉角非常直观的描述了旋转,3个分离的转角可以把一个旋转分解成3次绕不同轴的旋转。
另外,在学习欧拉角之前,需要引入一些其他概念。

  • 参考系的概念
    参考坐标系可以放在空间的任何位置’每个参考坐标系都有其特定的物理意义。我们总是要定义一个相对静止的固定坐标系(fixed frame),即空间坐标系(space frame),例如,将空间坐标系选在房间的某个角落中。类似地,我们也经常至少选择一个附着在某一运动刚体上的随动坐标系,例如,选在房间中飞舞的四旋翼飞行器机体上。这个坐标系称为物体坐标系(body frame),它是一个在任一瞬时都与刚体随动坐标系相重合的静止坐标系。
    为简单起见,我们通常将附着在运动刚体上的坐标系称为物体坐标系。尽管如此,任一瞬时’物体坐标系实质上都是一个瞬时与刚体随动的坐标系相重合的静止坐标系。
    注意:所有坐标系都是静止的。
    这里所说的固定坐标系即为上述固定系,物体坐标系即为固连系。
  • 欧拉角正负的概念
    坐标系有左手坐标系与右手坐标系之分,这里,我们所描述的所有坐标系都遵循右于定则,如下图所示。其中正向转动的转轴方向可通过手指的指向来确定:当拇指指向轴线时,右手卷曲的方向。简答来说:右手系,旋转轴正方向面对观察者时,逆时针方向的旋转是正、顺时针方向的旋转是负
    右手定则
  • 旋转类型的概念
    内部旋转(固有旋转):是围绕附加到移动物体的坐标系XYZ的轴发生的基本旋转。因此,它们在每次元素旋转后都会改变方向。XYZ系统旋转,而xyz是固定的。从XYZ重叠xyz开始,三个固有旋转的组合可用于达到XYZ的任何目标方向。
    内旋
    由欧拉角 (α,β,γ) = (−60°, 30°, 45°)表示的旋转,使用z-x’-z″内部旋转
    外部旋转:是围绕固定坐标系xyz的轴发生的基本旋转。XYZ系统旋转,而xyz是固定的。从XYZ重叠xyz开始,三个外部旋转的组合可用于达到XYZ的任何目标方向。
    外旋
    相同的旋转由 (γ, β, α) = (45°, 30°, −60°) 表示,使用zxz外部旋转
    欧拉角通常表示为α、β、γ或ψ、θ、φ。不同的作者可能使用不同的旋转轴组来定义欧拉角,或者相同的角度有不同的名称。因此,任何使用欧拉角的讨论都应该先于它们的定义。
    不考虑使用两种不同约定来定义旋转轴(内部或外部)的可能性,存在十二种可能的旋转轴序列,分为两组:
  • 真欧拉角 (z - x - z, x - y - x, y - z - y, z - y - z, x - z - x, y - x - y)
  • (泰特-布赖恩角)Tait–Bryan角 (x - y - z, y - z - x, z - x - y, x - z - y, z - y - x, y - x - z)
    泰特-布赖恩角也称为万向角;航海角度;航向、海拔和坡度;或偏航、俯仰和滚转。有时,这两种序列都称为“欧拉角”。在这种情况下,第一组的序列称为适当的或经典的欧拉角。泰特-布赖恩角的内在旋转为z - y ′- x ″,外在旋转为x - y - z(内在旋转被称为:偏航(roll)、俯仰(pitch)和滚转(yaw))。
    飞机模型中的坐标很好的解释了这三个名词
    对于一架飞机,如果按正确的顺序完成,它们可以绕其主轴旋转三圈获得。偏航将获得方位,俯仰将产生仰角,滚动将产生倾斜角。因此,在航空航天中,它们有时被称为偏航、俯仰和滚转。请注意,如果以任何其他顺序应用旋转,或者如果飞机轴从任何不等于参考系的位置开始,这将不起作用
    飞机模型

1.2 ZYX欧拉角与rpy角

对于SLAM十四讲中的例子,我们可以看出,按照的是欧拉角ZYX内旋的方式进行的,
1.绕物体的Z轴旋转γ度,得到偏航角yaw;
2.绕旋转之后的Y轴旋转β度,得到俯仰角pitch;
3.绕旋转之后的X轴旋转α度,得到滚转角roll。
欧拉角形式旋转

ZYX欧拉角:按照内旋方式,Z-Y-X旋转顺序(指先绕自身轴Z,再绕自身轴Y,最后绕自身轴X),可得旋转矩阵(内旋是右乘):
R i = R z ( γ ) ∗ R y ( β ) ∗ R x ( α ) R_i=R_z(\gamma)*R_y(\beta)*R_x(\alpha) Ri=Rz(γ)Ry(β)Rx(α)rpy角:按照外旋方式,x-y-z旋转顺序(指先绕固定轴x,再绕固定轴y,最后绕固定轴z),可得旋转矩阵(外旋是左乘):
R o = R z ( γ ) ∗ R y ( β ) ∗ R x ( α ) R_o=R_z(\gamma)*R_y(\beta)*R_x(\alpha) Ro=Rz(γ)Ry(β)Rx(α)显然,按照内旋类型进行旋转的Z-Y-X欧拉角与按照外旋类型进行旋转的rpy(x-y-z)角等价。
关于内旋右乘,外旋左乘的知识,请参考这篇文章:旋转的左乘与右乘。
欧拉角转换成旋转矩阵(相对于世界坐标系的旋转矩阵)通常是按外旋方式(绕固定轴),即X-Y-Z顺序。

2 万向锁

2.1 万向节

维基百科解释道,万向节是一种枢轴支撑,允许物体绕轴旋转。一组三个万向节,一个安装在另一个具有正交枢轴的万向节上,可用于允许安装在最里面的万向节上的对象保持独立于其支撑的旋转(如下图动画中的垂直)。例如,在船上,陀螺仪、船上罗盘、炉子,甚至饮料架通常都使用万向节来使它们相对于地平线保持直立,尽管船在上下颠簸。
万向节
根据下图动画可知,欧拉角的工作方式与万向节几乎是一样的。
对应欧拉角
为了更清晰的观察万向节和欧拉角的相同之处,我们将上图动画进行分解,

  • X轴旋转->滚转(roll)
    roll
  • Y轴旋转->俯仰(pitch)
    pitch
  • Z轴旋转->偏航(yaw)
    yaw

2.1 万向锁的产生

根据上节对欧拉角的介绍,我们知道了欧拉角把3D 空间中任意一个旋转分解成了三次欧拉角旋转,并且介绍了rpy角和对偶的ZYX欧拉角,最终的旋转矩阵写成了三个矩阵相乘的形式。其中,每一次旋转变换就代表着有一个万向节。所以,在这里我们一共有固定的三个万向节。我们可以改变每次旋转的角度,但是不论怎么变化角度这个旋转的顺序都是不能改变的。
大部分情况下,这一套顺序都能够对三个不同的轴分别进行三次旋转。然而,在某一些特殊情况下,它其中的某两个旋转变换可能变换的是同一个轴(这里指的不是物体自身的轴,而是外部或者世界的轴),这样就导致我们丧失了一个轴的自由度,从而导致万向锁的产生。
假设我们使用𝑥-𝑦-𝑧的顺序旋转任意一个点。其中,我们沿𝑥轴旋转任意度数,沿𝑦轴旋转𝜋/2弧度,最后,我们再沿着𝑧轴旋转任意的度数。

首先沿着𝑥轴旋转任意的度数:沿着𝑥轴旋转任意的度数
接下来,我们沿𝑦轴旋转𝜋/2弧度:
沿𝑦轴旋转𝜋/2弧度
注意,经过这一次的变换之后,我们将𝑧轴变换到原来𝑥轴方向,而𝑥轴变到原来−𝑧的方向。
这个变换执行完毕后,我们仅仅只剩下一个𝑧轴的旋转矩阵了。然而,当前的𝑧轴与原来的𝑥轴重合,也就是说,最后𝑧轴的旋转与𝑥轴的旋转其实操纵的是同一个轴(同样,这里指的是外部的旋转轴,在图中用红色标出)。三次旋转变换仅仅覆盖了两个外部轴的旋转,一个自由度就这样丢失了,这也就导致了万向锁的现象。
现在,如果我们想要操纵第三个轴的旋转(也就是在𝑦轴变换之前𝑧轴所表示的竖直方向),就需要对𝑦轴变换之后的𝑥轴进行旋转.然而,唯一的𝑥轴万向节(或者变换)优先级在最外部,我们当时操纵它的时候,它操纵的外部旋转轴还与现在的𝑧方向相同,并不能补回这个自由度。
在此,假设绕XYZ三个轴旋转的角度分别为α、β、γ,给出三次旋转矩阵计算的公式
R x ( α ) = [ 1 0 0 0 c o s α − s i n α 0 s i n α − c o s α ] , R y ( β ) = [ c o s β 0 s i n β 0 1 0 − s i n β 0 c o s β ] , R z ( γ ) = [ c o s γ − s i n γ 0 s i n γ c o s γ 0 0 0 1 ] R_x(\alpha)= \begin{bmatrix} 1&0&0 \\ 0 &cos{\alpha}&-sin{\alpha} \\ 0&sin{\alpha} &-cos{\alpha} \end{bmatrix},R_y(\beta)= \begin{bmatrix} cos{\beta}&0 &sin{\beta} \\ 0 &1&0 \\ -sin{\beta}& 0 &cos{\beta} \end{bmatrix},R_z(\gamma)= \begin{bmatrix} cos{\gamma}&-sin{\gamma}&0 \\ sin{\gamma} &cos{\gamma}&0 \\ 0&0&1 \end{bmatrix} Rx(α)= 1000cosαsinα0sinαcosα Ry(β)= cosβ0sinβ010sinβ0cosβ Rz(γ)= cosγsinγ0sinγcosγ0001 下面,我们通过旋转矩阵对产生万向锁的变换进行数学上的理解
E ( α , π / 2 , β ) = R z ( β ) R y ( π / 2 ) R x ( α ) = [ 0 c o s ( β ) ∗ s i n ( α ) − c o s ( α ) ∗ s i n ( β ) s i n ( α ) ∗ s i n ( β ) + c o s ( α ) ∗ c o s ( β ) 0 s i n ( α ) ∗ s i n ( β ) + c o s ( α ) ∗ c o s ( β ) c o s ( α ) ∗ s i n ( β ) − c o s ( β ) ∗ s i n ( α ) − 1 0 0 ] = [ 0 s i n ( α − β ) c o s ( α − β ) 0 c o s ( α − β ) − s i n ( α − β ) − 1 0 0 ] = R y ( π / 2 ) R x ( α − β ) E({\alpha},{\pi/2},{\beta})=R_z(\beta)R_y(\pi/2)R_x(\alpha) =\begin{bmatrix} 0&cos(\beta)*sin(\alpha)-cos(\alpha)*sin(\beta)&sin(\alpha)*sin(\beta)+cos(\alpha)*cos(\beta) \\ 0 &sin(\alpha)*sin(\beta)+cos(\alpha)*cos(\beta)&cos(\alpha)*sin(\beta)-cos(\beta)*sin(\alpha) \\ -1&0&0 \end{bmatrix} =\begin{bmatrix} 0&sin(\alpha-\beta)&cos(\alpha-\beta) \\ 0 &cos(\alpha-\beta)&-sin(\alpha-\beta) \\ -1&0&0 \end{bmatrix}=R_y(\pi/2)R_x(\alpha-\beta) E(α,π/2,β)=Rz(β)Ry(π/2)Rx(α)= 001cos(β)sin(α)cos(α)sin(β)sin(α)sin(β)+cos(α)cos(β)0sin(α)sin(β)+cos(α)cos(β)cos(α)sin(β)cos(β)sin(α)0 = 001sin(αβ)cos(αβ)0cos(αβ)sin(αβ)0 =Ry(π/2)Rx(αβ)利用一些三角恒等式,我将原本由三个旋转矩阵所组成的变换化简成了两个变换矩阵。即便我们分别对𝑥-𝑦-𝑧三轴进行了旋转,实际上这个矩阵仅仅旋转了𝑥-𝑦两轴,它并没有对(初始的)𝑧轴进行变换。 𝑅 𝑧 ( β ) 𝑅_𝑧(\beta) Rz(β) 𝑅 𝑥 ( α ) 𝑅_𝑥(\alpha) Rx(α)这两个变换被合并为单独的一个 𝑅 𝑥 ( α − β ) 𝑅_𝑥(\alpha − \beta) Rx(αβ)变换(因为化简完之后变换顺序不一样了,严格来说并不是合并,只不过是能够使用一步来完成)。
注意,我们在这里化简的并不是单独的一个变换,而是一系列变换。因为它对任意𝛼 和𝛽 角都是成立的。也就是说,一旦𝑦轴上的变换角将这两个旋转轴对齐,我们就没有任何办法对最初的𝑧轴进行旋转了。无论𝑥轴与𝑧轴的旋转角是多少,变换都会丧失一个自由度。
当然这也不是说现在没有办法对最初的𝑧轴进行变换.我们只需要在最内部添加一个𝑥轴万向节,或者说在变换序列的最后再添加一个𝑥轴的旋转变换,就能解决问题了(注意下面经过 𝑅 𝑦 𝑅_𝑦 Ry变换之后 𝑅 𝑥 𝑅_𝑥 Rx操纵的其实是原本的𝑧轴):
E ( α , π / 2 , β , γ ) = R x ( γ ) R z ( β ) R y ( π / 2 ) R x ( α ) = R x ( γ ) R y ( π / 2 ) R x ( α − β ) E({\alpha},{\pi/2},{\beta},{\gamma})=R_x(\gamma)R_z(\beta)R_y(\pi/2)R_x(\alpha)=R_x(\gamma)R_y(\pi/2)R_x(\alpha-\beta) E(α,π/2,β,γ)=Rx(γ)Rz(β)Ry(π/2)Rx(α)=Rx(γ)Ry(π/2)Rx(αβ)然而,我们之前说过,我们选择的是固定的三个旋转顺序,实际上并没有这个第四个万向节,所以没办法解决这个问题。虽然你在当初选择顺序的时候也可以选择采用四个万向节的设计,但是这仍不能完全解决问题,因为除了𝑦轴之外其它轴的旋转仍然可能将其中的两个轴或者三个轴对齐,只不过现在万向锁产生的几率可能会变小而已。万向锁问题的核心还是在于我们采用了固定的旋转顺序。

创作不易,希望大家支持,多多点赞收藏!!!!非常感谢!!!!

参考资料:
https://en.wikipedia.org/wiki/Euler_angles
https://en.wikipedia.org/wiki/Davenport_chained_rotations
欧拉角与万向锁
https://en.wikipedia.org/wiki/Gimbal
https://wiki.ogre3d.org/tiki-index.php?page=Euler+Angle+Class
视觉SLAM十四讲:从理论到实践(第2版)(ISBN:9787121369421)
现代机器人学:机构、规划与控制(ISBN:9787111639848)
机器人学:建模、控制与视觉(ISBN:9787568062350)


http://chatgpt.dhexx.cn/article/AO4beJrt.shtml

相关文章

Unity 旋转欧拉角及万向锁问题

先说明unity 3D欧拉角的旋转顺序(父子关系)是y-x-z。即旋转y轴x和z轴都变,旋转x轴只有z轴变化,旋转z轴其它轴不变。 模型坐标系 又称物体坐标系。 与特定的物体关联,每个物体都有自己特定的坐标系。不同物体之间的坐…

万向锁的理解 欧拉角 四元数

1 欧拉角&万向锁 欧拉角和万向锁 视频资料理解万向锁 核心是嵌套 以一个三自由度的机械臂为例,三个旋转轴互相垂直,相当于x,y,z轴 三个机械臂通过旋转关节依次串联,定义第一个关节旋转轴为J1,以此类推第二第三个关节旋转轴为…

简单研究Unity中的万向锁和欧拉角以及四元数

欧拉角是欧拉在17世纪发明引进的一个数学工具,在三维欧几里得空间内,欧拉角可以确定一个物体的朝向。在解决静态问题上,欧拉角是一个比较完美的解决方案,但在动态问题上,欧拉角有一个万向锁的瑕疵,数学界在…

Unity万向锁

结论: 当第二轴旋转90时会产生万向锁,万向锁只发生在程序中,现实世界不会发生。 发生万向锁的底层原因是由于程序中会指定旋转顺序,且前后顺序为父子包含关系。 旋转顺序:因为同样一组数据,例如{X:10&…

欧拉角与万向锁—深度解读万向锁

文章目录 问题描述:Z轴不生效(轴向重合)轴向为什么会重合初态二次变换总结:解决办法: 相信很多人听说过欧拉角与万向锁,主要问题是欧拉角为什么会产生万向锁? 有矩阵解读法,但是不够…

关于万向锁(Gimbal lock)问题的理解及解决

有时间更新一下理解,现在回过头来看写的东西真是垃圾哈哈哈哈哈~~~~ 1. Gimbal lock的理解 万向锁(Gimbal lock): 一旦选择90作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只…

详解万向锁

最近在看高翔老师的slam十四讲时,对万向锁这个概念不是很清晰,于是从网上查了不少博客文档,最终明白了万向锁这个概念。 在此记录一下。 解释万向锁之前首先明白一下什么是欧拉角。 什么是欧拉角? 用一句话说,欧拉角…

java uuid多少位_UUID用在MySQL中,性能到底好不好?

如果你在网上快速的做一个关于 UUID 和 MySQL 的搜索,你会得到相当多的结果。以下是一些例子: 存储 UUID 和 生成列在 MySQL 中存储 UUID 的值说明 InnoDB 中的主键模型及其对磁盘使用的影响主键选型之战 UUID vs. INTGUID / UUID 的性能突破到底需不需要…

UUID 全世界的唯一id!(唯一的接口标识符)

UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。RFC 4122描述了具体的规范实现。本文尝试从它的结构一步步分析为什么它能做到唯一性?及各个版本的使用场景。 Format UUID使用16进制表示,共有36个字符(32个字母数字4个连接符"-&…

瓦片地图加载

OpenLayers之加载多源数据四:万能瓦片地图加载秘籍 不睡觉的怪叔叔 2018-08-02 13:46:59 7175 收藏 17 分类专栏: 开源GIS 目录 加载简单的瓦片地图 瓦片地图之高德地图 瓦片地图之百度地图 重新定义OpenLayers3的瓦片坐标系 分析瓦片地图坐标系…

QGIS 上加载瓦片地图(高德、ESRI、OSM等)

1. 在QGIS左侧的浏览面板中,选择XYZ Tiles节点,右键新建连接。在弹出的窗口中填入名称和瓦片地图的网址http://webrd02.is.autonavi.com/appmaptile?langzh_cn&size1&scale1&style7&x{x}&y{y}&z{z} ,保存。 2.将浏览…

QGIS二次开发:加载XYZ Tiles形式的瓦片地图

1.前言 QGIS官方提供的QGIS.exe可以加载远程地图提供商提供的基于URL格式的XYZ Tiles形式的瓦片地图。如:https://tile.openstreetmap.org/{z}/{x}/{y}.png ,开发者如果不能联网,也可以创建离线地图服务。如下:打开QGIS 3.26.2.exe,选择xyz Tiles节点,单击右键,选择“N…

Vue Mapbox 发布高德瓦片地图

一、需求来源 公司网站开发需求里需要做一个大屏看板,包含地图的功能,而且以后是要在内网使用的,也就是说不能使用在线网络。我在研究了(踩了一万个坑!!!)多个地图组件以后&#xff…

瓦片地图的入库

数据: 瓦片地图 数据库: MySQL 语言 : Java 方法: 用Java语言把瓦片地图以二进制的方式导入数据库 瓦片地图的存储格式 当我们用ArcMap切完瓦片之后, 它的存储方式是以级数,行列号的方式存储在文件夹中 级数: 行号: 列号: 一般的存储结构在数据库中存储它的 级数,行号,列…

各种瓦片地图

概述 研究了一阵子的地图,太过深奥了。写了一个小程序,可以下载瓦片地图。下面是各种瓦片图例。 瓦片地图 微软瓦片地图 图1 图2 谷歌瓦片地图 图3 图4 osm瓦片地图 图5 图6 天地图瓦片地图 图7 图8 水瓦片地图 图9 图10 后续 还…

geoserver发布TIF格式瓦片地图

一,准备tif地图 可以通过全能电子地图下载器获取地图(软件可以去淘宝下载) 二,geoserver发布tif 在geoserver安装文件夹中双击“startup.bat”打开服务(注意:为了防止端口占用,我这里更改了默…

Unity 瓦片地图

一些常见的使用类似方法绘制地图的游戏: 泰拉瑞亚: 如果有老哥玩过泰拉瑞亚的地图编辑器,其实unity瓦片地图和泰拉瑞亚地图编辑器手感类似 蔚蓝: 大名鼎鼎的蔚蓝也是如此 Untiy中制作2D俯视角游戏,往往需要使用瓦片地图…

瓦片地图下载工具

收费工具,学生党勿扰,白嫖党勿扰 收费金额:200元 MyChat:wangjianjun1018 瓦片地图下载工具 概述操作查看地图 下载链接说明后续 概述 最近花费一点时间,研究瓦片地图。在网上找了好久,有好多下载的提供商…

百度个性化瓦片地图下载

百度个性化瓦片地图下载 因为近期项目需求,客户项目在内网使用,不连接外网,因此地图不能使用在线地图,必须使用离线地图。 离线地图使用在之前的博客写过,就不在累述了。https://blog.csdn.net/weixin_42776111/arti…

Tilemap瓦片地图

可以用Tilemap工具来构建游戏世界的地图,创建瓦片地图时,Grid组件自动作为瓦片地图的父级,相比于传统使用照片搭建地图的方式,使用瓦片地图用来搭建地图可以更加迅速,而且使用传统方式搭建地图时,需要添加大量的碰撞体…