Android Boussole qui peut Compenser l'Inclinaison et la Hauteur
Je suis en train de faire une application sur mon téléphone Android (Nexus 4), qui sera utilisé dans un modèle de bateau. J'ai ajouté des filtres passe-bas pour éliminer les gitter des capteurs.
Cependant, la boussole n'est stable lorsque le téléphone est à plat sur son dos. Si je l'inclinaison, (comme tourner une page d'un livre), puis la direction de la boussole va off - 50*.
J'ai essayé cela avec Capteur.TYPE_MAGNETIC_FIELD avec Capteur soit.TYPE_GRAVITY et le Capteur.TYPE_ACCELEROMETER et l'effet est le même.
J'ai utilisé la solution mentionnée ici, et de nombreux autres endroits. Mes maths n'est pas très grand, mais il doit être un problème commun et je trouve cela frustrant qu'il n'est pas une API de traiter avec elle.
J'ai travaillé sur ce problème depuis 3 jours et n'ont toujours pas trouvé de solution, mais lorsque j'utilise le Boussole à partir de Catch, il reste stable, peu importe combien le téléphone est incliné. Je sais que ça doit être possible.
Tout ce que je veux faire est de créer une boussole que si le téléphone est pointé à-dire vers le nord, la boussole lire nord, et de ne pas sauter lorsque le téléphone est déplacé à travers tout autre de l'axe de roulis ou de tangage).
Quelqu'un peut s'il vous plaît aider avant que je dois abandonner mon projet.
Grâce,
Adam
- Ne vous faites pivoter le téléphone lors de l'inclinaison vers le haut?
Vous devez vous connecter pour publier un commentaire.
Par la co-incidence, j'ai pensé à ce problème depuis plusieurs semaines, parce que
Ainsi, au cours des deux derniers jours, je suis venu avec ma propre façon de calculer la valeur d'azimut pour l'utilisation de la boussole.
J'ai mis que les maths et je suis en utilisant ici math.stackexchange.com, et je l'ai collé le code que j'ai utilisé ci-dessous. Le code calcule l'azimut et la hauteur de la crue
TYPE_GRAVITY
etTYPE_MAGNETIC_FIELD
les données du capteur, sans appels d'API, par exempleSensorManager.getRotationMatrix(...)
ouSensorManager.getOrientation(...)
. Le code pourrait sans doute être améliorée, par exemple en utilisant un filtre passe-bas si les entrées à son tour d'être un peu erratique. Notez que les dossiers du code de la précision des capteurs via la méthodeonAccuracyChanged(Sensor sensor, int accuracy)
, donc si l'azimut semble instable une autre chose à vérifier est le degré de précision de chaque capteur. En tout cas, avec tous les calculs explicitement visible dans ce code, si il y a des problèmes d'instabilité (lorsque la précision du capteur est raisonnable), alors qu'ils pourraient être abordés en regardant les instabilités dans les entrées ou dans les vecteurs de directionm_NormGravityVector[]
,m_NormEastVector[]
oum_NormNorthVector[]
.Je serais très intéressé par tous les commentaires que quelqu'un a pour moi sur cette méthode. Je trouve qu'il fonctionne comme un rêve dans mon propre application, aussi longtemps que l'appareil est à plat face vers le haut, à la verticale, ou quelque part entre les deux. Cependant, comme je le mentionne dans l'math.stackexchange.com l'article, il y a des questions qui se posent sur l'appareil est près d'être chamboulée. Dans cette situation, il serait nécessaire de définir soigneusement ce comportement on veut.
TYPE_ROTATION_VECTOR
ouGYROSCOPE
, tous les autres capteurs très bruyant donnéesOK, pense que je l'ai résolu.
Plutôt que d'utiliser le Capteur.TYPE_ACCELEROMETER (ou TYPE_GRAVITY) et le Capteur.TYPE_MAGNETIC_FIELD, j'ai utilisé du Capteur.TYPE_ROTATION_VECTOR avec:
Cette retourné stable azimut peu importe le rouleau ou la hauteur du téléphone.
Si vous regardez ici, à l'Android Détecteurs de Mouvement, juste sous le Tableau 1, il est dit que le capteur de ROTATION est idéal pour la boussole, de réalité augmentée, etc.
Si facile quand vous savez comment.... Cependant, je n'ai pas encore tester cela pour voir si des erreurs s'y sont introduites.
Le problème que vous avez est probablement Gimbal lock. Si vous pensez cela, lorsque le téléphone est à la verticale de sorte que la hauteur est de plus ou moins 90 degrés, puis de l'azimut et de roulis sont la même chose. Si vous regardez dans les mathématiques, vous verrez que dans cette situation, soit l'azimut+rouleau ou azimut-roll est bien défini, mais ils ne sont pas définis individuellement. Ainsi, lorsque le terrain se rapproche de plus ou moins 90 degrés les lectures de devenir instable. Certaines personnes choisissent de reconfigurer le système de coordonnées de tom essayer de contourner cela, voir, par exemple,Comment dois-je calculer l'azimut, hauteur, orientation lors de mon appareil Android n'est pas plat?, donc peut-être qui pourraient travailler pour vous.
Prendre un coup d'oeil à Mixare, open source outil de réalité augmentée pour android et iphone, il a des trucs très sympas, il y a environ compenser les téléphones orientation/position de montrer les choses correctement sur l'écran.
EDIT: en particulier, jetez un oeil à la MixView classe java qui gère le capteur événements.
C'est une autre manière d'obtenir le cap magnétique, sans être affectée par de tangage ou de roulis.
j'ai constaté que sur certains modèles de smartphones , l'activation de l'appareil photo peut changer la BOUSSOLE datas... 1/10 diplômés... (liées à la lumière de la scène)
noir de la scène... 1/2 .... très blanc de la scène (10 ou plus diplômés)