2017-06-13 11 views
1

加速度センサを使用して落下検出を実装し、以下のコードを作成しています。Androidフォール検出

public void onSensorChanged(SensorEvent foEvent) { 


     if (foEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      double loX = foEvent.values[0]; 
      double loY = foEvent.values[1]; 
      double loZ = foEvent.values[2]; 

      double loAccelerationReader = Math.sqrt(Math.pow(loX, 2) 
        + Math.pow(loY, 2) 
        + Math.pow(loZ, 2)); 
      mlPreviousTime = System.currentTimeMillis(); 
      Log.i(TAG, "loX : " + loX + " loY : " + loY + " loZ : " + loZ); 
      if (loAccelerationReader <= 6.0) { 
       moIsMin = true; 
       Log.i(TAG, "min"); 
      } 

      if (moIsMin) { 
       i++; 
       Log.i(TAG, " loAcceleration : " + loAccelerationReader); 
       if (loAccelerationReader >= 30) { 
        long llCurrentTime = System.currentTimeMillis(); 
        long llTimeDiff = llCurrentTime - mlPreviousTime; 
        Log.i(TAG, "loTime :" + llTimeDiff); 
        if (llTimeDiff >= 10) { 
         moIsMax = true; 
         Log.i(TAG, "max"); 
        } 
       } 

      } 

      if (moIsMin && moIsMax) { 
       Log.i(TAG, "loX : " + loX + " loY : " + loY + " loZ : " + loZ); 
       Log.i(TAG, "FALL DETECTED!!!!!"); 
       Toast.makeText(this, "FALL DETECTED!!!!!", Toast.LENGTH_LONG).show(); 
       i = 0; 
       moIsMin = false; 
       moIsMax = false; 
      } 

      if (i > 5) { 
       i = 0; 
       moIsMin = false; 
       moIsMax = false; 
      } 
     }   
} 

私は転倒していますが、私が乗っているか走っていると、私には秋の警告が与えられます。

私は6インチからデバイスをスローすると、警告が表示されます。

私は感度がデバイス固有であることも見ています。

iが同じ高さとモトe及びMI 4をテストするとき

モトeはloAccelerationReader

の最大32値を返し、MI 4において、それはloAccelerationReader

60値を返すは、いずれか助けることができます私は正しい方法で私を出す。

+0

このコードはHuawie Watchと連携していません。どんな助け? – DivisionSi

答えて

2

私はいくつかの解決策がありますかどうかは、すべてのかどうかは確かではありませんが、私は以下のコードと私のために働いています。

if (foEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 

     double loX = foEvent.values[0]; 
     double loY = foEvent.values[1]; 
     double loZ = foEvent.values[2]; 

     double loAccelerationReader = Math.sqrt(Math.pow(loX, 2) 
       + Math.pow(loY, 2) 
       + Math.pow(loZ, 2)); 

     DecimalFormat precision = new DecimalFormat("0.00"); 
     double ldAccRound = Double.parseDouble(precision.format(loAccelerationReader)); 

     if (ldAccRound > 0.3d && ldAccRound < 0.5d) { 
      //Do your stuff 
     } 
    } 
0

あなたは正しい方向にあります。それは秋を検出することができます!しかし、それはまた、他の非落下事象を検出する。私の提案は、単一ポイント閾値化(例えば、大きさ> 30)の代わりに、加速度計読み取りの時間間隔(例えば、1秒)を得る。私は、落下、走り、運転のための読みは統計的に非常に異なっていると確信しています(例えば、平均、分散)。私はこれが検出アルゴリズムの次の反復の出発点として役立つことを願っています。

使用する加速度計が異なり、感度が異なる可能性があるため、測定値は機械ごとに異なる可能性が非常に高いです。

+0

お返事ありがとうございました。私は長い時間を追加しましたが、正確な結果を提供することはできません。 3フィートから落ちると、時々異なる15となります。だから私の心配はどのように私は間隔を確認することです。私もfoEvent.timestampを使用しましたが、うまくいきませんでした。 –

+0

実際には、デバイスによって異なる値が投げられます(間隔や読み取り値についてもわからないことがあります)。これを回避するには、ユーザーが行う必要のある較正を追加するしかないと思います – Pelocho