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

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

相关文章

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图