检测人员是否摔倒

时间:2012-01-10 13:45:06

标签: android accelerometer

我正在android中创建一个应用程序,我需要检测该人是否已经摔倒。我知道在其他论坛中使用矢量数学已经提出并回答了这个问题,但我没有得到准确的结果。

以下是检测跌倒的代码:

@Override
public void onSensorChanged(SensorEvent arg0) {
  // TODO Auto-generated method stub
  if (arg0.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
    double gvt=SensorManager.STANDARD_GRAVITY;

    float vals[] = arg0.values;
    //int sensor=arg0.sensor.getType();
    double xx=arg0.values[0];
    double yy=arg0.values[1];
    double zz=arg0.values[2];
    double aaa=Math.round(Math.sqrt(Math.pow(xx, 2)
                                    +Math.pow(yy, 2)
                                    +Math.pow(zz, 2)));

    if (aaa<=6.0) {
      min=true;
      //mintime=System.currentTimeMillis();
    }

    if (min==true) {
      i++;
      if(aaa>=13.5) {
        max=true;
      }
    }

    if (min==true && max==true) {
      Toast.makeText(FallDetectionActivity.this,"FALL DETECTED!!!!!" ,Toast.LENGTH_LONG).show();
      i=0;
      min=false;
      max=false;
    }

    if (i>4) {
      i=0;
      min=false;
      max=false;
    }
  }
}

为了解释上面的代码,我使用了矢量和并检查该值是否已达到低于或等于6(同时下降)并且突然大于13.5(着陆时)以确认下降。

现在我在论坛上被告知如果设备仍然是矢量和将返回值9.8。虽然下降它应该接近0并且在着陆时应该到20左右。在我的情况下似乎没有发生这种情况。如果我在任何地方出错,请有人建议吗?

3 个答案:

答案 0 :(得分:7)

有一个人为此开发了一个Android应用程序。也许你可以从他的网站上获得一些信息:http://ww2.cs.fsu.edu/~sposaro/iFall/。他还发表了一篇文章,解释他是如何发现摔倒的。这真的很有趣,你应该看看它!

论文链接:http://ww2.cs.fsu.edu/~sposaro/publications/iFall.pdf

恢复,跌倒检测基于X-Y-Z加速度的结果。基于此值:

  1. 坠落时,坠落通常以自由落体期开始,使得结果显着下降至1g以下。
  2. 在对地面的影响中,结果的振幅存在峰值,其值大于3g。
  3. 在此之后,如果此人因跌倒而无法移动,结果将保持接近1G。

答案 1 :(得分:1)

如果人/电话出现故障,将会发生以下情况:

  • 绝对加速度矢量值变为0(当然有一些噪音)
  • 着陆时绝对矢量值会出现公平的峰值(达到加速度计提供的最大值)

当手机不动时,你有模数地球重力矢量向上

你的代码基本上是正确的,但我会使用一些平均值,因为手机中使用的加速度计是廉价的废话 - 噪音和缺乏精度

答案 2 :(得分:1)

为信号添加平均值意味着: - 移动平均线。这取决于你的窗户大小。例如。假设我有一个带有以下数字的向量:1,2,3,4,5,6。我的窗口大小为2.然后移动平均线是从你的向量中取两个数字并将它们平均为2.所以你需要1 + 2/2,然后将一个移到下一个两个。 2 + 3/2,依此类推。