【问题标题】:Understanding Angular velocities and their application了解角速度及其应用
【发布时间】:2020-04-20 19:08:37
【问题描述】:

我最近不得不将欧拉旋转速率转换为矢量角速度。 据我了解,在局部参考中,我们可以通过以下方式表达矢量角速度:

R = [rollRate, pitchRate, yawRate] (which is the correct order relative to the referential I want to use).

我也知道我们可以通过以下方式将角速度转换为给定时间步长的旋转(四元数):

alpha = |R| * ts
nR = R / |R| * sin(alpha) <-- normalize and multiply each element by sin(alpha)
Q = [nRx i, nRy j, nRz k, cos(alpha)]

当我为每个轴单独测试时,我发现了我完全期望的结果(即 1 个时间单位的 90° 俯仰/时间单位 => 90° 俯仰角)。

但是,当我使用两个轴作为旋转速率时,我并不完全理解结果:

例如,如果我使用 rollRate = 0, pitchRate = 90, yawRate = 90,对给定的时间步应用旋转并将得到的四元数转换回欧拉,我得到以下结果:

(ts = 0.1)  Roll:  0.712676, Pitch:  8.96267, Yaw:   9.07438
(ts = 0.5)  Roll: 21.058,    Pitch: 39.3148,  Yaw:  54.9771
(ts = 1.0)  Roll: 76.2033,   Pitch: 34.2386,  Yaw: 137.111

我了解“平稳”连续旋转可能会在中途改变滚动组件。

但我不明白的是,在 90°/时间单位 pitchRate 加上 90°/时间单位 yawRate 的完整单位时间后,我最终得到了这些俯仰角和偏航角,为什么我仍然有滚动(我原以为它们会以 [0°, 90°, 90°] 结束。

我对我的轴 + 角度到四元数和我的四元数到欧拉公式都非常有信心,因为我已经对这些公式进行了广泛的测试(通过单元测试和现场测试),但是我不确定欧拉旋转速度到角速度的“转换”。

我的第一个赌注是我不明白欧拉旋转率轴如何相互作用,我的第二个赌注是欧拉旋转率和角速度矢量之间的这种“转换”是不正确的。

【问题讨论】:

    标签: math 3d rotation quaternions euler-angles


    【解决方案1】:

    欧拉角不是表示任意角度运动的好方法。它只是用于图形、游戏和机器人技术的简化。他们有一些非常严格的限制,例如您的旋转仅包含 ND 空间中的 N 垂直轴。这不是旋转在现实世界中的工作方式。在 reper 端点的这种球形表示之上,它会产生许多奇点(你知道当你越过两极时......)。

    旋转运动类比平移:

    position       speed                    acceleration
    pos = Integral(vel) = Integral(Integral(acc))
    ang = Integral(omg) = Integral(Integral(eps))
    

    在某些更新计时器中可以重写为:

    vel+=acc*dt; pos+=vel*dt;
    omg+=eps*dt; ang+=omg*dt;
    

    其中dt 是经过的时间(计时器间隔)。

    旋转的问题是不能像平移那样叠加。由于每个旋转都有自己的轴(并且不需要轴对齐,也不需要居中),并且每次旋转也会影响所有其他旋转的轴方向,因此它们的顺序很重要。最重要的是,还有陀螺力矩从任何两个没有平行轴的旋转中产生第三次旋转。把所有这些放在一起,你会突然发现欧拉角与真正的旋转几何/物理不匹配。他们可以描述方向并在一定程度上伪造它的旋转,但不期望真正有意义一旦用于物理模拟。

    真正的模拟需要由轴描述的旋转列表(不仅是方向,还有原点)、角速度(及其变化),并且在每个模拟步骤中重新计算轴的变化(除非只有单次旋转存在)。

    这可以通过使用累积 homogenous transform matrices 以及增量旋转来完成。

    遗憾的是,大多数程序员更喜欢欧拉角和四元数,只是因为他们不知道有更好和更简单的选项,一旦他们这样做了,他们无论如何都会坚持欧拉角,因为矩阵数学对他们来说似乎更复杂......这就是为什么现在的大多数游戏都有万向节锁定、严重的旋转错误和故障、不切实际的物理现象。

    不要误会我的意思,它们仍然有它们的用途(例如限制免费查看相机等......但它们误用了它们是更糟糕的选择。

    【讨论】:

    • 我确实在我的模拟中使用了四元数(据我所知,它不受万向节锁的影响),我只使用欧拉角进行人类交互(根据我的经验,人脑不喜欢四元数)。当我必须在变换/旋转空间中投影一个(或多个)点时,我也会使用变换矩阵。但我的问题不是一个点如何通过变换的空间投影,而是空间是如何变换的。对于您在该主题上的回答,如果我理解正确,我的问题来自我试图描述的旋转不是围绕单个轴的事实,对吧?
    • 我也明白你更喜欢 4*4 矩阵而不是四元数。欧拉角,我会理解,但它们比四元数有什么优势?除了旋转原点(只要您不打算通过它投影点/形状就没有特别的意义)?
    • @AxelPaccalin 4x4 矩阵按其顺序坚持变换的累积。四元数没有,因为它们只是旋转。是的,它们可以累积方向,但任何翻译都必须在其他地方定义,一旦完成,您就不能再堆叠变换了。相反,您需要从每个帧中的某个起点旋转,滴答,无论如何,一遍又一遍地进行所有变换......同样在 4x4 矩阵中,您可以直接访问和使用表示的坐标系属性,因为您有 3 个基向量,和位置。这对于局部坐标系的变换和移动来说非常好。
    • @AxelPaccalin 您还可以推导矩阵位置以获得速度,加速。最重要的是,这些线性代数适用于它们,因此您可以在任何坐标系之间进行简单的转换。还从输入和输出等中推断出变换......我不使用四元数,但我认为它们没有任何能力......在 gfx 中使用四元数,因为那里更快。与 Bresenham 类似的情况在很长一段时间内都不是这样……由于 CPU 架构的变化,过去较慢的更简单的技术现在要快得多。我认为 486 是门槛
    • 我是这么想的(我前段时间写了一个基本的游戏引擎,所以对这些比较熟悉)。然而,在这里,我只需要表示从质心开始的旋转,因此没有平移、没有比例、没有剪切。那么对于我最初的问题,如果我没有得到我期望的输出是因为我试图期望的旋转不是围绕单个轴?还是因为每个轴上的累积旋转在另一个轴上复合?因为我看不出轴顺序有问题的原因,因为旋转矢量围绕单个轴(漩涡)。
    猜你喜欢
    • 2014-12-30
    • 2014-11-01
    • 2017-02-05
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多