Извлечь рыскание, тангаж и крен из RotateMatrixAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Извлечь рыскание, тангаж и крен из RotateMatrix

Сообщение Anonymous »

У меня есть диспетчер датчиков, который возвращает матрицу вращения на основе устройств Магнитометр и Акселерометр. Я также пытался рассчитать угол отклонения от курса и крен пользовательского устройства, но обнаружил, что шаг и крен мешают друг другу и дают неточные результаты. Есть ли способ извлечь PITCH и ROLL устройства из матрицы вращения?

РЕДАКТИРОВАТЬ
Пытаюсь интерпретируйте ответ блендера ниже, за что я благодарен, но еще не совсем готов, я пытаюсь получить угол из матрицы вращения следующим образом:

float R[] = phoneOri.getMatrix();
double rmYaw = Math.atan2(R[4], R[0]);
double rmPitch = Math.acos(-R[8]);
double rmRoll = Math.atan2(R[9], R[10]);


Я не знаю, ссылаюсь ли я на неправильные части матрицы или нет, но я не получаю ожидаемых результатов.

Я надеялся получить значения в градусах, но получил странные целые числа.

Моя матрица берется из моего SensorManager, который выглядит так:

public void onSensorChanged(SensorEvent evt) {
int type=evt.sensor.getType();
if(type == Sensor.TYPE_ORIENTATION){
yaw = evt.values[0];
pitch = evt.values[1];
roll = evt.values[2];
}
if (type == Sensor.TYPE_MAGNETIC_FIELD) {
orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
} else if (type == Sensor.TYPE_ACCELEROMETER) {
acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
}
if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
float newMat[]=new float[16];

SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
if(displayOri==0||displayOri==2){
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
}else{
SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
}

matrix=newMat;


образец матрицы, когда устройство лежит на столе лицевой стороной вверх

0.9916188, -0.12448014, -0.03459576, 0.0
0.12525482, 0.9918981, 0.021199778, 0.0
0.031676512,-0.025355382, 0.9991765, 0.0
0.0, 0.0, 0.0, 1


ОТВЕТ

double rmPitch = Math.toDegrees( Math.acos(R[10]));


Подробнее здесь: https://stackoverflow.com/questions/115 ... tionmatrix
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»