Android Compass orientation sur fiable (filtre passe-bas)
Im création d'une application où j'en ai besoin pour la position d'un ImageView en fonction de l'Orientation de l'appareil.
J'utilise les valeurs à partir d'une MagneticField Accéléromètre et des Capteurs pour calculer l'orientation du périphérique avec
SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerValues, magneticFieldValues)
SensorManager.getOrientation(rotationMatrix, values);
double degrees = Math.toDegrees(values[0]);
Mon problème est que le positionnement de l'ImageView est très sensible aux changements dans l'orientation. Faire de l'imageview constamment en sautant autour de l'écran. (parce que les degrés de changement)
J'ai lu que cela peut être parce que mon appareil est à proximité de choses qui peuvent affecter la magneticfield lectures. Mais ce n'est pas la seule raison qu'il semble.
J'ai essayé de télécharger certaines applications et a constaté que la "Boussole 3D" et "Compas" reste extrêmement stable dans ses lectures (lors du réglage du filtre de bruit), je voudrais le même comportement dans mon application.
J'ai lu que je peux modifier le "bruit" de mes lectures par l'ajout d'un "filtre passe-Bas", mais je n'ai aucune idée de comment mettre en œuvre cette (raison de mon manque de Mathématiques).
Im espérant que quelqu'un peut m'aider à la création d'un plus lecture stable sur mon appareil, Où un peu de mouvement à l'appareil l'habitude de nuire à l'orientation actuelle.
Droit maintenant, je fais une petite
if (Math.abs(lastReadingDegrees - newReadingDegrees) > 1) { updatePosition() }
De filtre abit du bruit. Mais sa ne fonctionne pas très bien 🙂
source d'informationauteur Mads Lee Jensen
Vous devez vous connecter pour publier un commentaire.
Si je havn'pas utilisé la boussole sur Android, le traitement de base indiqué ci-dessous (en JavaScript) fonctionnera probablement pour vous.
Il est basé sur le filtre passe-bas sur l'accéléromètre qui est recommandé par le Équipe Windows Phone avec des modifications pour convenir d'une boussole (le comportement cyclique tous les 360").
Je suppose que la lecture de la boussole est en degrés, flotter entre 0-360, et le résultat devrait être similaire.
Que vous voulez faire 2 choses dans le filtre:
Pour que nous aurons 2 constantes:
Nous avons une variable enregistrées à travers les appels, un flotteur appelé oldCompass et c'est le résultat de l'algorithme.
Donc la variable defenition est:
et la fonction reçoit newCompass, et renvoie oldCompass comme résultat.
Je vois que la question a été ouvert il y a 5 mois et n'est probablement pas pertinente, mais je suis sûr que d'autres programmeurs peuvent le trouver utile.
Oded Elyada.
Ce filtre passe-bas de travaux pour les angles en radians. Utiliser le ajouter fonction pour chaque lecture de la boussole, puis d'appeler moyenne afin d'obtenir la moyenne.
Utilisation
Math.toDegrees()
ouMath.toRadians()
à convertir.Gardez à l'esprit que, par exemple, la moyenne de 350 et 10 n'est pas 180. Ma solution:
Un filtre passe-bas (LPF), les blocs de l'évolution rapide des signaux et
permet que peu de changements dans les signaux. Cela signifie une petite
de brusques changements seront ignorés.
Le standard pour mettre en œuvre ce logiciel est de prendre un moyen
de les N derniers échantillons et que le rapport de la valeur. Commencer avec N aussi petites que 3
continuez à augmenter la N jusqu'à ce que vous trouver suffisamment lissé réponse dans votre application.
Ne garder à l'esprit que plus vous faire N, le ralentissement de la réponse du système.
Voir ma réponse à cette question connexe: Le lissage des données d'un capteur
Un logiciel de filtre passe-bas est essentiellement une version modifiée de ce. En effet, dans sa réponse, j'ai même fourni ce lien à une autre question: Filtre passe-bas du logiciel?