首页>总结报告>万向节总结(热门11篇)

万向节总结(热门11篇)

时间:2024-04-09 11:39:34 总结报告

万向节总结 第1篇

首先要明确,旋转分两种,1,基于模型旋转,2,基于世界旋转。

基于模型旋转的时候,会出现万向节死锁现象。

这里要明确第二件事,所谓的基于模型旋转,并不是一般想象中基于三根永远互相垂直的轴(或者说永远互相垂直的旋转面),就像世界坐标轴那样。而是基于下图这样的三个可以自由旋转的轴(注:该图中是用旋转面来体现的,轴为垂直于旋转面),因此,它们存在两个旋转面重合的情况。

(gif截自_show/,这个比b站的机翻版好很多,建议看一下,加深对万向节原理的理解) 这种重合仅出现在中间那次旋转为90度时,这是因为,旋转顺序具有层级,子层级无法带动父层级运动(可以看视频来加深对这句话的理解)。以y(绿,偏航),x(红,俯仰),z(蓝,桶滚)的顺序来举例,层级为y最高,x中间,z其次,在运动的初始,转动绿轴(绕y轴),会使箭头做偏航的运动,且作为最高层级,它会带动另外两个轴,因此,顺序1的运动无法导致两个旋转面重合。 顺序2为绕x轴运动,可以看到,转动红色的圈(这里再次强调下,我这里表述不严谨,转动红圈其实是绕着红轴旋转,这里红圈是旋转面,红轴即x轴是垂直于这个红色的圆圈的),转动红圈,可以看到箭头做俯仰运动,以及它无法带动绿色的父级一起旋转,这就导致了,一组旋转顺序中,顺序2的旋转有可能导致另外两个旋转面重合,并且,显然是旋转直角的度数(不一定是90,90+360也行呀,270也行呀)。 如下图,两个旋转面重合。旋转面重合是死锁的本质成因,后面会进行更深入的分析,到这里,需要理解的是两个旋转面重合的成因。

总结一下,三个旋转中,只有第二次旋转有可能导致两个旋转面重合,因为第一次旋转是最高层级,它会带动另外俩轴一起运动,让三个旋转面始终保持垂直。第二次旋转是次高层级,它无法带动第一次旋转的面,而可以带动再次一层的面,因此它可能导致两个面重合。第三次旋转是最底层的,它谁也带不动,只能在它自己的平面上旋转,所以单独旋转最次一层的圈,也不会导致两个面重合。 观察一下重合后的状态,接下来按照计划,顺序3为转动蓝轴(绕z轴)运动,这会让箭头做滚桶运动。

万向节总结 第2篇

利用四元数(Quaternion)来进行旋转。

四元数本质上是一种高阶复数,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。Unity中,存储四元数信息,我们可以使用一个四元数来执行一个旋转。

举例说,把点P(1, 0, 1)绕旋转轴u = (0, 1, 0)旋转90°,求旋转后的顶点坐标。首先将P扩充到四元数,即p = (P, 0)。而q = (u*sin45°, cos45°)。求p′=qpq−1的值。最后的结果p'= ((1, 0, -1), 0),即旋转后的顶点位置是(1, 0, -1)。

Unity内部使用四元数表示所有旋转。Unity API中并未对四元数进行详细的定义,仅是提供了常见的若干四元数函数,比如, ,,, 和等。

在Unity中,使用四元数进行旋转,比欧拉旋转更强大,能够进行增量旋转,能够避免万向锁,还能进行球面差值。

使用四元数来实现一定角度的平滑旋转的简单示例如下:

using ;

using ;

using UnityEngine;

public class rotate : MonoBehaviour

    [SerializeField]

    float rotateSpeed = 2f;

    bool isClick = false;

    Quaternion targetAngles;

    private void Start()

    {

        // ()第二个参数需要的是四元数,所以这里需要将目标的角度转成四元数去计算

        targetAngles = (0, 90f, 0);

    }

    // Update is called once per frame

    void Update()

    {

        // 用 slerp 进行插值平滑的旋转

        = (, targetAngles, rotateSpeed * );

        // 当初始角度跟目标角度小于1,将目标角度赋值给初始角度,让旋转角度是我们需要的角度

        if ((targetAngles, ) < 1)

        {

            = targetAngles;

        } 

    }

