2012-12-17 16 views
0

(對不起,我的英語不好,我是意大利語) 我是Android編程新手,我有這個問題: 我需要加速度計數據(最大值和最小值sqrt(x * x ..))每「1」秒,如果它們的差值(delta)的絕對值是0.4 * Gravity_earth的<,我需要我在條件的前5秒獲得的數據,然後我計算最大值。如果THRESHOLD的值是>,我會標記一個「非跌倒」或「跌倒」。 有人能解決這個問題嗎? 謝謝! 這是我的解決方案:如何詳細說明2種類型的加速度計數據

public class MainActivity extends Activity implements SensorEventListener{ 


SensorManager sm; 
float acc; 
private float [] sensorData; 
float azimuth,pitch,roll; 
float omegaMagnitude; 
//ArrayList 
ArrayList<Float> tutteLeAcc =new ArrayList(); 
ArrayList<Float> previousAcc=new ArrayList(); 
Iterator<Float> it; 
Iterator<Float> it1; 
float accMax; 
float accMin; 

float accPreviousMax; 
float deltaAcc; 


    private static final String TAG = "SIMTHR"; 

    public static final int MSG_C = 3; 
    public static final int MSG_D = 4; 


    WorkerThread mWorkerThread; 
    WorkerThread1 mWorkerThread1; 

    boolean isRunning = false; 
    boolean running; 
    Button btnStart,btnStop; 
    TextView txtLog; 
    int tt = 0; 

    boolean caduta; 



