2012-03-06 2 views
3

Я новичок в разработке Android. Я хочу получить фактическое ускорение телефона. Я нашел код для ускорения. Но он дает ускорение с гравитацией. Пожалуйста, помогите мне найти способ получить фактическое ускорение без гравитации. Вот код, который я нашел, Пожалуйста, помогите мне с этим кодом. Благодарю васполучить ускорение без гравитации

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

Невозможно получить ускорение непосредственно без силы тяжести.

Вы можете использовать фильтр высоких частот, как на Android Reference Page в разделе Sensor.TYPE_ACCELEROMETER:

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

Спасибо, Дэниэл. Я понятия не имею, как это сделать для моего кода. Я пробовал много способов. но это дает мне силовую ошибку. у вас есть идея обработать эти два сегмента кода вместе. Вы можете задать такой глупый вопрос. – sandeep

+4

как объявить переменную тяжести [i]? Какова его первоначальная ценность? – inquisitive

0

Ответ здесь: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

Цитата:

В частности, сила тяжести всегда влияет на измеренное ускорение: Ad = -g - ΣF/масса

По этой причине, когда устройство сидит на столе (и, очевидно, не ускоряется), акселерометр считывает величину g = 9,81 м/с^2

Аналогично, когда устройство находится в режиме свободного падения и поэтому опасно ускоряется к земле на 9,81 м/с^2, его акселерометр считывает величину 0 м/с^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 не знаю, как это поместить в мой код. Я пробовал много способов. но это дает мне силовую ошибку. у вас есть идея справиться с этими двумя сегментами кода вместе. Выполните задание на такой глупый вопрос. – sandeep

+0

Возможно, вам следует опубликовать трассировку стека, когда она сработает, так как должно быть довольно просто – CjS

+2

, как объявить гравитацию [i] переменная? Какова его первоначальная ценность? – inquisitive

0

Почему бы не вычесть значения силы тяжести непосредственно из наблюдаемого ускорения с помощью датчика Android. Я думаю, что это проще. Если какая-либо конкретная причина связана с использованием фильтра высоких частот, сообщите мне, используя некоторую ссылку для поддержки документа или технической документации. Thanks Rajiv

Смежные вопросы