如何从欧拉角计算 'rotational mobility' 的度量?

How can I calculate a measure of 'rotational mobility' from Euler angles?

奇怪的问题,但我无法将其归结为一个连贯的问题。

我从 Brekel OpenVR 记录器中采样了数据 (60Hz),其中包括 HMD 本身的以下参数:

我正在处理 python 中的数据。总的来说,我想做的是计算流动性的措施:有人在某个片段中环顾四周的次数多了还是少了,他们四处走动的次数多了还是少了?

对于不太难的位置坐标,我可以通过后续位置之间的距离来计算位移、速度等。现在对于欧拉角,我遇到了更多麻烦。

我已经搜索了我的问题的答案,但 none 的答案似乎是 'click'。 我认为我需要的是将欧拉角转换为方向向量,然后计算后续样本的方向向量之间的角度,以查看注视方向偏移了多少。 一旦我有了这些,我可以计算每个主题的均值和 SD,看看他们中的哪些人环顾四周更多(反正就是这个想法)。虽然我不清楚数学。如果我的坐标是滚动、俯仰、偏航会更容易,但我正在为欧拉角而苦苦挣扎。

假设两个后续样本的欧拉角为:

我如何量化这两个样本之间 HMD 方向变化的角度?

您可以编写一个函数将欧拉角转换为单位向量,另一个函数获取两个单位向量之间的角度

from math import cos, sin, atan2, degrees, radians, sqrt
from numpy import dot, cross

def to_unit_vector(pitch, yaw, roll):
    # Convert degrees to radians
    pitch = radians(pitch)
    yaw = radians(yaw)
    roll = radians(roll)
    # Calculate unit vector components
    x = cos(yaw) * cos(pitch)
    y = sin(yaw) * cos(pitch)
    z = sin(pitch)
    return x, y, z

def angle_between(a, b):
    # returns angle in degrees
    return degrees(atan2(sqrt(dot(cross(a, b), cross(a, b))), dot(a, b)))

然后举例

>>> u = to_unit_vector(20, 25, 50)
>>> u
(0.8516507396391465, 0.39713126196710286, 0.3420201433256687)
>>> v = to_unit_vector(30, 35, 60)
>>> v
(0.7094064799162225, 0.49673176489215404, 0.49999999999999994)
>>> angle_between(u, v)
13.481723224800309