我希望能够在我的应用程序中使用一个相当简单的跌倒检测算法。目前在 onSensorChanged() 中,我正在获取当前 x、x、z 值的绝对值并从中减去 SensorManager.GRAVITY_EARTH (9.8 m/s)。结果值必须连续 10 次大于阈值才能设置标志,表示加速度计已检测到跌倒,阈值约为 8m/s。
此外,我还在比较手机在超过阈值时的方向和不再超过阈值时的方向,这会设置另一个标志,表明方向传感器检测到跌倒。
当两个标志都设置时,会发生检查用户是否正常等事件。我的问题是阈值,当手机垂直向上时,加速度计的绝对值约为 9.8 m/s,但是当我将它保持在一个可以超过 15m/s 的角度。这会导致其他事件触发跌倒检测,如果我增加阈值来避免这种情况,它就不会检测到跌倒。
谁能在这里给我一些建议,告诉我应该使用哪些可能的值,或者如何改进我的方法?非常感谢。
最佳答案
首先,我想提醒您,您不能直接将 x、y、z 值直接相加,您必须使用矢量数学。这就是您获得超过 15 m/s 的值的原因。只要手机不动,矢量和就应该始终约为 9.8 m/s。您使用 SQRT(x*x + y*y + z*z) 计算它。如果您需要更多信息,您可以阅读矢量数学,也许http://en.wikipedia.org/wiki/Euclidean_vector#Length是一个好的开始。
我还建议另一种算法:在自由落体中,加速度计的所有三个 x、y、z 值都应该接近于零。 (至少,这是我很久以前在学校的物理课上学到的。)所以也许你可以使用一个公式,比如如果 x、y、z 的矢量和 <= 3 m/s 比你检测到自由落体。如果矢量和随后上升到超过 20 m/s 的值,那么您就会检测到着陆。
这些阈值只是一个大胆的猜测。也许您只是在测试应用程序中记录 x、y、z 值,然后在手机周围移动,然后离线分析这些值(及其法线和矢量和)的行为方式,以了解哪些阈值是合理的。
关于Android - 如何处理跌倒检测算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4848490/