2014-07-09 3 views
0

Je travaille sur un projet où je veux convertir mon axe de téléphones Android sur l'axe de coordonnées mondial. J'ai l'accélération le long des téléphones 3 axes (x, y, z) et les trois angles étant l'azimut, le tangage et le roulis. Comment puis-je procéder en convertissant virtuellement mon axe de téléphones à l'axe de coordonnées du monde (TrueTorth, Trueeast). Dans la mesure où je fais est de me donner un mauvais résultat. C'est mon approche.Conversion de l'axe du téléphone en axe de coordonnées du monde

permet de dire -0,030029837 -0,008528218 -0,199289320 est l'accélération le long de X de téléphone, Y, axe Z et 0,01618620 0,48581530 0,19617330 sont les trois angles (en radians) étant l'azimut, de tangage et roulis. Pour obtenir l'accélération le long du "truenorth" je prends simplement l'accélération le long de l'axe Y et en le multipliant par cos de tous les trois angles ie. -0.008528218 * cos (0.19617330) * cos (0.48581530) * cos (0.01618620) = - 0,00739584

Pour obtenir l'accélération le long de la "trueeast" je prends simplement l'accélération le long de l'axe X et en le multipliant avec cos de tous les trois angles à savoir. -0.030029837 * cos (0.19617330) * cos (0.48581530) * cos (0.01618620) = - 0,026042471

Pour obtenir l'accélération le long de la je prends simplement "vertical vers le haut" l'accélération le long de l'axe Z et en le multipliant avec cos de les 2 angles ie. -0.199289320 * cos (0.19617330) * cos (0.48581530) = - 0.172850298

Maintenant, pour vérifier si je l'ai fait correct ou faux. J'ai fait un test de cohérence. L'amplitude de l'accélération le long de l'axe X, Y, Z du téléphone doit être égale à l'amplitude de l'accélération le long du trueeast, du truenorth et verticalement vers le haut. Mais cela n'arrive pas à égal.

0,20 est pas égal à 0,17

Où vais-je tort? Ce serait d'une grande aide si quelqu'un pouvait m'aider.

Merci beaucoup d'avance.

Répondre

0

Je suppose que vos angles d'azimut, de tangage et de roulis représentent la déviation des axes du téléphone par rapport aux axes du monde. Si mon hypothèse est bonne, les lignes de code suivantes répondront à vos besoins.

float yaw = (float) Math.toDegrees(0.01618620); 
    float pitch = (float) Math.toDegrees(0.48581530); 
    float roll = (float) Math.toDegrees(0.19617330); 
    float acc[] = { -0.030029837f, -0.008528218f, -0.199289320f, 1 }; 

    float[] matrix = new float[16]; 
    Matrix.setIdentityM(matrix, 0); 
    Matrix.rotateM(matrix, 0, yaw, 0, 0, 1); 
    Matrix.rotateM(matrix, 0, pitch, 0, 1, 0); 
    Matrix.rotateM(matrix, 0, roll, 1, 0, 0); 

    float accT[] = new float[4]; 
    Matrix.multiplyMV(accT, 0, matrix, 0, acc, 0); 

    float rawMagnitude = Matrix.length(acc[0], acc[1], acc[2]); 
    System.out.println(rawMagnitude); 
    float transformedMagnitude = Matrix.length(accT[0], accT[1], accT[2]); 
    System.out.println(transformedMagnitude); 

La console grandeurs sont imprimées

0.2017195 
    0.20171948 

J'utilisé android.opengl.Matrix. Les méthodes statiques utilisées ici sont explicites pour plus de détails voir la documentation de l'API. Si mon hypothèse est exactement opposée, c'est-à-dire si vos angles d'azimut, de tangage et de roulis représentent la déviation des axes du monde par rapport aux axes téléphoniques, il vous suffit de rendre vos angles d'azimut, de tangage et de roulis négatifs.

Questions connexes