首页 > 解决方案 > 了解角速度及其应用

问题描述

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

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°] 结束。

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

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

标签: math3drotationquaternionseuler-angles

解决方案


欧拉角不是表示任意角运动的好方法。它只是用于图形、游戏和机器人技术的简化。他们有一些非常严格的限制,比如你的旋转只包含空间中的N垂直轴ND。这不是旋转在现实世界中的工作方式。在 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是经过的时间(计时器间隔)。

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

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

这可以通过使用累积同质变换矩阵和增量旋转来完成。

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

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


推荐阅读