参考文章:

万向节总结 第3篇

平衡环架(英语:Gimbal)为一具有枢纽的装置,使得一物体能以单一轴旋转。由彼此垂直的枢纽轴所组成的一组三只平衡环架,则可使架在最内的环架的物体维持旋转轴不变,而应用在船上的陀螺仪、罗盘、饮料杯架等用途上,而不受船体因波浪上下震动、船身转向的影响。

       上图就是一个Gimbal装置了,它是一个陀螺仪。中间有一根竖轴,穿过一个金属圆盘。金属圆盘称为转子,竖轴称为旋转轴。转子用金属制成,应该是了增加质量,从而增大惯性。竖轴外侧是三层嵌套的圆环,它们互相交叉,带来了三个方向自由度的旋转。 看着不停转来转去,有点晕,接下来看两个静态的。这两张图来自百度百科。

其中Gimbal只代表陀螺仪装置中的平衡环,显然维基百科上将它解释成“平衡环架”更为合理。

万向节总结 第4篇

Unity API中对的定义是,本身是Vector3,即三维矢量,含有x、y、z三个参数。

1.以欧拉角为单位的旋转;

、y、z角度分别表示先围绕z轴旋转z度,再围绕x轴旋转x度,最后围绕y轴旋转y度;

3.仅使用此变量读取角度并将其设置为固定值。不要增加它们,因为当角度超过360度时会失败。应使用来执行旋转操作。

◆此处“角度超过360度时会失败”的理解是,Unity内部使用四元数去执行旋转,不会存储欧拉角的累计值,欧拉角只代表了等值的旋转变化结果,当旋转角度X超过360度时,存储的角度为X-360,例如,361度等同于1度,722度等同于2度。

同时,Unity API提醒我们不要单独设置一个欧拉角的参数(例如,;),这将导致错误的旋转,应当同时对x、y、z三个参数进行设置。

万向节总结 第5篇

万向节死锁/奇异点本质为:三个自由度变为两个自由度(丢失一个自由度);

构建方向余弦矩阵通常是绕X、Y、Z轴中的某一个或两个轴,三次旋转而成;因此,奇异点最直观的表征就是欧拉角的计算;通过上面分析可以看出:

定义1:3-1-2旋转,(航向角-俯仰角-滚转角):其奇异点存在于俯仰角为±90°时,横滚角和航向角存在多值性,一般假设航向角为0读,去求解横滚角。

定义2:3-1-3旋转,(航向角-俯仰角-航向角):其奇异点存在于β为0°时,但是求解的欧拉角没有直观的物理意义。

定义3:3-2-1旋转,(航向角-滚转角-俯仰角):其奇异点存在于俯仰角为±90°时,横滚角和航向角存在多值性,一般假设航向角为0读,去求解横滚角。

(1)坐标系的相互变换可以通过:旋转矩阵、四元数、欧拉角等方式去描述,但是奇异点是一种客观存在,并且根据旋转顺序的不同,可以看出对于同一个空间状态变化,有多种欧拉角(多种旋转矩阵)表现形式,共计12种旋转方式;其中每一种旋转矩阵在求解欧拉角时都存在奇异点!

(2)欧拉角:非常直观,我们可以很容易理解它的意思,也能想象出对应的空间位置,但是存在万向锁现象,导致后面有很多数学问题。

(3)旋转矩阵:旋转矩阵有9个元素,计算繁杂,尤其是求微分时,而且也不直观。

(4)四元数:没有奇点,能表征任何旋转关系,而且表示简单,只有四个元素,计算量小,但是不直观。

参考链接:

《捷联惯导算法与组合导航原理讲义》

《坐式垂直起降无人机的一种姿态解算算法的设计》

万向节总结 第6篇

当转子高速旋转时,若外力矩作用于外环轴,陀螺仪将绕内环轴转动;若外力矩作用于内环轴,陀螺仪将绕外环轴转动。其转动角速度方向与外力矩作用方向互相垂直。

