欧拉角万向节死锁的问题困扰了自己很久,一直跟飞机结合不起来。昨天看代码,遇到用飞机三个姿态角度构造四元数的问题,百思不得其解。早上坐地铁,重新想这个问题。不成想这个问题还没弄明白,倒是明白了欧拉角万向节死锁的问题。这是不是就是所谓的“有心栽花花不开,无心插柳柳成荫”?

翻了一下之前写的wiki,发现有如下的记录:

在确定了当前姿态和目标姿态的差异后,算法是通过当前姿态计算出绕三个轴的旋转。也就是说,是以当前姿态的旋转轴为参考轴进行旋转。在转动的过程中旋转轴始终保持不变,直至该次旋转结束。而不是边旋转边变换旋转轴。

现在看来,这种理解是错误的。在确定了当前姿态和目标姿态后,中间会有一个插值过程,也就是飞控代码会将目标进行细分,分成一小步一小步来完成。飞机永远都是以当前姿态的下一小步作为间接目标,一步一步向最终目标逼近。这个间接目标就是参考姿态。

有了当前姿态和参考姿态后,飞机可以通过绕机身的三次旋转到达参考姿态。每次旋转后,旋转轴都在动态发生变化,而不是之前认为的旋转轴保持不变。因为飞机的控制,最终反映在电机的控制,而电机的控制,螺旋桨的拉力或扭矩永远是相对于机身坐标的。如果旋转轴保持不变,这对飞机的控制来说就是一个灾难。

欧拉角

欧拉角的核心思想是,在三维空间中,物体从一个姿态到另一个姿态,可以通过绕某一个旋转轴旋转一定的角度来实现。而三维空间中的一个旋转又可以分解为绕互相垂直的三个坐标轴的三次旋转。

之所以能够这样进行分解,最主要的原因就是三次旋转相互独立,互不干扰(死锁除外)。理解的关键点就在于虽然旋转轴随着每次旋转都在发生变化,但旋转的效果不受影响。

如下图,飞机处于标准状态。然后然后沿y轴,也就是yaw,旋转一个角度。

旋转后的飞机状态如下,通过和原坐标进行对比可以发现,y轴没有改变,x、z轴发生了改变。然后飞机再沿x轴,也就是pitch,旋转一个角度。

旋转后的状态如下。可以看到,这次x轴没有发生变化,但y和z轴发生了改变。从前后两次旋转可以看出,每次旋转都伴随着旋转轴的改变。但是第二次旋转只是改变了pitch角,对第一次旋转的yaw角没有影响。yaw保持不变。

同理,在上图的基础上旋转roll,yaw和pitch不受影响,保持不变。

所以飞机在空中飞行,姿态的确定需要有一个参考坐标系,这个坐标系就是我们熟知的通过重力和地磁确定的NED坐标。也就是说飞机的姿态是相对于NED坐标来说的。当我们需要飞机朝某个方向飞行时,需要通过调整飞机的姿态来实现(针对四轴)。比如向前飞,就需要机头向下倾斜,也就是我们需要的目标姿态。有了目标姿态我们就控制飞机沿自身的x轴旋转一个角度,从而达到我们的目的。但是如果既要往前,又要往右飞呢,这个时候就需要飞机机头向下倾斜的同时,机身向右倾斜,在控制机身沿x轴旋转的同时还要沿z轴旋转。

前右方向飞行属于复合运动,其实质是前飞和右飞两个运动的合成。如果再加上yaw,就是三个,但道理相同。由于欧拉角比较直观,在地面站或最终的电机动力分配上都采用了欧拉角。

万向节死锁

有了上面的分析,万向节死锁的问题也就迎刃而解。欧拉角之所以能够通过三次分旋转来表示空中任意的旋转,是因为三次旋转的旋转轴有差异性。就像线性代数中三个线性无关的向量,能张成一个三维的空间。

但如果三次旋转中的两次旋转轴重合,欧拉角的效力就会大打折扣,能表达的旋转量也就不是全部了。就好比是,三个向量中有两个线性相关,就不能张成三维空间,而只能张成一个二维的平面。

但欧拉角中,两个旋转轴重合的情况无法避免。比如在三次旋转中,若第二次的旋转为90°,就会导致第三次的旋转轴和第一次的旋转轴重合。从而失去一个自由度,这就是万向节死锁。

设想一个场景,飞机初始姿态和NED坐标重合。目标姿态是(0°,90°,60°)。这就是说yaw旋转0°,pitch旋转90°,roll旋转60°。直白一点的说就是,机头向下旋转90°,然后向右倾斜60°。事实上,由于第二次旋转的90°导致第一次和第三次旋转轴重合,无论怎么旋转,roll都不会发生变化。

