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

有时间更新一下理解,现在回过头来看写的东西真是垃圾哈哈哈哈哈~~~~






1. 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(规范化)!!!

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


参考文献:

  • 15
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值