15

我希望能够在我的应用程序中使用一个相当简单的跌倒检测算法。目前在 onSensorChanged() 中,我得到当前 x、x、z 值的绝对值并从中减去 SensorManager.GRAVITY_EARTH (9.8 m/s)。结果值必须连续 10 次大于阈值才能设置标志,表示加速度计已检测到跌倒,阈值约为 8m/s。

此外,一旦超过阈值,我就会比较手机的方向和不再超过阈值时手机的方向,这会设置另一个标志,表示方向传感器检测到跌倒。

当两个标志都设置时,会发生一个事件来检查用户是否正常,等等。我的问题是阈值,当手机直接举起时,加速度计的绝对值约为 9.8 m/s,但当我保持不动时在一个角度它可以超过 15m/s。这会导致其他事件触发跌倒检测,如果我增加阈值以避免这种情况,它将不会检测到跌倒。
谁能在这里给我一些建议,告诉我应该使用哪些可能的值,或者如何改进我的方法?非常感谢。

4

4 回答 4

16

首先,我想提醒您,您不能将 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 值,然后在手机中移动,然后离线分析这些值(以及它们的法线和矢量和)的行为,以了解哪些阈值是合理的。

于 2011-01-31T07:35:22.857 回答
7

我已经在这个问题上发表了一篇论文。请随时查看“ifall”@ ww2.cs.fsu.edu/~sposaro

我们基本上取平方根并寻找 3 件事 1. 降低阈值。即下降2。上阈值破了。即撞地 3. 1g左右的平线,即长躺,在地面上长时间铺设

于 2011-02-24T06:18:57.703 回答
4

我忘了更新这个帖子,但 iFall 现在可以在 Android 市场上使用。另请查看ww2.cs.fsu.edu/~sposaro/iFall了解更多信息

于 2011-05-11T22:36:12.100 回答
0

它可以使用加速度计传感器。

将其写入传感器更改的侦听器中。

if (sensor == Sensor.TYPE_ACCELEROMETER) {
        long curTime = System.currentTimeMillis();
        // only allow one update every 100ms.
        if ((curTime - lastUpdate) > 100) {
            long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;

            x = values[SensorManager.DATA_X];
            y = values[SensorManager.DATA_Y];
            z = values[SensorManager.DATA_Z];

            float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
            Log.d("getShakeDetection", "speed: " + speed);
            if (speed > DashplexManager.getInstance().SHAKE_THRESHOLD) {
                result = true;
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
    }
于 2017-09-27T06:24:07.723 回答