如何从欧拉角计算“旋转流动性”的度量?

2024-05-23 20:07:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题很奇怪,但我很难把它归结为一个连贯的问题

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

  • 十、 Y,Z位置坐标
  • 欧拉角旋转,旋转,旋转

我正在用python处理数据。总的来说,我想做的是计算流动性的度量:在某个细分市场中,是否有人或多或少地环顾四周,他们是否或多或少地走动

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

我一直在寻找我问题的答案,但没有一个答案是“点击”的我想我需要的是将欧拉角转换成方向向量,然后计算后续样本的方向向量之间的角度,看看凝视方向移动了多少。一旦有了这些,我就可以计算每个受试者的平均值和SDs,看看他们中的哪一个看得更多(无论如何,这就是想法)。不过,我对数学知识不太清楚。若我的坐标是滚转、俯仰、偏航,那个就容易多了,但我正在和欧拉角做斗争

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

  • (旋转,旋转,旋转)=(20°、25°、50°)
  • (旋转体2、旋转体2、旋转体2)=(30°、35°、60°)

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


Tags: 数据答案参数度量方向向量角度细分
1条回答
网友
1楼 · 发布于 2024-05-23 20:07:22

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

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

相关问题 更多 >