我最近不得不将欧拉旋转速率转换为矢量角速度。据我了解,在局部参考中,我们可以通过以下方式表达矢量角速度:
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°/时间单位的偏航率相结合后,我最终遇到了这些俯仰和偏航角,为什么我仍然有侧倾(我原以为它们会以[0°,90°,90°]结尾。
我对四元数的轴+角度以及四元数与欧拉公式都非常有信心,因为我已经对它们进行了广泛的测试(通过单元测试和现场测试),但是我不确定欧拉旋转到角速度“转换”的比率。
[我的第一个赌注是我不了解欧拉旋转速率轴如何相互相互作用,我的第二个赌注是,欧拉旋转速率和角速度矢量之间的这种“转换”是不正确的。
欧拉角不是表示任意角度运动的好方法。它只是用于图形,游戏和机器人的简化。它们受到一些相当严格的限制,例如您的旋转仅由N
空间中的ND
个垂直轴组成。在现实世界中,旋转并不是这样工作的。在此球形端点的球形表示之上,它创建了许多奇点(您知道何时越过极点...)。
旋转运动类似于翻译:
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和增量旋转来完成。