欢迎光临ELBE网站!
您的位置: ELBE > 行业资讯 > 三维旋转与万向节死锁
网站头像

文章分类

Article classification
联系我们

ELBE

电话:021-58780503 微信:18017854633 邮箱:sales_fullyear@126.com 地址:上海市浦东新区城南路168弄3号峰汇商务广场B座911室
三维旋转与万向节死锁
时间:2022-12-15 查看:16 作者:小叶

本文重点讨论万向节死锁是什么,为什么会产生,因此,将逐步从旋转的定义出发。

旋转的定义

在一个给定的三维坐标系中,围绕一个不动点的旋转可以定义为任何点在旋转前后,到不动点的距离都是不变的。公式是:

因为三点可以确定一个平面,所以x, f(x), p(即旋转前的点、旋转后的点、不动点)构成一个平面,称为旋转平面。根据旋转定义,我们可以知道,x, f(x)这两点到不动点的距离是相等的,所以x, f(x)事实上,以不动点为中心的圆上有两点。如下图所示,旋转程度的概念可以用圆中的角度来定义,称为旋转角。

从上面可以发现,三维旋转可以用旋转平面、不动点、旋转方向和旋转角来定义。如果旋转前的点是原始点,旋转可以定义为:在旋转平面上,以不动点为中心,以不动点到原始点的距离为半径做一个圆,以原始点为起点在圆上画一个弧。弧的中点为旋转点。

旋转代数表示

我们已经知道,旋转可以用旋转平面、不动点、旋转方向和旋转角来定义,但如果计算机想要表示旋转,它需要更多的代数表示,最好是向量和矩阵的排列。让我们一个接一个地看看:

旋转平面只是一个普通的平面,任何平面都可以用平面上的一点和垂直于平面的法向量来定义。我们知道原始点和不动点必须在旋转平面上,所以用一个向量来表示旋转平面就足够了。不动点只是由相应的坐标值组成的向量。旋转方向,我们可以定义旋转方向平面的法向量,以满足右手螺旋法则的方向。右手螺旋法则意味着举起右手,竖起拇指,让拇指向法向量方向,最后把剩下的四个手指放进手掌,然后四个手指的方向是旋转的方向。旋转角只是一个实数来表示大小。

综上所述,如果一个旋转需要代数来表示,则需要四件事:一个表示旋转平面法线方向的向量,一个表示不动点的向量,一个表示旋转角度的实数。

如果我们规定不动点是原点,并使用右手螺旋法来寻求旋转方向,并称旋转平面法向量为旋转轴,那么旋转只有两件事:旋转轴、旋转角-一个向量和一个实数。当我们说旋转时,我们指的是这样一个旋转只由旋转轴和旋转角表示。

旋转的运算

上面最后指出,旋转只能通过旋转轴和旋转角来表示,因此它确实很容易被计算机存储,但我们的最终目标是快速计算旋转点的坐标。因此,我们不仅需要存储,还需要一套方便的操作方法。

注:一般来说,旋转操作有两种方法,矩阵操作和四元数操作。这里只提到矩阵操作的想法,因为四元数,必须解释数学,更麻烦,适当使用,四元数不会带来通用锁的问题。

通过叠加实现计算机中的计算旋转。首先,很容易理解,如果你先做一个旋转,然后做另一个旋转,那么这两个旋转叠加的效果实际上相当于一个等效的旋转,即两个旋转叠加或一个旋转。这是因为根据旋转的定义,两点到不动点的距离不会改变两次旋转。具体来说,如果原点是x,第一次旋转变成了x一、二次旋转后x2,那么x, x1, x2到不动点的距离是相等的,所以我们可以把x到x整个过程被视为单独旋转。

其次,我们应该能够更容易地接受一个结论:任何旋转轴的旋转都可以由三个单独绕组x,y,z轴的旋转叠加。也就是说,如果C是任意旋转,总会有绕x轴的旋转X,绕y轴旋转Y,旋转z轴Z,使得C(p)=Z(Y(X(p)))。这里不展开这个结论。通过应用这个结论,计算机可以用三个旋转叠加来表示任意旋转。而绕x, y, z轴旋转后的点比较容易得到。

以z轴为旋转角θ例如,如果旋转前点的坐标是

,旋转后的坐标是

,则有

,如果以矩阵和向量的形式写,那就是

。关于x, y轴的旋转也可以用矩阵操作来表示。

矩阵之间可以通过乘法计算得到一个新的矩阵,所以如果绕组z,y,x轴的旋转矩阵分别为Z,Y,X,所以它们的乘积ZYX也是旋转矩阵。