当陀螺转子以高速旋转时,在没有任何外力矩作用在陀螺仪上时,陀螺仪的自转轴在惯性空间中的指向保持稳定不变,即指向一个固定的方向;同时反抗任何改变转子轴向的力量。

沿着机身横轴/X轴进行旋转,为pitch俯仰角。 沿着机身纵轴/Y轴进行旋转,为Roll,横滚角。 沿着机身立轴/Z轴进行旋转,为Yaw,航向角

 陀螺仪工作示意图:

这里,我把三个Gimbal环用不同的颜色做了标记,底部三个轴向:

假设现在这个陀螺仪被放在一艘船上,船头的方向沿着+Z轴,也就是右前方

       Roll: 现在假设,船体发生了摇晃,是沿着前方进行旋转的摇晃,也就是桶滚。由于转子和旋转轴具有较大的惯性,只要没有直接施加扭矩,就会保持原有的姿态。由于上图中绿色的活动的连接头处是可以灵活转动的,此时将发生相对旋转,从而出现以下的情形:

       Pitch:再次假设,船体发生了pitch摇晃,也就是俯仰。同样,由于存在相应方向的可以相对旋转的连接头(红色连接头),转子和旋转轴将仍然保持平衡,如下图:

        Yaw:最后假设,船体发生了yaw摇晃,也就是偏航,此时船体在发生水平旋转。相对旋转发生在蓝色连接头。如下图:

现在看起来,这个陀螺仪一切正常,在船体发生任意方向摇晃都可以通过自身调节来应对。然而,真的是这样吗?

假如,船体发生了剧烈的变化,此时船首仰起了90度(这是要翻船的节奏。。。。),此时的陀螺仪调节状态如下图:

此时,船体再次发生转动(横滚角),可以看出航向角已经和俯仰角耦合在一起了;

现在,转子不平衡了,陀螺仪的三板斧不起作用了。它失去了自身的调节能力。那么这是为什么呢?

万向节总结 第7篇

总结一下,在这三次运动中,我们分别进行了偏航,俯仰,桶滚运动,看似很ok?何来丢失自由度一说?明明三种运动都照顾到了呀。这里应当这样理解,想在顺序1中完成俯仰,一定有一根确定的轴可以使用(即只需要围绕某一根轴调整角度,即可完成俯仰),这是因为每一次基于三个欧拉角的旋转,都是由垂直的三个旋转面开始的。因此,顺序1中,可任意通过一根确定的轴来完成三个运动中的任一个(俯仰,桶滚,偏航),因此,顺序1存在三个可自由调整的自由度。

接下来,在顺序2中,也可以通过一根确定的轴来指定任意一种运动,因为,在顺序1的旋转结束后,三个旋转面依旧是互相垂直的,只不过在顺序1的带动下,与初始坐标轴的角度有所区别,但依旧是互相垂直的(因为顺序1会带动另外两个轴一起动)。

因此,如顺序1一样,在三个旋转面互相垂直的情况下,顺序2也有三个自由度可挑选,你依然可以基于一根确定的轴来进行任一类型的运动,因此,顺序2也存在三个可自由调整的自由度。

(补充:基于哪根轴做哪种运动,通常是人工定义的,这里不必拘泥,理解即可,但是要统一!不能一会儿x偏航一会儿x滚动这样,对一个模型来讲运动是要统一的,这样才能用欧拉角来指挥模型做某种确定的运动)

综上,在前两次动作中,你可以俯仰,俯仰,或者俯仰桶滚,俯仰偏航,这都是可以用一根确定的轴来完成的。例如30,30,的围绕X,X的旋转,意为俯仰30度,再俯仰30度,30,30,基于X,Y是俯仰30后偏航30,或者基于Y,Z是偏航后桶滚,基于X,Z,怎样组合都行,都可以正确表达运动类型。

但是,如果顺序2的运动导致了两个旋转面重合,那么,在下一次运动时,则无法通过选择绕某个轴,来正确表达某种确定的运动,也即绕某个轴与某种运动种类,无法严格一一对应了。

