如何从欧拉角计算 'rotational mobility' 的度量?
How can I calculate a measure of 'rotational mobility' from Euler angles?
奇怪的问题,但我无法将其归结为一个连贯的问题。
我从 Brekel OpenVR 记录器中采样了数据 (60Hz),其中包括 HMD 本身的以下参数:
- X、Y、Z 位置坐标
- 欧拉角 rotX、rotY、rot。
我正在处理 python 中的数据。总的来说,我想做的是计算流动性的措施:有人在某个片段中环顾四周的次数多了还是少了,他们四处走动的次数多了还是少了?
对于不太难的位置坐标,我可以通过后续位置之间的距离来计算位移、速度等。现在对于欧拉角,我遇到了更多麻烦。
我已经搜索了我的问题的答案,但 none 的答案似乎是 'click'。 我认为我需要的是将欧拉角转换为方向向量,然后计算后续样本的方向向量之间的角度,以查看注视方向偏移了多少。 一旦我有了这些,我可以计算每个主题的均值和 SD,看看他们中的哪些人环顾四周更多(反正就是这个想法)。虽然我不清楚数学。如果我的坐标是滚动、俯仰、偏航会更容易,但我正在为欧拉角而苦苦挣扎。
假设两个后续样本的欧拉角为:
- (rotX, rotY, rot) = (20°, 25°, 50°)
- (rotX2, rotY2, rot2) = (30°, 35°, 60°)
我如何量化这两个样本之间 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
奇怪的问题,但我无法将其归结为一个连贯的问题。
我从 Brekel OpenVR 记录器中采样了数据 (60Hz),其中包括 HMD 本身的以下参数:
- X、Y、Z 位置坐标
- 欧拉角 rotX、rotY、rot。
我正在处理 python 中的数据。总的来说,我想做的是计算流动性的措施:有人在某个片段中环顾四周的次数多了还是少了,他们四处走动的次数多了还是少了?
对于不太难的位置坐标,我可以通过后续位置之间的距离来计算位移、速度等。现在对于欧拉角,我遇到了更多麻烦。
我已经搜索了我的问题的答案,但 none 的答案似乎是 'click'。 我认为我需要的是将欧拉角转换为方向向量,然后计算后续样本的方向向量之间的角度,以查看注视方向偏移了多少。 一旦我有了这些,我可以计算每个主题的均值和 SD,看看他们中的哪些人环顾四周更多(反正就是这个想法)。虽然我不清楚数学。如果我的坐标是滚动、俯仰、偏航会更容易,但我正在为欧拉角而苦苦挣扎。
假设两个后续样本的欧拉角为:
- (rotX, rotY, rot) = (20°, 25°, 50°)
- (rotX2, rotY2, rot2) = (30°, 35°, 60°)
我如何量化这两个样本之间 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