万向节死锁

从上面可以看出,我们总是可以用三个分别来表示绕组x,y,z轴旋转矩阵的乘积表示任何旋转操作。这似乎没有问题。事实上,在大多数情况下,没有问题。

这里要稍微偏离一下话题,考虑一下自己的手臂。通过观察手臂的结构,我们可以发现它大致是肩膀-肩关节-上臂-肘关节-小臂-腕关节-手。也就是说,我们用三个关节连接四个部分,这为我们的手臂提供了灵活性,因为我们的骨头可以在关节处旋转。如果没有关节,手臂会笔直,不能弯曲。让我们做一个不切实际的假设。假设肩关节只能沿z轴旋转(上下抬起上臂),肘关节只能绕y轴旋转(将手臂缩回胸部),腕关节只能绕x轴旋转(让拳头像拨浪鼓一样旋转),然后摊开手,考虑手掌和手指的方向。假如我们的关节能360度旋转,那就和上面提到的三个坐标轴一样。在转动肩关节时,显然我们的手掌也会转动,改变方向,这表明肘关节的转动作用于手的转动。显然,肘关节和腕关节的旋转也会影响到手,也就是说,三个关节的旋转叠加在手上。另一方面,我们的手掌和手指可以朝任何方向,因为上面提到的任何旋转都可以由三个坐标轴的旋转叠加而成。好像没问题。

但此时考虑一种情况,如图所示(模型使用) ** gic poser web),抬起上臂,把小臂抬到胸前。然后尝试腕关节和肩关节的旋转,我们会发现这两个不同关节的旋转会使手掌的方向相同——它们都沿着z轴旋转,即肩关节周围的轴,而手指的方向是固定的。换句话说,我们应该分别沿着x轴,z轴这两个方向的旋转现在变成了同一个方向的旋转。

为什么会这样?注意三个关节不是独立的:肩关节的旋转会带动肘关节和腕关节的运动,肘关节的旋转也会带动腕关节的运动。就像这三个关节都会在手臂末端工作一样,上面的关节也会影响下面的关节。同时旋转肩关节会驱动肘关节和腕关节,因此对肘关节和腕关节旋转的影响是相同的。但肘关节只能带动腕关节,不能带动肩关节。在上述情况下,将手臂抬到胸部的行为会转动肘关节,从而影响腕关节,但不影响肩关节,导致腕关节旋转的效果与肩关节旋转相同。

回到原来的问题,在计算机中使用三个矩阵来表示任意旋转也会有同样的问题吗?之所以会出现上述问题,是因为中间的关节会影响底部的关节,而不会影响顶部的关节。看看矩阵表示的旋转。我们用它ZYX这个矩阵乘积表示任意旋转,即p'=ZYXp,我们将Z,Y,X,ZYX这四个矩阵都写出来看看:

若我们取

,则乘积变为

,注意到,无论我们如何修改它,我们都注意到它θ、φ,都不会改变z’的值,z’始终等于-x。也就是说,当我们沿y轴旋转90时°时,此时X,Z两个旋转矩阵都在旋转z轴。这和以前手臂的情况是一样的。因为矩阵的相乘作用也是有序的,我们先左乘X,再左乘Y,所以在乘Y的时候,其实已经乘进去了。X。乘Z时,会对X和Y同样的影响。所以这里的p相当于我们手掌和手指的方向,X相当于腕关节,Y相当于肘关节,Z相当于肩关节。Y会影响X,但不会影响XZ,使X成为与Z同轴旋转的矩阵。

结语

本文介绍了计算机中旋转的定义和操作方法,然后重点介绍了随后的万向节锁问题。顺便说一句,我想提一下万向节。原万向节之所以会出现万向节死锁问题,也是因为三个环不完全独立,中间环会驱动最内环,但不会影响最外环。万向节死锁问题是一个不可避免的问题,只要使用不相互独立的三次旋转来表示任意旋转,就会带来这个问题。然而,万向节锁并不可怕。它只会出现在极端值的中间旋转中。如果我们只是想表示旋转,万向节锁不会带来任何问题。毕竟,我们总能找到三个沿坐标轴旋转的旋转来表示任意旋转。万向节死锁只会导致飞机控制、旋转插值等问题,需要连续旋转叠加。因此,本文未提及的四元数在这方面的应用中被广泛引用。

什么是万向节死锁,为什么会出现这个问题,真的困扰了我很久。仅此而已 ** 如有不正之处,请指出记录。

继续阅读与本文标签相同的文章
cache
Processed in 0.008068 Second.