这大概就是万向节死锁对飞机控制的影响了吧。

参考

欧拉角死锁_欧拉角与万向节死锁相关推荐

  1. 万向节死锁_欧拉角的奇异问题和万向节死锁问题,会对实际的哪些应用带来什么问题?...

    谢邀,这个问题打算认真回答一次,所以要准备准备,先留个爪子,后面娓娓道来,先简单点的说几句,起个头: 1.俯仰角90°的这个问题,又或者有时候我们称呼为横滚角,我一般会用横滚角说超过90°,这是依据实 ...

  2. 欧拉角会出现Gimbal Lock万向节死锁

    Gimbal Lock ... Maybe it's a bit difficult to understand. OK, let me show you a real sence. 可能有点不好理解 ...

  3. java jstack 死锁_利用jstack检测死锁DeadLock

    首先,制造一个死锁程序如下: public class testJstack { final static Object obj_1 = new Object(); final static Obje ...

  4. java中死锁_关于java中死锁的总结

    关于死锁,估计很多程序员都碰到过,并且有时候这种情况出现之后的问题也不是非常好排查,下面整理的就是自己对死锁的认识,以及通过一个简单的例子来来接死锁的发生,自己是做python开发的,但是对于死锁的理 ...

  5. 操作系统中的死锁_操作系统中的死锁介绍

    操作系统中的死锁 1.1究竟什么是僵局? (1.1 What exactly is a deadlock?) In a multiprogramming environment, there may ...

  6. sql活动监视器 死锁_监视SQL Server死锁–简单方法

    sql活动监视器 死锁 SQL Server is a very powerful tool and wherever I go, I see the tool being way much unde ...

  7. sql server死锁_了解SQL Server死锁图的图形表示

    sql server死锁 #contentor img { float: left; } #contentor img { float: left; } 介绍 (Introduction) If yo ...

  8. oracle 行级死锁_解决Oracle数据库死锁

    介绍 本文我们尝试总结在多个用户并发情况下,如何识别和解决删除操作期间发生的死锁问题,在开始之前,我们先简单描述一下什么是死锁以及什么东西会导致死锁. 死锁 在任何数据库中发生死锁都是不愉快的,即使是 ...

  9. java jstack 死锁_用jstack找死锁

    java死锁主要依靠jstack命令来查找. 检测jstack 先配置好jdk环境变量,打开一个终端命令行,输入jstack回车.如果看到如下的字样,说明jstack是可用的. Usage: jsta ...

最新文章

  1. jQuery.append()、jQuery.html()存在的XSS漏洞
  2. 没落的Ubuntu Touch想翻盘:新技术可运行Android应用
  3. HDU 2255 二分图最佳匹配 模板题
  4. android获取手机机型、厂商、deviceID基本信息
  5. linux 提取日志字段,记一次Linux下提取MySQL日志关键字段
  6. 成都女孩弃港大全额奖学金,将去北大读马克思,“我对党史和马克思很有感情”!...
  7. 十二、ubuntu20.10(Linux)下Pycharm配置pyqt5开发环境
  8. chromebook刷_使用Chromebook编码
  9. 给下拉框加上可输入查询特性,包括中文与拼音首字母
  10. 下载android平台源码
  11. 用python实现bt下载_python实现bt种子 torrent转magnet
  12. fatal error C1010: 是否忘记了向源中添加“#include stdafx.h”?
  13. 第六次作业阶段一 学生成绩录入系统设计与实现
  14. 最新VSCode格式化代码不换行
  15. 基于小波域的隐马尔可夫树模型的图像去噪方法
  16. 20款优秀的数据可视化工具 (建议收藏)
  17. 计算机无法关闭密码保护,Win7密码保护共享关闭不了怎么办?密码保护共享关不掉的解决方法...
  18. 推荐一个免费的论文查重检测软件PaperRight
  19. matlab 色彩布局描述符(Color layout descriptor)
  20. Network Battery for mac(实时网速显示和电池健康) 教程

热门文章

  1. oracle 中clob,oracle中clob转换
  2. JS设置页面form内的所有元素(input textarea select)为只读属性
  3. mysql创建数据表并添加数据的相关命令及操作(二)
  4. 2019年09月11日星期三 恒指/美原油/美黄金 走势分析
  5. CESM2.2_CLM5.0 (fake)single point(伪)单点模拟√
  6. 我整理的CSS - lbx
  7. 宁哥自编自导自演的《C语言,好爽》第7版(2017年)教程内容
  8. 计算机硬件配置信息主要指标,2015计算机三级考试《网络技术》基础知识:计算机硬件系统...
  9. Java根据日期计算年龄——精确到天
  10. 20221014 芯片封装介绍