3

I'm new to android development. I want to get actual acceleration of the phone.I found a code to get acceleration.but it gives acceleration with gravity. Please any one help me to find a way to get actual acceleration without gravity. Here's the code i found,,Please help me with this code. thank you

    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);
    }

    }
skaffman
  • 398,947
  • 96
  • 818
  • 769
sandeep
  • 31
  • 1
  • 2
  • 5

4 Answers4

3

It is not possible to get the acceleration directly without gravity.

You can use a high-pass filter, like on the Android Reference Page, in the Sensor.TYPE_ACCELEROMETER section:

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];
 }
Daniel Fekete
  • 4,988
  • 3
  • 23
  • 23
  • 3
    Thanks Daniel .I have no idea that how to put this to my code. i tried many ways. but it gives me force error. do you have any idea to handle these 2 code segments together.sorry for asking such a stupid question.. – sandeep Mar 06 '12 at 11:06
  • 5
    how to declare the gravity[i] variable? What is its initial value? – inquisitive May 19 '15 at 06:51
1

Duplicate question: android remove gravity from accelerometer readings

The answer is using Sensor.TYPE_LINEAR_ACCELERATION (API >= 9 about 99% of all android devices).

Community
  • 1
  • 1
FranMowinckel
  • 4,233
  • 1
  • 30
  • 26
0

Why not to subtract the gravity values directly from the observed acceleration using Android sensor. I think it is easier way. If any specific reason is there behind the use of high pass filter, please let me know with some link to supporting document or technical paper. Thanks Rajiv

Rajiv
  • 11
0

The answer is here: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

Quote:

In particular, the force of gravity is always influencing the measured acceleration: Ad = -g - ∑F / mass

For this reason, when the device is sitting on a table (and obviously not accelerating), the accelerometer reads a magnitude of g = 9.81 m/s^2

Similarly, when the device is in free-fall and therefore dangerously accelerating towards to ground at 9.81 m/s^2, its accelerometer reads a magnitude of 0 m/s^2.

It should be apparent that in order to measure the real acceleration of the device, the contribution of the force of gravity must be eliminated. This can be achieved by applying a high-pass filter. Conversely, a low-pass filter can be used to isolate the force of gravity.

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];
 }
CjS
  • 2,037
  • 2
  • 21
  • 29
  • 1
    Thanks CjS.I have no idea that how to put this to my code. i tried many ways. but it gives me force error. do you have any idea to handle these 2 code segments together.sorry for asking such a stupid question.. – sandeep Mar 06 '12 at 11:08
  • Maybe you should post the stack trace for when it crashes, since it should be quite straightforward – CjS Mar 06 '12 at 16:19
  • 2
    how to declare the gravity[i] variable? What is its initial value? – inquisitive May 19 '15 at 06:52