2013-05-15 4 views
8

私はデモTIMERを実行しています(特定の条件で)。開始ボタンを押すとタイマーが起動し、停止ボタンで停止すると停止します。AndroidでAccelerometerを使用して正確に動きを検出する

私は、デバイスが(タイマが動作している間)をシフトすると、機能を統合する必要があります。それはかなりうまくいっていますが、加速度計の機能は絶対に正確ではありません。タイマーをリセットするためには急な躍動感が必要です。

私には同じ解決策を提案してください。ここで

は私のコード

public class SensorAccelerometer implements SensorEventListener { 

    private Context context; 
    private SensorManager sensorManager; 
    private Sensor accelerometer; 
    private TextView timelabel; 
    private Handler mHandler; 
    Runnable run; 

    private float mLastX, mLastY, mLastZ; 
    private final float NOISE = (float) 3.0; 

    public SensorAccelerometer(Context context) { 

    } 


    public SensorAccelerometer(Context context,TextView timelabel, Handler mHandler2, Runnable mUpdateTimeTask) { 
     // TODO Auto-generated constructor stub 

     this.context = context; 
     this.timelabel = timelabel; 
     this.mHandler = mHandler2; 
     this.run = mUpdateTimeTask; 

     initialiseSensor(); 
    } 


    public void initialiseSensor(){ 
     sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); 
     accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ALL); 
     sensorManager.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    public void unregisterSensor(){ 
     sensorManager.unregisterListener(this); 
     Toast.makeText(context, "Sensor Stopped..", Toast.LENGTH_SHORT).show(); 
    } 


    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 

    mAccelLast=mAccelCurrent; 

    mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z); 
    float delta = mAccelCurrent - mAccelLast; 
    mAccel = mAccel * 0.9f + delta; 

    if(mAccel>0.5){ 
     TimerActivity.mStartTime = SystemClock.uptimeMillis(); 
     mHandler.removeCallbacks(run); 
     mHandler.postDelayed(run, 100); 
    } 

}

タイマー活動

public class TimerActivity extends Activity { 

    public static long mStartTime = 0L; 
    private TextView mTimerLabel; 

    private Handler mHandler = new Handler(); 

    String timerStop1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mTimerLabel = (TextView) findViewById(R.id.textTimer); 

     Button timerStartButton = (Button) findViewById(R.id.btnTimer);  
     timerStartButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view){ 

       if(mStartTime == 0L){ 
        mStartTime = SystemClock.uptimeMillis(); 
        mHandler.removeCallbacks(mUpdateTimeTask); 
        mHandler.postDelayed(mUpdateTimeTask, 100); 

        //activating the sensor and the acclerometer 
        SensorAccelerometer acc = new SensorAccelerometer(view.getContext(), mTimerLabel,mHandler,mUpdateTimeTask); 
       }         
      } 
     }); 

     Button timerStopButton = (Button) findViewById(R.id.btnTimerStop);  
     timerStopButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view){ 

       mHandler.removeCallbacks(mUpdateTimeTask); 
       mTimerLabel.setText(timerStop1); 
       mStartTime = 0L; 

       SensorAccelerometer scc = new SensorAccelerometer(view.getContext(),mTimerLabel,mHandler,mUpdateTimeTask); 
       scc.unregisterSensor(); 
      } 
     }); 

    } 


    private Runnable mUpdateTimeTask = new Runnable(){ 

     public void run() { 

      final long start = mStartTime; 
      long millis = SystemClock.uptimeMillis()- start; 

      int seconds = (int) (millis/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 

      mTimerLabel.setText("" + minutes + ":" 
            + String.format("%02d", seconds));      

      timerStop1 = minutes + ":" 
         + String.format("%02d", seconds); 

      mHandler.postDelayed(this, 200);    

     } 
    }; 

    protected void onPause() { 
     super.onPause(); 
     SensorAccelerometer scc = new SensorAccelerometer(this,mTimerLabel,mHandler,mUpdateTimeTask); 
     scc.unregisterSensor(); 
    }; 

} 

答えて

6

私はあなたのアプリの開発の次の段階は、スプレッドシートで生成されたアクセラレーションの値を見ることだと思います。私はこのためにExcelを使用していますが、グラフを生成できるツールはありません。だから、

public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 

    float mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z); 
    float mAccel = mAccel * 0.9f + mAccelCurrent * 0.1f; 
    Log.d("onSensorChanged",System.currentTimeMillis()+","+mAccelCurrent +","+mAccel); 

} 

のようなものにonSensorChanged()を変更して、あなたは、AndroidのログメカニズムにCURRENTTIME、mAccelCurrentとmAccelをキャプチャすることができます。または、独自のテキストファイルを作成し、そこに値を書き込んで、グラフを作成できるツールでファイルを開きます。グラフから、トリガーに使用する値を決めることができます。

+0

私の簡単な質問は、(デバイスが傾いている)傾きデータをチェックする方法と、その上に一連のコードを実行することです。上記のコードに関する解決策はありますか? –

+0

@stochastically。私の質問は上記と同じです –

+0

動きを検出するために加速度計のデータを使いたいと思っていました。これを行うには、データを理解する必要があるため、ログに記録して調べる必要があります。あなたはちょうど、デバイスが傾いているかどうかを確認したい場合は、それはずっと簡単です。たとえば、my answser [link](http://stackoverflow.com/questions/16571798/android-device-angle-on-vertical-axis-while-device-stays-still/16572641#16572641)を参照してください。おそらくあなたが探しているのはピッチ角です。 – Stochastically

2

二つの提案、1つの思想です:一貫性のある動作のために

  1. 、あなたはの長さになっているはずですevent.valuesベクトル、すなわちMath.sqrt(x*x+y*y+z*z)ではなく、個々の値です。数学的には、あなたの座標系とは独立した、すなわち装置が地面などに対してどのように向き付けられているのか、個々の番号x、y、zはそうではないのはMath.sqrt(x*x+y*y+z*z)です。
  2. あなたの現在のアプリは加速の変化を探します。代わりに、高い加速度、つまり大きな値のMath.sqrt(x*x+y*y+z*z)を探してください。
  3. 私は最近、歩数計に加速度計を使用することについてthis answerと書きました。興味深いかもしれません。

+0

あなたは非常に良い答えを提供しましたが、私はデバイスの動作を確認するために何をすべきか理解できません。どこで私のコードを変更すればいいのですか。人がデバイスの位置を少し変えたら、私はそれを得るべきです。 –

+0

私のコメント1と2は両方ともあなたのonSensorChanged(SensorEventイベント)の実装に関連しています。あなたの最初の3行は、x、y、zを設定する上で問題ありませんが、(1) 'len = Math.sqrt(x * x + y * y + z * z)'を得る必要があります。 (2)lenが通常よりもはるかに大きいかどうかを調べる。 – Stochastically

+2

私の答えと会話は、他の人にはあまり意味がないので、私はそのような質問を編集するのは良い考えだとは思わない。また、mAccelのような変数はどこにも宣言されていないので、あなたの編集は不完全です。それでも問題が解決しない場合は、新しい質問を開始する必要があります。つまり、あなたは 'mAccel'を' mAccelCurrent'の平滑化された値にするのはむしろ奇妙な方法です。代わりに、私は 'mAccel = mAccel * 0.9f + mAccelCurrent * 0.1f'を示唆しています。それを超えて、私はmAccelとmAccelCurrentをファイルに記録し、結果を調べ、それから何をするかを決めるべきだと思います。 – Stochastically

関連する問題