Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Android sensor event to determine if device is facing up or down

I have quite a simple requirement. Assuming a device is standing on its end, perpendicular to the ground, and it is tilted, all I need to determine is whether the phone is tilted forward or back (screen more toward the ground or more toward the ceiling).

I know how to read values from the various sensors and I figure that using sensor TYPE_ROTATION_VECTOR is the way forward. All I'm missing is the maths know-how to determine forward or back from the three values it returns.

I've read all related threads on SO without enlightenment, any help very much appreciated.

like image 791
PaulJNewell Avatar asked Jan 23 '13 10:01

PaulJNewell


2 Answers

float[] rotationMatrix = new float[9];
float[] inclinationMatrix = new float[9];
float[] accelerometer; // values from sensor
float[] magnetic; // values from sensor
SensorManager.getRotationMatrix(rotationMatrix, inclinationMatrix, accelerometer, magnetic) 
int inclination = (int) Math.round(Math.toDegrees(Math.acos(rotationMatrix[8])));

if (inclination < 90)
{
      // face up
}

if (inclination > 90)
{
       // face down
}
like image 154
Hoan Nguyen Avatar answered Nov 20 '22 19:11

Hoan Nguyen


The X axis is horizontal and points to the right, the Y axis is vertical and points up and the Z axis points towards the outside of the front face of the screen. In this system, coordinates behind the screen have negative Z values.

The reference coordinate system is defined as a direct orthonormal basis, where:

X is defined as the vector product Y.Z (It is tangential to the ground at the device's current location and roughly points East).
Y is tangential to the ground at the device's current location and points towards magnetic north.
Z points towards the sky and is perpendicular to the ground.

In your case try this,

if(Round(y,4) < 8.0){
           Log.d("sensor", "=====UP====");


        }

        else if(Round(y,4) < -8.0){
            Log.d("sensor", "=====DOWN====");

        }

accelerometer sensor

like image 28
Ajit Avatar answered Nov 20 '22 19:11

Ajit