一文读懂旋转矩阵,欧拉角,以及万向锁问题

2023-12-28 19:08

本文主要是介绍一文读懂旋转矩阵,欧拉角,以及万向锁问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一文读懂旋转矩阵,欧拉角,以及万向锁问题

一:物体的姿态描述
物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接。用坐标系{B}的三个单位主矢量{Xb,Yb,Zb}相对于参考坐标系{A}的方向余弦组成的3*3的矩阵来表示刚体B相对于坐标系{A}的方位,(_B^A)R称为旋转矩阵。
在这里插入图片描述

式中,上标A代表参考坐标系{A},下表B代表被描述的坐标系{B},(_B^A)R共9个元素,但只有三个式独立的。三个单位列矢量两两相互垂直,长度为1,因而它的9给元素满足正交条件:
在这里插入图片描述

旋转矩阵是正交的,并且满足条件:
在这里插入图片描述

例如:
在这里插入图片描述

如图所示有两个坐标系{A}与{B},坐标系相对于参考坐标系{A}沿X轴旋转了θ角度,坐标系{B}的三个单位主矢量为Xb,Yb,Zb,
其中Xb相对与参考坐标系{A}的方向余弦为(1,0,0)
Yb相对与参考坐标系{A}的方向余弦为(0,cos⁡(θ), sin⁡(θ))
Zb相对与参考坐标系{A}的方向余弦为(0,-sin⁡(θ),cos⁡(θ))
故:
在这里插入图片描述

对于绕X,Y,Z作转角为θ的旋转变换,其旋转矩阵分别为(与右手系旋转方向相同的为旋转正方向):
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二:欧拉角
一个坐标系相对于另一个坐标系的姿态可以用一个旋转矩阵来表示,而且可以通过绕着坐标轴一定序列的旋转来完成坐标系之间的转换。欧拉角规定了一个旋转序列,如先绕z轴旋转ϕ角,再绕新的y轴旋转θ角,最后绕新的z轴旋转ψ角来描述任何可能的姿态。
则欧拉旋转矩阵:
在这里插入图片描述

三:欧拉角的旋转顺序
欧拉角的旋转顺序有多种,都可以用来描述从一个坐标系到另一个坐标系的变化,也就是姿态变化,一般分为两大类:
Proper Euler angles (z-x-z, x-y-x, y-z-y, z-y-z, x-z-x, y-x-y)
Tait–Bryan angles (x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z).
每个大类都使用了3个变量描述三次旋转过程中的旋转角度, 差别在于Proper Euler angles只涉及两个转轴.而Tait–Bryan angles涉及三个转轴。Tait–Bryan angles也被称为万向节角,航向角。在飞行器中应用最多的是yaw(偏航), pitch(俯仰), roll(横滚)三个航向角,三个变量一般对应飞行器的z,y,x三个坐标轴。

四:欧拉角的内旋外旋
内旋(intrinsic rotations) = 旋转轴(rotated axis)
外旋(extrinsic rotations) = 固定轴(static/fixed axis)
描述物体姿态是一共有两个坐标系,与机体固连的机体自身坐标系,还有一个是世界坐标系。那么每次旋转时的旋转轴也有两种,如果是绕着固定的世界坐标系的坐标轴进行旋转,那么称为外旋(绕着物体外部的旋转轴进行旋转),如果每次都是绕着新的机体自身的坐标系进行旋转就称为内旋(绕着物体自身坐标系旋转)。对于不同的旋转顺序其旋转矩阵的乘积顺序是不一致的,内旋从左向右乘,外旋从右向左乘。
例如,规定了旋转顺序为z-y-x:那么
在这里插入图片描述
内旋顺序z-y-x等价于外旋顺序x-y-z
故用欧拉角来表示物体姿态或者旋转时,需要定义以下三个元素
1:旋转顺序;2:旋转角度;3旋转方向(内/外旋)

五:旋转矩阵
对于不同的旋转顺序,其欧拉角旋转矩阵可以参考以下这张表,c代表cos,s代表sin,1、2、3代表旋转角度(来源于维基百科):
在这里插入图片描述
这张表描述了所有旋转的组合.以最后一行为例,我们可以把这里的公式认为是Z->X->Y内旋 or Y->X->Z外旋.从矩阵的角度就是ZXY.

六:旋转矩阵与欧拉角的转换
设三个轴x,y,z的欧拉角分别为θx,θy,θz,采用内旋的方式沿着z-y-x的顺序旋转,正弦值、余弦值分别为sx,cx,sy,cy,sz,cz那么旋转矩阵为:
在这里插入图片描述

由旋转矩阵求欧拉角:
在这里插入图片描述

解方程得:
在这里插入图片描述
从式中可以看出,θ=90度时,会产生除数为0的奇异点,这在物理空间上被称为万向节死锁问题,就是当三个旋转中间的这个角旋转达到90度时,第一次旋转和第三次旋转的旋转轴会产生重合,导致第三轴失去意义。原因是方向余弦矩阵无法完全描述SO3所代表的三维旋转群,在某些位置会出现奇点。

七:万向节死锁(Gimbal Lock)
首先理解几个基本的概念:
俯仰(pitch):
在这里插入图片描述
偏航(yaw):
在这里插入图片描述

滚转(roll):
在这里插入图片描述
万向节:

yaw:
在这里插入图片描述pitch:
在这里插入图片描述
roll:
在这里插入图片描述
观察下面这个gif你会发现当转轴1和转轴3位于同一平面后,中间的飞机会失去一个yaw方向的自由度,出现了万向锁!!!
在这里插入图片描述
再继续观察下面这个gif,代表y轴的gree和代表z轴的bule位于同一平面,两个轴重合,1个自由度消失。
在这里插入图片描述
此时,如果想要中间的箭头做浅灰色的运动,由于消失一个自由度、则需要多个轴一起旋转。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述如此,该箭头的运动轨迹变成了一条曲线。

总结:欧拉角的“万向节死锁”问题,是由于欧拉旋转定义本身造成的。万向节死锁的结果,不是说不能旋转了,而是会导致不自然的旋转。

附加:
旋转坐标变换
设坐标系{B}与坐标系{A}有共同的坐标,但两者的方位不同,用旋转矩阵R表示{B}相对与{A}的方位,即从A系到B系的旋转矩阵。同一点p在两个坐标系{A}和{B}中描述的坐标有以下关系
在这里插入图片描述

注意:此公式的坐标为固定坐标系下的坐标,右边为动坐标系下的坐标, R为从固定坐标系到动坐标系的旋转矩阵,之所以左边为固定坐标系下的坐标,是因为这是为机器人专门设计的旋转矩阵,机器人的基座标系为固定坐标系,一般都是将末端执行器上即动坐标系上面一点相对与该动坐标系的坐标转换到基体坐标系下。
而对于无人机,其mpu求得的加速度等都是相对与世界坐标系的,但是无人机所需要的是相对于基体坐标系的角度,故需要将世界坐标系下求得的加速度转换到基体坐标系下才有意义,所以无人机的坐标变换矩阵下面这种方式更有意义。
在这里插入图片描述
参考:
《euler(gimbal)explained》
《机器人学基础》蔡自兴
https://blog.csdn.net/AndrewFan/article/details/60981437#
https://www.matongxue.com/madocs/442
https://www.zhihu.com/question/47736315
《多旋翼无人飞行器嵌入式飞控开发指南》

这篇关于一文读懂旋转矩阵,欧拉角,以及万向锁问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546970

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2