L'obtention du Vecteur de Direction dans Android
Comment puis-je obtenir un vecteur de direction représentant de la direction de l'arrière de l'appareil est orienté par rapport à la terre coordonnées?
Par exemple, si la place sur un bureau (écran orienté vers le haut) il faut lire [0,0,-1] et si tenu à la verticale, orientée vers le nord il faut lire [1,0,0], etc.
Je sais comment le calculer à partir de la rubrique, le tangage, le roulis et aussi longtemps que ceux-ci sont par rapport à la terre coordonnées. Pour être clair, je ne recherche pas la vitesse angulaire, mais le courant réel de l'angle par rapport au plan tangent à la terre. Donc, si l'appareil est tenu à la verticale et orientée vers le nord, l'angle "alpha" doit se lire 0 ou 360, l'angle de "bêta" doit se lire de 90, et "gamma" doit se lire 0. Je ne peux pas comprendre comment obtenir ces valeurs.
J'ai lu les API de tous les jours et je ne trouve toujours pas comment faire pour obtenir l'une de ces choses.
public void onSensorChanged(SensorEvent event) {
//?
}
Merci pour toutes les suggestions.
Vous devez vous connecter pour publier un commentaire.
SensorManager.getRotationMatrix()
fait ce qui est décrit ci-dessous, écrit avant que je ne la trouve. Je vais laisser l'ajout d'une explication si vous souhaitez corriger la différence entre le magnétique et le nord géographique, vous aurez toujours besoin d'elle.Bruts de l'algorithme est d'obtenir la matrice de rotation, multiplier le vecteur
[0,0,-1]
par elle, puis de l'ajuster à votre système de coordonnées. Pourquoi? Android docs donner le système de coordonnées pour l'appareil et le mondeNote
[0,0,-1]
en appareil Android coordonnées des points de la perpendiculaire arrière de l'écran. Si vous multipliez matrice de rotation R par ce vecteur, vous aurez[0,0,-1]
dans le monde coords lorsque l'appareil est sur la table, face vers le haut que vous le désirez. Quand il est debout, face au nord, vous aurez[0,-1,0]
, ce qui indique que vous avez choisi un système de coordonnées oùx
ety
sont échangés à l'égard du système Android, mais c'est simplement un changement de conventions.Note
R * [0,0,-1]^T
est seulement la troisième colonne deR
niée. De ce que je reçois le pseudo-code:Cela devrait obtenir ce que vous voulez.
Plus d'informations sur ce
getRotationMatrix()
est en train de faire ce qui suit.Vous avez besoin de accerometer des données permettant de déterminer la direction "bas" et le magnétomètre de données afin de déterminer la direction "nord". Vous aurez à assumer les accéléromètres sont la seule détection de la gravité (l'appareil est à l'arrêt ou en mouvement, à une constante de vitesse). Ensuite, vous avez besoin de projeter le magnétomètre vectoriel sur le plan perpendiculaire au vecteur gravité (parce que le champ magnétique n'est généralement pas tangent à la surface de la terre). Cela vous donne deux axes. Le troisième est orthogonale, alors peut être calculée par la croix du produit. Cela vous donne la terre de coordonnées des vecteurs dans l'appareil du système. Il semble que vous souhaitez à l'inverse: les coordonnées de périphérique dans la terre coordonnées. Pour cela il suffit de construire la matrice de la direction de cosinus et de inverser la.
Je vais ajouter que la discussion ci-dessus suppose que le magnétomètre vectoriel points du nord. Je pense (de la haute école des sciences!) c'est en fait vers le sud magnétique, sans en avoir l'appareil à main ne peut donc pas l'essayer. Bien sûr magnétique nord/sud est différente de la valeur true par zéro à 180 degrés selon l'endroit où vous êtes sur la terre. Vous pouvez récupérer les coordonnées GPS et de calculer un décalage réel.
Si vous n'êtes pas familier avec les mathématiques nécessaires pour faire cela, je peux l'expliquer davantage, mais il faudra être plus tard.
Lire cette page: http://developer.android.com/reference/android/hardware/Sensor.html
De l'API de 8 et ci-dessus, il y a "virtuel" des capteurs qui sont généré par la combinaison de la participation de tous les capteurs disponibles et des filtres appropriés. Le "TYPE_ORIENTATION" capteur vous donne la allover l'orientation de votre appareil, mais cette interface est déconseillée en raison de l'échec des états à certaines orientations. Le nouveau capteur est TYPE_ROTATION_VECTOR (API 9 et ci-dessus), qui donne à votre appareil de l'orientation d'un quaternion. C'est vraiment le meilleur capteur à utiliser, mais les mathématiques derrière c'est un peu lourd.
À défaut, ce que vous avez à faire est d'appeler SensorManager.getRotationMatrix(), en passant de la dernière gravité et un magnétomètre de données. Cela renvoie une matrice de rotation qui peut être utilisé pour convertir un vecteur de coordonnées de périphérique pour les coordonnées du monde ou vice-versa (juste transposer la matrice à inverser).
La getOrientation() la fonction peut vous donner le cap, le tangage et le roulis, mais ceux-ci ont les mêmes états de défaillance comme les TYPE_ORIENTATION capteur.
Voici un exemple de code que vous pouvez trouver utile: