Question

Le tangage et le roulis de lacet que nous obtenons de SensorManager d'Android. Je veux dire par là, le lacet et la hauteur disent où les points de l'axe y, et le rouleau concernent l'axe y. (Et mon orientation d'écran est fixée à Landsape, donc l'axe Y ne change pas). Mais ce que je veux, c'est le pas de lacet et le rouleau de l'axe Z négatif (points dans le téléphone), plus comme si mon écran de téléphone est une fenêtre de paysage dans un cockpit d'un avion, quel serait le tangage et le rouleau de lacet?

Était-ce utile?

La solution

Si je comprends ce que vous dites, vous voyez le retour et le rouleau actuels être retournés comme si l'axe + y était le vecteur «front» par défaut et l'axe + z étaient le vecteur «up» par défaut. Vous souhaitez faire une transformée de coordonnées de telle sorte que votre lacet, le tangage et le rouleau sont calculés avec l'axe -z comme vecteur «front» par défaut et le vecteur + x comme vecteur «up» par défaut.

Tout d'abord, vous devrez calculer les vecteurs avant et haut actuels à partir de votre lacet, pitch et roule dans la configuration actuelle. Cela peut être fait en utilisant des matrices de rotation 3D:http://en.wikipedia.org/wiki/ROTATION_MATRIX#ROTATIONS_IN_THREE_DIMENSIONS

Utilisez l'angle de lacet pour tourner autour de z, tanguez comme une rotation autour de x et roulez comme une rotation autour de y. Multipliez ces matrices ensemble, puis multipliez le vecteur avant (0, 1, 0) et le vecteur plus haut (0, 0, 1) par le résultat pour obtenir vos nouveaux vecteurs avant et haut.

Ensuite, vous devrez calculer les angles de lacets, de tangage et de rouleau. Le lacet est l'angle entre le vecteur avant projeté dans le plan yz (régler la valeur x sur 0) et le vecteur -z (0, 0, -1), le pas est l'angle entre le vecteur avant projeté sur le plan XZ et le - - Le vecteur z, et le rouleau est l'angle entre le vecteur up projeté sur le plan XY et le vecteur + x (1, 0, 0). Si nous laissons fx = le composant x du vecteur avant, fy être le composant y, et ainsi de suite, nous obtenons:

yaw   = acos ( -z dot (0,  Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0,  Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll  = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)

Vous devriez être en mesure de le faire pour d'autres vecteurs si j'ai choisi les mauvais.

Autres conseils

Les conventions des axes de corps utilisées dans Android ne sont pas les mêmes que celles utilisées dans l'aérospatiale (pour de bonnes raisons). L'axe des x d'un "plan" est équivalent à l'axe "Y" du dispositif Android (et de même l'axe x est lié à l'axe Y, positif ou négatif en fonction des conadtions enU). Un bon article sur les conventions de rouleau Yaw Pitch Ans peut être trouvé ici, et peut être un début à répondre à votre question: http://www.sensorplatforms.com/Understanding-orientation-conventions-mobile-platforms/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top