Получение степени вращения от датчика андроида гироскопа

Ive искал тонкий Интернет до сих пор. Я пытаюсь разработать проблему, в которой мне нужны градусы вращения от начальной точки телефона. Чтобы узнать, перемещают ли пользователи телефон вверх или вниз, я использую акселерометр, который в начале был немного нестабильным, но, тем не менее, мне удалось сделать его стабильным. Теперь мне нужна степень вращения вокруг себя. Как датчик ориентации, который устарел. Затем я попытался использовать магнитометр, но я был слишком нестабилен. Затем я решил, что хочу попробовать использовать гироскоп, когда использую пример кода:

 // This timestep's delta rotation to be multiplied by the current rotation
 // after computing it from the gyro sample data.
 if (timestamp != 0) {
     final float dT = (event.timestamp - timestamp) * NS2S;
     // Axis of the rotation sample, not normalized yet.
     float axisX = event.values[0];
     float axisY = event.values[1];
     float axisZ = event.values[2];

     // Calculate the angular speed of the sample
     float omegaMagnitude = (float) Math.sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

     // Normalize the rotation vector if it's big enough to get the axis
     if (omegaMagnitude > EPSILON) {
         axisX /= omegaMagnitude;
         axisY /= omegaMagnitude;
         axisZ /= omegaMagnitude;
     }

     // Integrate around this axis with the angular speed by the timestep
     // in order to get a delta rotation from this sample over the timestep
     // We will convert this axis-angle representation of the delta rotation
     // into a quaternion before turning it into the rotation matrix.
     float thetaOverTwo = omegaMagnitude * dT / 2.0f;
     float sinThetaOverTwo = (float) Math.sin(thetaOverTwo);
     float cosThetaOverTwo = (float) Math.cos(thetaOverTwo);
     deltaRotationVector[0] = sinThetaOverTwo * axisX;
     deltaRotationVector[1] = sinThetaOverTwo * axisY;
     deltaRotationVector[2] = sinThetaOverTwo * axisZ;
     deltaRotationVector[3] = cosThetaOverTwo;
 }
 timestamp = event.timestamp;
 float[] deltaRotationMatrix = new float[9];
 SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
 // User code should concatenate the delta rotation we computed with the current rotation
 // in order to get the updated rotation.
 // rotationCurrent = rotationCurrent * deltaRotationMatrix;

Этот код взят из их документации, могу ли я преобразовать его в 360 градусов? или я мог бы получить значения, например, на сколько градусов телефон был повернут от начальной точки?

Заранее спасибо.


person user1819127    schedule 12.11.2012    source источник


Ответы (1)


Получите матрицы вращения 3x3, R1 и R2, с помощью getRotationMatrix() в два интересующих момента времени. Вы хотели бы знать angle поворота R, который приводит R1 к выравниванию с R2.

Сначала вычислите R:

R = R1 * transpose(R2)

Затем вычислите угол этого поворота:

angle = acos((trace(R)-1)/2)

Вот и все.

person Ali    schedule 12.11.2012
comment
Большое спасибо, что нашли время, чтобы попытаться ответить на этот вопрос. Я не акула в математике. Возвращаемая RotationMatrix не является 2D, как ее транспонировать? Я сделал свой собственный метод транспонирования: public float[] transposeMatrix(float[] m){ float[] res = new float[9]; разрешение[0] = м[0]; разрешение[1] = м[3]; разрешение[2] = м[6]; разрешение[3] = м[1]; рез[4] = м[4]; разрешение[5] = м[7]; разрешение[6] = м[2]; разрешение[7] = м[5]; разрешение[8] = м[8]; вернуть м; } - person user1819127; 15.11.2012
comment
Но однако, я не могу * R1 и R2 в java, он говорит, что оператор не определен. В любом случае, вы могли бы помочь мне немного больше. Заранее спасибо! - person user1819127; 15.11.2012
comment
Википедия — ваш друг: транспонировать и умножение матриц. - person Ali; 15.11.2012