安卓 - 如何设计跌倒检测算法

15
我希望能在我的应用程序中使用相对简单的跌倒检测算法。目前,在onSensorChanged()中,我获取当前x、y、z值的绝对值,并从中减去SensorManager.GRAVITY_EARTH(9.8 m/s)。结果值必须比一个阈值大10次才能设置一个标志,表示加速计检测到了跌倒,阈值约为8m/s。
同时,一旦通过了阈值,我会比较手机的方向和不再通过阈值时的方向,这会设置另一个标志,表示方向传感器检测到了跌倒。
当两个标志都设置完毕后,将发生一个事件来检查用户是否安全等等。我的问题在于阈值,当手机被竖直地握住时,加速度计的绝对值约为9.8 m/s,但当我将其静止放置在角度上时,它可以超过15m/s。这导致其他事件触发了跌倒检测,如果我增加阈值以避免这种情况,它就无法检测跌倒。请问有人可以给我一些建议,我应该使用哪些可能的值或如何改进我的方法呢?非常感谢。

1
你有没有查看过 https://dev59.com/hEnSa4cB1Zd3GeqPSv_5?这个问题似乎和你的类似。 - Eugene Mayevski 'Callback
4个回答

16
首先,我想提醒你不能简单地将x、y、z值相加,而是必须使用向量数学。这就是为什么你得到超过15米/秒的值。只要手机不移动,矢量和应始终约为9.8米/秒。您可以使用公式SQRT(x*x + y*y + z*z)来计算它。如果您需要更多信息,可以阅读有关向量数学的内容,也许http://en.wikipedia.org/wiki/Euclidean_vector#Length是一个很好的起点。
我还建议使用另一种算法:在自由落体中,加速度计的x、y、z三个值都应接近于零。(至少,这是我在很久以前的物理课上学到的。)因此,您可以使用这样的公式:如果x、y、z的向量和≤3m/s,则表示检测到自由落体。如果向量和随后上升到20m/s以上,则表示检测到着陆。
这些阈值只是一个猜测。也许您可以在测试应用程序中记录x、y、z的值,然后移动手机,然后离线分析值(及其正常值和向量和)的行为,以了解哪些阈值是合理的。

太棒了马库斯,我对得到的值感到很困惑,它们毫无意义,但现在我开始使用向量数学了,效果好多了。我已经设置了x、y、z的矢量和小于5m/s的阈值,并连续6次检测通过。由于手机将放在用户口袋里,没有完全自由落体,因此必须增加阈值。我使用Log.d("ACCEL", Float.toString(vectorTotal))在DDMS中查看这些值。你知道方向传感器吗?检查俯仰角、偏航角或翻滚角是否与原来相比变化超过50,这样是否足以检测方向的变化? - bobby123
嗨,bobby123!很抱歉,我还不了解方向传感器的任何信息。我在我的安卓手机上进行的实验仍处于基础阶段。 - MarkusSchaber
好的,没关系。你提供的跌倒检测算法是一个重大的改进,再次感谢! - bobby123

7

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

我们基本上采用平方根和的方法,寻找三个条件: 1. 低阈值破裂。即摔倒 2. 高阈值破裂。即触地 3. 平稳状态下的1g,即长时间躺在地上


我实际上已经阅读了一些论文并看到很多网站引用了你的应用程序,原计划在夏季发布,但目前还未上市?我会仔细阅读那篇论文,感谢提供信息,这是一个好方法。 - bobby123
很好,我对此非常感兴趣,并期待着看到你的应用程序的成果。我自己遇到的主要问题之一是当手机进入待机状态时加速度计无法工作,即使使用部分唤醒锁定也似乎是固件问题。你是如何解决这个问题的?目前我正在使用一个屏幕变暗的唤醒锁定,但这会消耗电池。 - bobby123
@Frank Sposaro - 我一直在使用HTC Desire进行开发,这似乎是该设备的一个突出问题,我读到它不会在其他某些手机上出现,但并不确定。当我记录加速度计值时,我可以在DDMS中看到它在手机进入待机状态后停止工作。很高兴知道有可能解决这个问题,谢谢伙计。 - bobby123
你能告诉我如何在手机掉落时仅获取加速度,而不是在晃动时获取吗? - Abhishek
你将会得到两者的数据,因此你需要检测它们之间的差异并触发相应的操作。通常情况下,跌落只有一个谷底(自由落体)和一个峰值(着地)。如果你看到了多个谷底和峰值,那么很可能是在行走、奔跑或者震动。主要的区别在于波长更长(行走/轻微震动)和振幅更高(奔跑/强烈震动)。 - Frank Sposaro
显示剩余2条评论

5

我忘记更新这个帖子了,但是iFall现在已经可以在Android市场上下载了。另外,请查看ww2.cs.fsu.edu/~sposaro/iFall获取更多信息。


我刚刚试玩了一下,并评论了你的视频,这个应用程序非常棒。希望下一个固件升级可以解决部分唤醒锁定问题,这样它就可以在所有安卓手机待机时正常工作。 - bobby123
@bobby123 谢谢。根据我的测试结果,在我的Droid2、三星Galaxy和Droid X手机上,该功能在后台是可行的,但在G1手机上却不行。一旦我能够接触到其他设备,我将进一步测试这个问题。但似乎新款手机上并没有这个问题。 - Frank Sposaro
太好听了,我选的手机不太好。希望我的应用程序也能上市,但在它完全完成之前还需要几个月的时间。如果/当我完成时,我会给你发一条消息来看看它,感谢 Frank 的帮助和关注。 - bobby123
@Frank Sposaro。你有没有研究过如何区分真正的跌落和手机掉落?大多数跌落都伴随着一些横向移动,因为用户向前/向后/向左/向右倒下,这将使其与自由落体不同。 - cortijon
1
我有一些尚未发布的东西。此后我进行了额外的研究。实际上,很容易看到设备掉落。当你将其绘制成图表时,你会看到一个急剧的峰值和下降。其波长明显比其他读数要短。它几乎看起来像是在加速度计图上画了一条竖线。 - Frank Sposaro

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;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接