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

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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.