    final Handler mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
     switch (msg.what) { 

     case MSG_C: 
      //it=tutteLeAcc.iterator(); 
      txtLog.setText(""); 
      txtLog.append("\nAmax: "+Float.toString(accMax)+" Amin:   "+Float.toString(accMin)+" dA: "+Float.toString(deltaAcc)); 
      tutteLeAcc.clear(); 

      break; 

     case MSG_D: 

      txtLog.append("\nPreviousACCmax: "+Float.toString(accPreviousMax)+"\n"); 
      //previousAcc.clear(); 

     break; 
     } 
     caduta=Detection(previousAcc,deltaAcc); 
     //previousAcc.clear(); 
     } 
    }; 


    class WorkerThread extends Thread { 

     public Handler mCallerHandler; 
     private int nn = 1; 

     public WorkerThread(Handler handler) { 

     mCallerHandler = handler; 
     Log.i(TAG,"create WorkerThread"); 
     } 

    public void run() { 
    nn = 0; 
    while(running){ 
    try { 
     Log.i(TAG,"WorkerThread inizia qua"); 
     if (mCallerHandler!=null) { 


      accMax=trovaMax(tutteLeAcc); 
      accMin=trovaMin(tutteLeAcc); 
      deltaAcc=Math.abs(accMax-accMin); 
      Thread.sleep(1000); 
      mCallerHandler.obtainMessage(MSG_C).sendToTarget(); 

      Log.i(TAG,"WorkerThread finisce qua"); 
     } 
    } catch (InterruptedException e) { 
     Log.e(TAG,"errore in WorkerThread "+e.toString()); 
    } 
    } 
    } 


    public synchronized void start() { 
    running=true; 
    super.start(); 
    Log.i(TAG,"WorkerThread avviato"); 
    } 

    public synchronized void cancel() { 
     running=false; 
     Log.i(TAG,"WorkerThread avviato"); 
    } 

}

 class WorkerThread1 extends Thread { 

     public Handler mCallerHandler; 
     private int nn = 1; 

     public WorkerThread1(Handler handler) { 
     // salvo l'handler dei messaggi dell'activity chiamante 
     mCallerHandler = handler; 
     Log.i(TAG,"create WorkerThread1"); 
     } 

     public void run() { 

     nn = 0; 
     while(running){ 
     try { 
      Log.i(TAG,"WorkerThread1 inizia qua"); 
      if (mCallerHandler!=null) { 

       accPreviousMax=trovaMax(previousAcc); 
       Thread.sleep(5000); 
       mCallerHandler.obtainMessage(MSG_D).sendToTarget(); 

       Log.i(TAG,"WorkerThread finisce qua"); 
      } 
     } catch (InterruptedException e) { 
      Log.e(TAG,"errore in WorkerThread "+e.toString()); 
     } 
     } 
     } 

     // avvio del thread 
     public synchronized void start() { 
     running=true; 
     super.start(); 
     Log.i(TAG,"WorkerThread avviato"); 
     } 

     public synchronized void cancel() { 
      running=false; 
      Log.i(TAG,"WorkerThread avviato"); 
     } 

    } 


     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      Log.i(TAG,"Activity ONCREATE"); 

    sm = (SensorManager)getSystemService(SENSOR_SERVICE); 

    sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL); 
    sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); 
    sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL); 

    // oggetti della User Interface 
    btnStart = (Button) findViewById(R.id.btnStart); 
    btnStop=(Button)findViewById(R.id.btnStop); 
    txtLog = (TextView) findViewById(R.id.txtLog); 
    txtLog.setTextColor(Color.WHITE); 

    sensorData = new float[9]; 

    // button per l'avvio del thread 
    btnStart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mWorkerThread!=null&&mWorkerThread1!=null) { 
      mWorkerThread.cancel(); 
      mWorkerThread1.cancel(); 
      mWorkerThread = null; mWorkerThread1 = null; 
      txtLog.append("\nrichiesto arresto THREAD 1 e 2 #"+Integer.toString(tt)+"\n"); 
      } 
      tt++; 
      mWorkerThread = new WorkerThread(mHandler); 
      mWorkerThread1 = new WorkerThread1(mHandler); 
      mWorkerThread.start(); mWorkerThread1.start(); 
      isRunning = true; 
      txtLog.append("\nrichiesto avvio THREAD 1 e 2\n"); 
     } 
    }); 

    // button per l'arresto del thread 
    btnStop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mWorkerThread!=null&&mWorkerThread1!=null) { 
      mWorkerThread.cancel(); 
      mWorkerThread1.cancel(); 
      mWorkerThread = null; mWorkerThread1 = null; 
      txtLog.append("\nrichiesto arresto THREAD 1 e 2\n"); 
      } 
      isRunning = false; 
     } 
    }); 

}

 public void Deregistra(){ 
sm.unregisterListener(this); 
     } 


     public void Registra(){ 
sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL); 
      } 

      @Override 
      public void onSensorChanged(SensorEvent event) { 

float [] values = event.values; 


synchronized (this) { 

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

       sensorData[0] = event.values[0]; 

       sensorData[1] = event.values[1]; 

       sensorData[2] = event.values[2]; 


      if ((sensorData[3] != 0)||(sensorData[4] != 0)||(sensorData[5] != 0) 
        ||(sensorData[6] != 0)||(sensorData[7] != 0)||(sensorData[8] != 0)) 

      { 

        float ax=sensorData[0]; 
        float ay=sensorData[1]; 
        float az=sensorData[2]; 



        acc=(float) Math.sqrt((ax*ax)+(ay*ay)+(az*az)); 

        /* 
        tutteLeAcc.add(acc); 
        accMax=trovaMax(tutteLeAcc); 
        accMin=trovaMin(tutteLeAcc); 
        deltaAcc=Math.abs(accMax-accMin); 
         */ 
        tutteLeAcc.add(acc); 
        previousAcc.add(acc); 

        } 

      } 


     else if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { 


      sensorData [3] = values[0]; 
      sensorData [4] = values[1]; 
      sensorData [5] = values[2]; 


      if ((sensorData[0] != 0)||(sensorData[1] != 0)||(sensorData[2] != 0) 
        ||(sensorData[6] != 0)||(sensorData[7] != 0)||(sensorData[8] != 0)) 
      { 
        azimuth=sensorData[3]; 
        pitch=sensorData[4]; 
        roll=sensorData[5]; 


      } 
     } 
     else if(event.sensor.getType()==Sensor.TYPE_GYROSCOPE){ 
      sensorData [6] = values[0]; 
      sensorData [7] = values[1]; 
      sensorData [8] = values[2]; 

      final float gx=sensorData[6]; 
      final float gy=sensorData[7]; 
      final float gz=sensorData[8]; 

      if ((sensorData[0] != 0)||(sensorData[1] != 0)||(sensorData[2] != 0) 
        ||(sensorData[3] != 0)||(sensorData[4] != 0)||(sensorData[5] != 0)) 
      { 

       float axisX = sensorData[6]; 
       float axisY = sensorData[7]; 
       float axisZ = sensorData[8]; 

       // Calculate the angular speed of the sample 
       omegaMagnitude = (float) Math.sqrt((axisX*axisX) + (axisY*axisY) + (axisZ*axisZ)); 


      } 
     } 

} 

}

  public float trovaMin(ArrayList<Float> a){ 
Iterator<Float> it=a.iterator(); 
float min=a.get(0); 
while(it.hasNext()){ 
    Float x=it.next(); 
    if(x<min){ 
     min=x;} 
} 
return min; 

}

  public float trovaMax(ArrayList<Float> a){ 
Iterator<Float> it=a.iterator(); 
float max=a.get(0); 
while(it.hasNext()){ 
    Float x=it.next(); 
    if(x>max){ 
     max=x;} 
} 
return max; 

}

  public boolean Detection(ArrayList<Float> accPrec,float delta){ 
boolean intentional=true, static=true, lying=false; 
float am; 


if(delta<0.4*SensorManager.GRAVITY_EARTH){ 
    statico=true; 
    Log.v("STATIC?", "yes"); 

    if(static){ 
     if(Math.abs(pitch)>=140||Math.abs(pitch)<30){ 
     lying=true; 
     Log.v("LYING?", "yes"); 
     if(allungato){ 
      am=findMax(accPrec); 
      if(am>2.5*SensorManager.GRAVITY_EARTH||omegaMagnitude>200){ 
       intentional=true; 
       Log.v("INTENTIONAL?", "yes"); 
      }else{ 
       intenzionale=false; 
       Log.v("INTENTIONAL?", "no"); 
      } 
     } 
     }else { 
      lying=false; 
      Log.v("STANDING?", "yes"); 
      } 
     } 
     } else { 
      static=false; 
      Log.v("STATIC?", "no"); 
      } 

     if(static&&lying&&!intenional) 
      return true; 

     else return false; 
     } 

}

