From my Android device I can read an array of linear acceleration values (in the device's coordinate system) and an array of absolute orientation values (in Earth's coordinate system). What I need is to obtain the linear acceleration values in the latter coord. system.
How can I convert them?
EDIT after Ali's reply in comment:
All right, so if I understand correctly, when I measure the linear acceleration, the position of the phone completely does not matter, because the readings are given in Earth's coordinate system. right?
But I just did a test where I put the phone in different positions and got acceleration in different axes. There are 3 pairs of pictures - the first ones show how I put the device (sorry for my Paint "master skill") and the second ones show readings from data provided by the linear acc. sensor:
And now - why in the third case the acceleration occurs along the Z axis (not Y) since the device position doesn't matter?
I finally managed to solve it! So to get acceleration vector in Earth's coordinate system you need to:
float[16]
so it could be used later by android.opengl.Matrix
class) from SensorManager.getRotationMatrix()
(using SENSOR.TYPE_GRAVITY
and SENSOR.TYPE_MAGNETIC_FIELD
sensors values as parameters),android.opengl.Matrix.invertM()
on the rotation matrix to invert it (not transpose!),Sensor.TYPE_LINEAR_ACCELERATION
sensor to get linear acceleration vector (in device's coord. sys.),android.opengl.Matrix.multiplyMV()
to multiply the rotation matrix by linear acceleration vector.And there you have it! I hope I will save some precious time for others.
Thanks for Edward Falk and Ali for hints!!