2012-03-06 8 views
3

私はアンドロイドの開発には初めてです。私は電話の実際の加速を得たいと思っています。加速を得るためのコードを見つけました。しかし、重力で加速します。重力なしで実際の加速を得る方法を見つけるのを助けてください。 ここにコードがあります。このコードで助けてください。ありがとうございます重力なしで加速を得る

package com.SensorTest; 

    import android.app.Activity; 
    import android.hardware.Sensor; 
    import android.hardware.SensorEvent; 
    import android.hardware.SensorEventListener; 
    import android.hardware.SensorManager; 
    import android.os.Bundle; 
    import android.widget.TextView; 


    public class SensorTestActivity extends Activity implements SensorEventListener { 

    SensorManager sensorManager = null; 

    //for accelerometer values 
    TextView outputX; 
    TextView outputY; 
    TextView outputZ; 

    //for orientation values 
    TextView outputX2; 
    TextView outputY2; 
    TextView outputZ2; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     setContentView(R.layout.main); 

     //just some textviews, for data output 
     outputX = (TextView) findViewById(R.id.TextView01); 
     outputY = (TextView) findViewById(R.id.TextView02); 
     outputZ = (TextView) findViewById(R.id.TextView03); 

     outputX2 = (TextView) findViewById(R.id.TextView04); 
     outputY2 = (TextView) findViewById(R.id.TextView05); 
     outputZ2 = (TextView) findViewById(R.id.TextView06); 


    } 


    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) { 
     // TODO Auto-generated method stub 

    } 

@Override 
public void onSensorChanged(SensorEvent event) { 
synchronized (this) { 
    switch (event.sensor.getType()){ 
     case Sensor.TYPE_ACCELEROMETER: 
      outputX.setText("acclaration x:"+Float.toString(event.values[0])); 
      outputY.setText("acclaration y:"+Float.toString(event.values[1])); 
      outputZ.setText("acclaration z:"+Float.toString(event.values[2])); 
     break; 
    case Sensor.TYPE_ORIENTATION: 
      outputX2.setText("orientation x:"+Float.toString(event.values[0])); 
      outputY2.setText("orientation y:"+Float.toString(event.values[1])); 
      outputZ2.setText("orientation z:"+Float.toString(event.values[2])); 
    break; 

      } 
     } 
    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), sensorManager.SENSOR_DELAY_GAME); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), sensorManager.SENSOR_DELAY_GAME); 
    } 

    } 

答えて

2

重力なしで直接加速することはできません。

あなたはSensor.TYPE_ACCELEROMETERセクションで、Android Reference Page上のように、ハイパスフィルタを使用することができます。

public void onSensorChanged(SensorEvent event) { 
     // alpha is calculated as t/(t + dT) 
     // with t, the low-pass filter's time-constant 
     // and dT, the event delivery rate 

     final float alpha = 0.8; 

     gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
     gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
     gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

     linear_acceleration[0] = event.values[0] - gravity[0]; 
     linear_acceleration[1] = event.values[1] - gravity[1]; 
     linear_acceleration[2] = event.values[2] - gravity[2]; 
} 
+3

ありがとうございましたDaniel。私はこれを私のコードに入れる方法は知らない。私は多くの方法を試しました。それは私に力の誤りを与える。そのような愚かな質問をするために、これらの2つのコードセグメントtogether.sorryを処理するための考えがありますか。 – sandeep

+4

重力[i]変数を宣言する方法は?初期値は何ですか? – inquisitive

0

答えはここにある: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

引用:特に

、重力は常に測定された加速度に影響します。 Ad = -g - ΣF/ mass

このように、デバイスがテーブルに座っている(そして明らかに加速していない)とき、加速度計はg = 9.81m/sの大きさを読み取る。

同様に、デバイスが自由落下しているときしたがって、9.81m/s^2で地面に向かって危険に加速し、その加速度計は0m/s^2の大きさを読み取る。装置の実際の加速度を測定するためには、重力の寄与を排除しなければならないことは明らかである。これは、ハイパスフィルタを適用することで実現できます。逆に、ローパスフィルタを用いて重力を分離することができる。

public void onSensorChanged(SensorEvent event) 
{ 
     // alpha is calculated as t/(t + dT) 
     // with t, the low-pass filter's time-constant 
     // and dT, the event delivery rate 

     final float alpha = 0.8; 

     gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
     gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
     gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

     linear_acceleration[0] = event.values[0] - gravity[0]; 
     linear_acceleration[1] = event.values[1] - gravity[1]; 
     linear_acceleration[2] = event.values[2] - gravity[2]; 
} 
+1

ありがとうCjS.I私のコードにこれを置く方法を知らない。私は多くの方法を試しました。それは私に力の誤りを与える。そのような愚かな質問をするためにこれらの2つのコードセグメントtogether.sorryを処理するための任意のアイデアを持っていますか? – sandeep

+0

おそらく、それは非常に簡単でなければならないので、クラッシュ時のスタックトレースを投稿する必要があります – CjS

+2

重力[変数?初期値は何ですか? – inquisitive

0

Androidセンサーを使用して観測加速度から重力値を直接減算しないようにしましょう。私はそれがより簡単な方法だと思う。特定の理由がある場合はハイパスフィルタの使用の背後にある、私に教えてください文書や技術的な論文へのリンクを教えてください。 ありがとう Rajiv

関連する問題