Как получить кватернион из матрицы вращения в Android?

Я пытаюсь получить ориентацию устройства Android, и мне нужно, чтобы оно было в кватернионной структуре (в основном float[4]).

Что у меня сейчас есть:

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
    last_acc = (float[])event.values.clone();
}
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
    last_mag = (float[])event.values.clone();
}
if (last_acc != null && last_mag != null){
    SensorManager.getRotationMatrix(rotation, inclination, last_acc, last_mag);
    SensorManager.getOrientation(rotation, orientation);

В «вращении» у меня есть матрица вращения 4x4, а в ориентации у меня есть вектор float [3], где у меня есть азимут, тангаж и крен.

Как мне теперь получить кватернион?


person Alex    schedule 15.02.2012    source источник


Ответы (2)


Я бы не стал использовать углы Эйлера (крен, тангаж, рыскание), это в значительной степени портит стабильность вашего приложения.

Что касается преобразования матрицы вращения в кватернион, Google говорит:

person Ali    schedule 15.02.2012
comment
Спасибо за ответ. Думаю, это то, что мне нужно. Кроме того, видео Google, в котором это объясняется, очень ясно. Еще раз спасибо :) - person Alex; 16.02.2012
comment
@Alex Рад это слышать. Удачи! - person Ali; 16.02.2012

Если вы не возражаете против того, чтобы быть доступным только для уровня API 9 и выше, вы можете использовать Sensor.TYPE_ROTATION_VECTOR, который в любом случае возвращает кватернион единиц и сохраняет вам работу. Если передать массив длиной 3, значения будут векторной частью кватерниона, удовлетворяющей sin(theta / 2) * u, где u - трехмерный единичный вектор. Если массив имеет длину 4, четвертое значение будет скалярным значением кватерниона единицы, cos(theta / 2).

http://developer.android.com/reference/android/hardware/SensorEvent.html#values

person BellyItcher    schedule 21.09.2012