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

问题描述

我正在使用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°

解决方法

有点理论

一般来说,陀螺仪测量旋转运动。我们手机中随附的大多数传感器将专门测量角速度。这意味着在大多数情况下,输出将描述手机随时间旋转的程度,通常以每秒°/s({>)的形式表示。

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

Phone axes representation

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

弄脏你的手

据我所知,react-native-sensors库将完全返回 每秒度数 。这意味着,使用提供的时间戳,您可以尝试计算手机在任何时间增量内绕任意轴旋转了多少。您只需要保存值和时间戳,进行一些转换即可得到结果。但是,这将需要更多的时间和内存。

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

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