欧拉角死锁_欧拉角与万向节死锁

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

翻了一下之前写的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都不会发生变化。

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

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值