Transformação dos dados do acelerômetro das coordenadas do dispositivo para as coordenadas do mundo real

Sinto muito se esta é uma pergunta muito básica, mas não tenho escolha, mas pergunto: Como você traduz os dados do acelerômetro das coordenadas do dispositivo para as coordenadas do mundo rea

Quero dizer, supondo que o acelerômetro esteja me dando algo como (Ax, Ay, Az) -as coordenadas do dispositivo -, que transformações devo aplicar para transformar os valores em (Ax ', Ay', Az ') -as coordenadas do mundo re -, para que eu possa usar o vetor de aceleração nas coordenadas do mundo real para calcular se o dispositivo está acelerando norte, leste, sudoeste, et

Estive trabalhando com esse problema nos últimos dias. No começo, pensei que não seria difícil, mas depois de pesquisar dezenas de páginas, não consegui nada funcional.

By the way, aqui está um código com o que eu tenho implementado até agora:

    private SensorEventListener mSensorEventListener = new SensorEventListener() {

    public void onAccuracyChanged(Sensor sensor, int accuracy){
}

    public void onSensorChanged(SensorEvent event) {
        switch(event.sensor.getType()){
        case Sensor.TYPE_ACCELEROMETER:
            accelerometervalues = event.values.clone();
            AX.setText(accelerometervalues[0]+"");
            AY.setText(accelerometervalues[1]+"");
            AZ.setText(accelerometervalues[2]+"");
            break;
        case Sensor.TYPE_ORIENTATION:
            orientationvalues = event.values.clone();
            azimuth.setText(orientationvalues[0]+"");
            pitch.setText(orientationvalues[1]+"");
            roll.setText(orientationvalues[2]+"");
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomagneticmatrix =event.values.clone();
            TAX.setText(geomagneticmatrix[0]+"");
            TAY.setText(geomagneticmatrix[1]+"");
            TAZ.setText(geomagneticmatrix[2]+"");
            break;
        }
        if (geomagneticmatrix != null && accelerometervalues != null) {
            float[] R = new float[16];
            float[] I = new float[16];
            SensorManager.getRotationMatrix(R, I, accelerometervalues, geomagneticmatrix);
            //What should I do here to transform the components of accelerometervalues into real world acceleration components??
        }
   }
};

Eu tenho

Um vetor de acelerações em coordenadas nativas emaccelerometervalues.

Um vetor de valores de campo magnético emgeomagneticmatrix.

Azimuth, arremesso e rolagemorientationvalues.

Matriz de rotaçãoR. Matriz de inclinaçãoI.

Acho que todas as informações necessárias estão disponíveis, azimute, pitch and roll devem descrever o deslocamento do sistema de coordenadas do dispositivo em relação ao sistema de coordenadas do mundo real. Além disso, acredito queR é / pode até ser usado como um vetor norte verdadeiro dentro das coordenadas do dispositiv

Parece-me que obter os valores da aceleração no mundo real é apenas uma transformação matemática longe desses dados. Eu simplesmente não consigo entende

Desde já, obrigado

Editado

Tentei multiplicar diretamente os componentes deaccelerometervalues com a matriz de rotaçãoR (trueaccel = accel * R), mas não funciono

                    trueacceleration[0]= accelerometervalues[0]*R[0]+accelerometervalues[1]*R[1]+accelerometervalues[2]*R[2];
                trueacceleration[1]= accelerometervalues[0]*R[1]+accelerometervalues[1]*R[4]+accelerometervalues[2]*R[7];
                trueacceleration[2]= accelerometervalues[0]*R[2]+accelerometervalues[1]*R[5]+accelerometervalues[2]*R[8];

Eu também tentei multiplicaraccelerometervalues com a matriz de inclinação I. Também multipliquei com R e I (trueaccel = accel * R * I) e isso também não funcionou. Nem ligar pararemapcoordinates() e multiplique em qualquer um dos formulários anteriore

lguém tem uma idéia do que estou fazendo de errad

questionAnswers(5)

yourAnswerToTheQuestion