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

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了,导致的结果就是少了一个自由度的运动,形成了“万向节死锁”。

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


原文地址:https://blog.csdn.net/qq_43439214/article/details/134109715
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/329190

相关文章

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个