如本文中的例子,按90度转动红轴后(不厌其烦的再次提醒下,转动红轴意为绕x轴旋转,只是说转动红轴比较形象,x轴垂直于红圈,红圈是绕x轴旋转的旋转面),蓝旋转面(绕z轴)与绿旋转面(绕y轴)重合了。

此时,顺序3的操作,就无法由一个确定的轴来直接决定了。

例如,30,90,60,基于X,Y,Z的旋转,按照这个设计理论,我们是希望模型先俯仰(绕x),再偏航(绕y),最后桶滚(绕z),这是本文中的例子,通过xxx婆妈妈的分析,你会发现,对呀!确实是俯仰,偏航,桶滚呀?没有死锁(失控/运动与绕确定轴无法一一对应,总之随便你怎么讲)呀?

那如果是30,90,60基于X,Y,X呢?设计理论应该是,俯仰(绕x),偏航(绕y),再俯仰(绕x),但实际上呢?

实际上,前两个运动确实如我们所愿,是俯仰30度,偏航90度,但是!由于此时桶滚面与俯仰面重合了,(蓝面绿面重合),因此,再转动绿轴(绕x运动),无法俯仰了!变成桶滚了!

如下图所示,在这种情况下,顺序3将无法通过一个确定的轴做俯仰运动,在这个情况下,原本绕蓝(z)轴应该是桶滚,这是ok的,绕y(绿)轴应该是偏航,但如图所示,此时还是滚动,绕x轴(红)应该是俯仰,但如图,现在变成偏航了! xxx妈了一句还不够,再强调下,对于一个模型,或者一个物理体系下,绕某个轴旋转==做某种运动,这个必须是严格一一对应的,这样才能使欧拉角有控制运动的效果。

倒不是说全世界都必须用同一种设定,只是说对于一个可旋转的局部区域、物体等来讲,这个对应必须是严格唯一的,不能一会儿x轴代表俯仰,一会儿x轴代表滚桶,如果这个对应不是唯一的,那你写代码的时候,或者控制飞机飞行的时候,该怎么控制?

拿着飞机遥控器,难道还要实时判断一下,此时按哪个键才是俯仰吗?

综上所述,在两个旋转面重合时,顺序3的运动,将无法使用如同顺序1与顺序2的运动设定了,顺序3的运动,失控了。

这就叫万向节死锁,这个名怪好听的,但其实如果你真的理解了我上面的分析,读到这里,应该知道万向节死锁这个名字蛮难理解的,倒不如说基于欧拉角来控制物体运动,有可能导致失控(即想俯仰,结果偏航了之类的)比较好理解些。

万向节总结 第8篇

       空间中的任意两个矢量,都可以通过平动和转动得到;也即6个自由度;通常利用加速度计和陀螺仪来实现这种关系。以转动为例,三维空间中的一个矢量,经过三次坐标系基本旋转可以得到另外的一个矢量;其中,有12中旋转顺序:

       首先旋转X、Y、Z轴任意一轴,有三种可能;然后旋转第一次为旋转的任意一轴,有两种可能;最后旋转除去第二次旋转轴,的任意一轴;总计:3*2*2=12种方式。

万向节死锁现象本质就是转动由3个自由度变为2个自由度!

通常对于飞控、惯性导航种的影响/考虑有几下几种:

(1)某一个轴向角度出现奇异点;

(2)是不是只有旋转矩阵相乘中会出现这种现象?

(3)“转动”中的描述方式,有几种?

(4)万向节死锁应该怎么避免?还是系统固有属性,无法避免?

(5)……

针对上面有可能的疑问,下面进行解读:

首先根据《捷联惯导算法与组合导航原理讲义》中的附录,给出三种欧拉角的定义:

θ为俯仰角;γ为横滚角;ψ为航向角;

(1)其方向余弦矩阵为:

(2)根据方向余弦矩阵可以得出运载体的欧拉角:

θ为俯仰角;γ为横滚角;ψ为航向角;

(1)其方向余弦矩阵为:

(2)根据方向余弦矩阵可以得出运载体的欧拉角:

由于是3-1-3旋转,因此,所求欧拉角为:航向角、俯仰角、航向角;既:α、β、γ

角度求解:

可以看出,在β为±90°时,并不存在奇异点;但是当β为0°时,存在奇异点!

而且,此种3-1-3旋转方式,没有明确的物理意义!

θ为俯仰角;γ为横滚角;ψ为航向角;

(1)其方向余弦矩阵为:

(2)根据方向余弦矩阵可以得出运载体的欧拉角:

由于是3-2-1旋转,因此,所求欧拉角为:航向角、滚转角、俯仰角;既:ψ、γ、θ

可以看出,按照3-2-1旋转,最终在横滚角为±90°时,存在奇异点;一般令航向角为0°,进而求出俯仰角。

万向节总结 第9篇

这个视频站在矩阵运算的角度详细介绍了欧拉角,旋转矩阵,四元数,以及它们之间的相互转换,还有基于世界运动与基于模型运动分别是怎样给点乘以怎样的旋转矩阵,以及还给出了一个有价值的定理:顺序的基于模型的运动,==逆序的基于世界的运动,这些不一定有助于你更进一步理解万向节,但有助于加深对旋转的理解,以及,也许有助于你去书写自己的旋转函数,强烈建议有空看下。

欧拉角是无法直接用于旋转计算的,本质需要转换成旋转矩阵或者四元数才能作用于向量,其中,转换为四元数是不会引起万向节死锁的,因为万向节死锁本身只会出现在将一个旋转拆分为三次旋转的情况下,而四元数是基于一个轴的旋转,不会引起万向节死锁。

而转换为三个旋转矩阵,再将其按照一定的顺序作用于向量,是会导致万向节死锁的。

又或者是,只有转换为三个旋转矩阵再作用于向量,才会导致死锁,这是导致死锁的唯一原因。

此外,其余不会触发万向节死锁的旋转方法有:轴角,基于一个3x3矩阵,或基于一个表示旋转的4x4矩阵。

补充:将欧拉角的三个旋转矩阵乘完变成一个3x3或4x4矩阵也还是会导致死锁的,并不是乘完变成一个矩阵就没有这个现象了。

综上,既然欧拉角转四元数即可避免死锁,那么这是可以完全避免的吗?并不是,因为并不是每一种欧拉角的旋转顺序都可以计算出四元数,这里看一下欧拉角转四元数中,判断旋转顺序的源码,可以发现,可转四元数的顺序不包括重复的,也就是类似XYX这样的顺序,因此如果要实现诸如XYX,ZYZ这样的运动,首先这玩意不能转四元数,因此只能用三个旋转矩阵来计算,而这种情况下,还是要面临万向节死锁!

因此,实际上万向节死锁是无法完全消灭的,总要去面对它。

我们并不一定用一点点修改欧拉角来做动画的,因为这让人难以掌控,比如,用欧拉角表示的姿态1,与用欧拉角表示的姿态2,中间用怎样的方式计算插值呢?显然无法用欧拉角的简单连续变化来完成。

只修改一个角度的话,用基于欧拉角的旋转来转动到下一个姿态还是可以的,但两个以上的欧拉角就不是那么个回事儿了,你可以尝试一下能不能脑补出来俩欧拉角甚至仨欧拉角都在变化时,怎么计算欧拉角的插值。

基于上述原因,各大引擎中给了我们基于四元数的插值计算方法,一个叫slerp,一个叫lerp,lerp是线性插值,也就是,把两个姿态,认定为两个点,然后把这俩点连线,在线上按照百分比返回下一个点,这是一种线性的过渡方法,叫线性插值。

slerp是球面插值,在这里,认为两个姿态是两个向量,然后按角度的百分比返回下一个点,就像这个点在球面上,按照一段弧线过渡到另一个点一样。

用threejs的话,也是有这两种插值计算法的,一个在V3点的类下,一个在四元数的类下,好好在xxx找下类里的方法即可。

