Acceleration from device's coordinate system into absolute coordinate system
accelerometer, android, coordinate-systems, coordinate-transformation, vector
Solution
I finally managed to solve it! So to get acceleration vector in Earth's coordinate system you need to:
- get rotation matrix (`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),
- use `android.opengl.Matrix.invertM()` on the rotation matrix to invert it (not transpose!),
- use `Sensor.TYPE_LINEAR_ACCELERATION` sensor to get linear acceleration vector (in device's coord. sys.),
- use `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!!
Problem
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: - device put on left side - device lying on back - device standing And now - why in the third case the acceleration occurs along the Z axis (not Y) since the device position doesn't matter?