+0

很可能需要計時器。爲更多的幫助顯示你嘗試過的東西。 – Smit

+0

我現在編輯我的帖子..請幫助我,我很困惑:( – user1910691

回答

0

有說服力的樣本被拿到其中第二並沒有確切的方法。但是您可以通過固定獲取加速度計更新的頻率來近似它。

假設我們要求50個樣品第二(50赫茲)

sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),50000000); 

不使用機器人傳感器延遲常數(即SensorManager.SENSOR_DELAY_NORMAL)它們是不同的供應商的設備不同。

現在只需運行一個簡單的計數器爲0〜50(沒有其他辦法:()

我希望這有助於你

0

我的建議是在最大可能的頻率下運行的傳感器: SM。 registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST); 因爲在任何情況下,設備都不嚴格遵守由數字指示的速率;旁邊僅支持「數字」速率因爲API v.2.3。 然後,你應該這樣編寫onSensorChanged方法 評論:你檢查c urrent時間超過latestSensorChange + DELTASENSOR(這是您希望等待傳感器值的毫秒數)。

@Override 
public void onSensorChanged(SensorEvent event) { 
    float[] values = event.values; 
    long Now = System.currentTimeMillis(); 
    if (Now > (latestSensorChange + DELTASENSOR)) { 

/*   if ((mDbHelper.getOldVal(BreathDbAdapter.IDX_X) != values[BreathDbAdapter.IDX_X]) || 
        (mDbHelper.getOldVal(BreathDbAdapter.IDX_Y)!= values[BreathDbAdapter.IDX_Y]) || 
        (mDbHelper.getOldVal(BreathDbAdapter.IDX_Z)!= values[BreathDbAdapter.IDX_Z])) { 

    */ 
     msg = "Accelerometer: " + values[0] 
       + ", " + values[1] + ", " + values[2] + " at " + Now + " (EndTime =" + EndTime +")"; 
     mTextViewAccelerometer.setText(msg); 
     Log.v(TAG, msg); 
     latestSensorChange = Now; 
     if (Now > EndTime) { 
      Log.v(TAG,"Fine del Test at " + Now); 
      finish(); 
     } 
    } 

請讓我知道,如果有幫助(仙野TI vengo一個cercare PERCHE索諾意大利語anch'io :-)) Checco