但还是要注意一下,slerp是按照两点在球上的最短弧来计算插值(过渡)的,如果要绕个圈圈再到达最终姿态,则还是要通过欧拉角来计算插值,理解深入后,使用哪种方法,就看需求了。

万向节总结 第10篇

如果空间几何思维够好的话,可以想象一下,如果离重合只差一咪咪呢?如下图。再贴一下本文中一一对应的设定:y(绿,偏航),x(红,俯仰),z(蓝,滚桶)。

顺序2未导致蓝绿面重合,虽然只差一咪咪,但顺序3中,转动绿圈依然可以让箭头在一个很小的范围内做偏航。

发挥你聪明的大脑想一下,不行就掏一根笔出来,这支笔平放在桌面上,围绕垂直桌面的轴运动,可以看到笔在做“偏航”运动,逐渐把这只笔提起来,让笔尖向上,但并不垂直,此时还是围绕垂直桌面的轴旋转,笔尖的运动状态是在空气中画了一个小圆圈,也就是依然是可以做“偏航”运动的,但当笔尖垂直于桌面呢,此时围绕垂直桌面的轴,就只能做桶滚运动了!

为了避免萌新混乱,这里讲下为什么在笔尖向上提的过程中,偏航轴永远垂直于桌面,因为在本例中,顺序3是最底层的运动了,它无法带动前面顺序1与顺序2的圈的运动,而笔尖提起(俯仰,x,红)是顺序2,也无法带动顺序1的绿圈,因此笔尖提起(俯仰)然后在空中画圈(偏航)这个过程,绿圈永远不动,绿轴(y,偏航)永远垂直于桌面。 总结一下,万向节死锁只由顺序2的运动造成,而本质是两个旋转面的重合,以及失控只发生在顺序3的运动,即在顺序3中,无法用一组严格一一对应的轴==运动来控制模型进行某种指定的运动(桶滚,俯仰,偏航)。

在顺序3中,它还是在运动的,但已经脱离人类那套规则的掌控了!这就是万向节死锁造成的严重问题。

万向节总结 第11篇

万向节,也叫平衡环架(Gimbal),具有枢纽的装置,使得一物体能以单一轴旋转。由彼此垂直的枢纽轴所组成的一组三只平衡环架,则可使架在最内的环架的物体维持旋转轴不变。常常应用于船上的陀螺仪、罗盘、饮料杯架等。

在飞行器的航行中,进行XYZ三个方向旋转的旋转有专业的术语,见下图:

沿着机身右方轴(Unity中的+X)进行旋转,称为pitch,中文叫俯仰。 

沿着机头上方轴(Unity中的+Y)进行旋转,称为Yaw,中文叫偏航。 

沿着机头前方轴(Unity中的+Z)进行旋转,称为Roll,中文叫桶滚

当飞行器或者船体发生桶滚、俯仰和偏航时,陀螺仪中的转子和旋转轴具有较大的惯性,会保持原来的姿态,而其余的环则会发生旋转,最终保证轩子和旋转轴的平衡,如图所示:

当飞行器和船体仰起90度时,陀螺仪状态如下:

此时沿蓝色轴转动,则转子和旋转轴将无法保持平衡。

现在,

红色连接头:提供一个相对俯仰的自由度。

绿色连接头:提供一个相对偏航的自由度。

蓝色连接头:提供一个相对偏航的自由度。

3个连接头只提供了两个自由度,桶滚的自由度丢失了,这种现象被称为“万向节死锁”。

更加进一步地分析原因,欧拉角的X轴转动造成最后的变化结果,受到到了预先执行的Z轴转动的影响,它仍然会造成某个相对自身的轴向的变化,但是结果不唯一;同样,欧拉角的Y轴转动,则受到了Z轴和X轴的影响,结果更加不唯一。

由于沿XYZ轴的转动遵循Unity中欧拉旋转的顺规和轴向定义,有些情况下会造成某个轴向自由度的丢失。

再追究其本质,从欧拉角到旋转是一个多对一的映射(即不同的欧拉角可以表示同一个旋转方向),而且并不是每一个旋转变化都可以用欧拉角来表示。