在给定 (x,y,z) 陀螺仪的情况下,我如何检测到设备旋转了 360 度?

How can I detect that the device was rotated 360deg given (x,y,z) gyroscope?

我正在使用 react-native-sensor 从传感器获取原始数据。

setUpdateIntervalForType(SensorTypes.gyroscope, 100)

gyroscope.subscribe(({ x, y, z, timestamp }) => {
  let pitch = Math.atan2(-x, -z) * 180 / Math.PI;// In degrees
  let roll = Math.atan2(-y, -x) * 180 / Math.PI;// In degrees
  let yaw = Math.atan2(y, -z) * 180 / Math.PI;// In degrees
  
  this.setState({pitch: pitch, roll: roll, yaw: yaw})
})

我怎么知道设备旋转了 360

一点理论

一般来说,陀螺仪测量旋转运动。我们 phone 中包含的大多数传感器将专门测量 angular 速度 。这意味着在大多数情况下,输出将描述 phone 随着时间的推移旋转了多少,通常以 度每秒 (°/s).

您可以围绕 3 个轴旋转:x、y 和 z。 MATLAB 文档中有一张很好的图片:

还有 3 个重要概念(您在代码段中使用的):pitchrollyaw (或方位角)。同样,MATLAB documentation 派上用场了。他们在“更多信息”部分对其进行了很好的描述,但我建议阅读整篇文章。

亲自动手

据我所知,react-native-sensors 库将 return 正好 度每秒 .这意味着,使用提供的时间戳,您可以尝试计算 phone 在任何时间增量内绕任何轴旋转了多少。您只需要保存值和时间戳,进行一些转换就可以得到结果。然而,这需要额外的时间和记忆。

有一个更简单的方法,您在阅读附件后可能已经意识到了。根据您要旋转的轴,使用俯仰、滚动或偏航。

此外,如果您使用该库只是为了获取陀螺仪数据,您可能需要考虑 Detecting device orientation Web API。它仍然是一项实验性功能,但可以在大多数现代浏览器中使用。