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

article/2025/7/21 0:13:32

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

万向锁(Gimbal lock): 一旦选择±90°作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。

对于万向锁的问题,只有在动态欧拉角中出现,而静态欧拉角不存在万向锁的问题!!!

  • 静态: 即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态,此时各个变换顺序的旋转矩阵是左乘的

  • 动态: 即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态,此时各个变换顺序的旋转矩阵是右乘的

  • 内旋Intrinsic rotations:绕运动轴

  • 外旋 Extrinsic rotations: 绕固定轴
    在这里插入图片描述

不管采用哪种欧拉角,只要中间的变换旋转90°就会发生Gimbal lock问题!!!

案例1:
一个典型的万向锁问题可以表述如下:先heading45°再pitch90°,这与先pitch90°再bank45°是等价的。事实上,一旦选择±90°作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。这种角度为±90°的第二次旋转使得第一次和第三次旋转的旋转轴相同的现象,称作万向锁。

在这里插入图片描述
在这里插入图片描述

案例2:

首先确定手机的物体坐标系朝向,假设z轴与手机屏幕垂直(手机平放于桌面)指向上方,手机较短的一条边为x轴,较长的一条边为y轴(方向由手机尾部指向头部),物体坐标系的原点是手机左下角的顶点。(注意旋转顺序为zyx)

绕z轴旋转任意角度(注意x和y轴也跟着一起旋转),再绕y轴旋转90°,再绕x轴旋转任意角度。通过多次尝试,会发现一个共同点:z轴永远是水平的, 通俗的说,手机永远也不会立起来(旋转形成的三维空间是固定的)!本来以为手机会指向任何方向,但实际上手机好像是被锁在桌面上,只能指向水平的某个方向,这个现象就称为万向锁。

而如果绕y轴旋转不等于90°(1°也好89°也好),只要选择适当的绕x和z的角度,就可以让手机指向三维空间中的任何一个方向,手机是自由的(旋转产生的三维空间不会完全重叠),也就不会遇到万向锁现象。

2. 解决方案

(1)使用四元数来解决

将欧拉角转换为四元数,对四元数进行slerp插值,再将这一系列四元数转换为对应的欧拉角,而后作用于目标。

缺点是耗费一定的内存,但目标可以任意旋转,灵活度高。

(2)为什么要使用四元数

一是由于万向锁的问题,二是插值的时候直接对RPY插值可能导致不平滑,插值结果可能有跳跃;

而且四元数表示旋转,计算次数更少,最关键的一点是它非常非常非常适合插值!!!

最常用的是球面线性插值~

但要注意:使用四元数插值时,插值结果需要进行归一化(有些地方也叫规范化或者规格化),否则单位长度会发生变化!!!

3. 欧拉角与四元数的对应

欧拉角(pitch yaw roll)←→四元数(第一个值是实部,后面三个是虚部)
0.0, 0.0, 0.0←→1.000000, 0.000000, 0.000000, 0.000000
90.0, 0.0, 0.0←→0.707107, 0.707107, 0.000000, 0.000000
0.0, 90.0, 0.0←→0.707107, 0.000000, 0.707107, 0.000000
0.0, 0.0, 90.0←→0.707107, 0.000000, 0.000000, 0.707107

4. 使用四元数时的注意事项

注意不要将一个绕RPY的旋转使用三个四元数来描述,旋转完再转换回去发现卵用没有,仍会出现Gimbal Lock问题!!!

正确的姿势应该将RPY这个绕三轴的三次变换,当成一次变换,使用四元数来描述!!!

注意:这里说的是动态欧拉角

使用四元数变换完记得要对改变后的四元数进行Normalize(规范化)!!!

仔细理解该文中的例子:传送门


参考文献:

  • https://blog.csdn.net/hangl_ciom/article/details/98170231
  • https://blog.csdn.net/lmonkey000/article/details/51001753
  • https://baike.baidu.com/item/%E4%B8%87%E5%90%91%E9%94%81/15817326?fr=aladdin
  • https://www.cnblogs.com/psklf/p/5656938.html
  • https://www.cnblogs.com/psklf/p/5667593.html
  • https://www.qiujiawei.com/quaternion3/
  • https://www.qiujiawei.com/quaternion4/
  • https://www.cnblogs.com/ymd12103410/p/9985063.html

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

相关文章

欧拉角表示旋转会出现的问题——万向锁(Gimbal Lock)

本文用来总结万向锁问题。尽量写得非常简单,方便自己复习和后人理解,水平有限若有错误请指教。 一、旋转的表示 本文中矩阵计算的结果是在世界坐标系(称之为North East Down Frame NED Frame)中的坐标; 参考文章中最后矩阵计算的…

旋转矩阵、欧拉角,万向锁的危害

1. 万向锁会带来什么危害? 最近看了很多万向锁的文章,大家都集中于讲述万向锁的成因,最后都会加上句“导致缺失一个方向的自由度”,但是万向锁现象到底会给实际工作带来什么问题?具体点,万向锁会给姿态解算…

资料分享:一文搞懂万向锁

大家好,我是被深圳台风吹飞的小鱼。台风老哥太暴躁,早上上班裤子都湿了 今天给大家分享一篇文章,主要讲的是欧拉角的万向锁现象,大家知道表示旋转的方式有很多,其中欧拉角就属于比较常见的一种方式,但是欧…

【SLAM学习笔记1】欧拉角之万向锁问题(Gimbal Lock)

文章目录 前言一、欧拉角1.欧拉角是什么?2.使用欧拉角的优缺点 二、万向锁问题的预备知识1.Gimbal(平衡架)2.相关术语 三、万向锁问题1.Gimbal Lock(万向锁问题)的现象2.Gimbal Lock(万向锁问题&#xff09…

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

[视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁 1 欧拉角1.1 维基百科定义1.2 ZYX欧拉角与rpy角 2 万向锁2.1 万向节2.1 万向锁的产生 1 欧拉角 1.1 维基百科定义 关于欧拉角的定义,维基百科中这样给出:莱昂哈德欧拉提出用欧拉角来描述刚体在三维欧几里…

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 后续 还…