试一文讲清“万向节死锁”

2023-11-02 07:50
文章标签 死锁 一文 万向节 讲清

本文主要是介绍试一文讲清“万向节死锁”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

引入欧拉角

万向节死锁

从图形上理解万向节死锁

从数学上理解万向节死锁


引入欧拉角

        这里先讲欧拉角。什么是欧拉角?

百度百科:用来确定定点转动刚体位置的3个一组独立角参量,由章动角θ、旋进角(即进动角)ψ和自转角φ组成,为欧拉首先提出而得名。

        说的简单些:欧拉角的目的就是描述物体或者物体自身坐标系相对于当前世界的绝对坐标系的一种位姿方向的方法。物体坐标系的变化一般都能分解成三个欧拉角, 也就是三次连续的旋转运动,而且每次旋转的轴线要保证与前后旋转运动的轴线正交。下面的图描述了欧拉角的三次旋转过程:

图片源自:http://img-blog.csdnimg.cn/2019081521302698.gif#

万向节死锁

        “万向节”一词,我看到的第一印象就是机械设计里的一个典型的传动件,叫做万向连轴器。万向连轴器由两个不共线的轴组成,能多实现转动自由度的传导,如果去查一下这个零件原理动画就能发现与本文所讲的万向节结构有很大相似度。下面开始切入万向节死锁的分析。

图片源自:https://www.163.com/dy/article/ETT9BTS70512WI81.html

        先摆出结论:万向节死锁产生的根本原因,简单说就是欧拉角的3次旋转过程中产生了1次旋转轴的重合,这就导致原来的3个旋转自由度实际退化成为2个有效的自由度,也就是说绕3个轴的旋转等效成了在绝对坐标系中2个轴的旋转。随着我们一步步的分析再回头看该结论对这句话的理解会更加透彻。

从图形上理解万向节死锁

        这里我们把问题尽量简单化,先不必须计较旋转方向,即随意方向旋转随意方向,也先不讲内旋、外旋等多余的知识。如下图所示,黑色坐标系为基于右手坐标系建立的最初的坐标系。

        第一次旋转:绕坐标系x-y-z的x轴旋转θx角度,形成新的坐标系x'-y'-z';

        第二次旋转:绕坐标系x'-y'-z'的y'轴旋转θy角度,形成新的坐标系x''-y''-z'';

        第三次旋转:绕坐标系x''-y''-z''的z''轴旋转θz角度,形成新的坐标系x'''-y'''-z''';

        但是,当绕y'轴的旋转角度θy=90度时,会出现一种特殊的情况,如下图所示:

        首先我们假设在我们进行旋转变换的空间内存在某个一成不变的“固定坐标系”,且理解成绝对坐标。默认第一次旋转完全一致,请看第二次旋转过程:如果绕y'轴的旋转角度90度恰好导致旋转后(图中红色)的z''轴与旋转前(图中蓝色)的x'(或者最初的x)轴重合。这样就会导致一个问题出现:就是接下来的第三次旋转因为势必要绕z''轴进行旋转,但是第三次绕z''轴进行的旋转在绝对坐标系下的表现出的效果完全可以靠第一次绕x轴进行的旋转代替。这也就解释为什么在前文讲的“3个旋转自由度实际退化成为2个有效的自由度”,就是因为1、3次的旋转运动相当于重合的。当y'轴的旋转角度-90度时,情况可以类比。

从数学上理解万向节死锁

        数形结合,我们可以从数学上证实上述情况。我直接引用了本科的机器人基础这门课里的几个旋转矩阵,道理相通的,如下图所示是绕不同轴的旋转矩阵。坐标系在空间中的旋转动作,在矩阵计算的表达就是初始坐标系乘旋转矩阵。

        对于在图形篇里所说的绕y'轴旋转角度为90度的情况下,那旋转矩阵Ry的值自然变成: 

        前文所述的三次旋转变换可以表达为:

        我们看结果:在锁定y轴旋转自由度的运动为y轴旋转90度的情况下,最终的姿态只是θx-θz的函数。如果令α=θx-θz,就是说本来Rx旋转矩阵中我们把旋转角度在θx的基础上再减少θz,那么根本不需要再乘旋转矩阵Rz,Rx*Ry就OK了,导致的结果就是少了一个自由度的运动,形成了“万向节死锁”。

这篇关于试一文讲清“万向节死锁”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

一文详解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中启动参数的各种用法

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

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con

一文详解Nginx的强缓存和协商缓存

《一文详解Nginx的强缓存和协商缓存》这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、强缓存(Strong Cache)1. 定义2. 响应头3. Nginx 配置示例4. 行为5. 适用场景二、协商缓存(协

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO