29 votes

Compenser le décalage de la boussole avec le gyroscope sur iPhone 4

J'ai fait des expériences avec la boussole et gyroscope de l'iPhone 4 et voudrais un peu d'aide avec un problème que je vais avoir. Je veux compenser la lenteur de la boussole en utilisant les données du gyroscope.

À l'aide de CMMotionManager et son CMDeviceMotion objet (motionManager.deviceMotion), j'ai l' CMAttitude objet. Corrigez-moi si je me trompe (s'il vous plaît), mais voici ce que j'ai déduit de l' CMAttitude de l'objet yaw bien (je n'ai pas besoin pitch ni roll pour ma part):

  • yaw varie de 0 de PI lorsque le téléphone est orienté vers le bas (comme indiqué par deviceMotion.gravity.z) et de se balancer dans le sens antihoraire et l' 0 de -PI lorsque basculé dans le sens des aiguilles
  • lorsque l'appareil est orienté à la hausse, yaw varie de -PI de 0 et PI de 0, respectivement
  • et à partir de la boussole de données (je suis à l'aide d' locationManager.heading.magneticHeading- )), je vois que la boussole donne des valeurs de 0 de 360, la valeur augmente lorsque balancer des aiguilles d'une montre

Tout droit, à l'aide de toutes ces informations ensemble, je suis en mesure d'obtenir une valeur que j'ai appel horizontal que, indépendamment de savoir si l'appareil est orienté vers le haut ou vers le bas, va donner de la valeur à partir d' 0 de 360 et à augmenter lorsque l'appareil est balancé dans le sens horaire (même si je suis encore avoir des problèmes lors de l' deviceManager.gravity.z est d'environ 0 -- l' yaw de la valeur freaks à ce gravity.z de la valeur).

Il me semble que je pourrais "synchroniser" l' horizontal et magneticHeading valeurs, à l'aide d'un calculés horizontal de la valeur des cartes d' magneticHeading, et "synchroniser" l' horizontal valeur magneticHeading quand je sens que la boussole a "rattrapé."

Donc mes questions:

  • Suis-je sur la bonne voie avec cette?
  • Suis-je en utilisant le gyroscope de données à partir d' CMDeviceMotion correctement et les hypothèses que j'ai énumérés ci-dessus correcte?
  • Pourquoi peut - yaw paniquer lorsqu' gravity.z est d'environ 0?

Je vous remercie beaucoup. J'attends avec impatience vos réponses!

20voto

FerryHtw Points 195

Juste essayer de répondre... corrigez-moi si je me trompe..

1.Oui, vous êtes sur la bonne voie

2.la gravité en CM est déjà "isolé" de l'utilisateur de la gravité (gravité de la valeur causée par l'utilisateur de l'accélération) c'est pourquoi il y a deux gravité, la "gravité" et "userAcceleration" sa sur apple documentation CM // Note : pas entièrement isolé //

3. si vous avez une gravité 0, cela signifie que le correspondant de l'axe est perpendiculaire à la gravité. de la gravité.z est l'écran de l'iPhone c'est pourquoi il -9.82 m/s2 si vous mettez sur le bureau avec l'écran à la verticale, effectivement il est difficile de faire 0 ou à la valeur maximale de la gravité en raison du bruit du capteur (c'est normal, tous le capteur a un bruit particulièrement bon marché capteur).

ce que je fais sur mes applications est, je vais passer mon axe de référence à d'autres de l'axe (dans votre cas, peut-être x ou y) de certaines limites, l'évolution de la stratégie dépend de la fin ou de quel côté est votre référence.

l'autre chose est, gyro est rapide, mais n'est pas stable, vous avez besoin de re-calibrer la valeur pour plusieurs d'intervalle. Dans mon cas, toutes les 5 secondes. J'ai expérience avec gyro pour le calcul de l'angle entre deux avions, j'ai essayer avec exactement 90 degrés de la règle, et vous obtiendrez une erreur d'environ 0,5 degré à chaque seconde d'essayer et de continuer à augmenter, mais c'est la mienne, peut-être que d'autres ont une meilleure méthode pour éviter l'erreur.

ci-dessous mon étapes "

  1. Init
  2. Lire la gravité XYZ -> Xg Yg Zg
  3. Vérifier si Xg < 0.25 Si la valeur est TRUE essayer Yg alors Zg // Note 1 = 1g = 9,82 m/s^2
  4. Lire la boussole et gyroscope
  5. Configurer et étalonner le gyro à l'aide de la boussole et calculez basé sur l'axe-je utiliser dans le point 3.
  6. Si 5 seconde est de passer ensuite à recalibrer, lire la boussole
  7. Si la différence avec le gyroscope de la lecture est > 5 degré sauter recalibartion du gyroscope.
  8. Si la différence avec le gyroscope de la lecture est < 5 degré étalonnez le gyroscope à l'aide de la boussole de la valeur

Remarque: pour numéro 7 : est de vérifier si le téléphone atteintes de champ magnétique ou à proximité d'énormes acier ou de haute tension électrique de la ligne ou dans un environnement bruyant et de l'équipement lourd dans l'usine de l'usine.

C'est tout... Espérons que cela pourrait vous aider... Et désolé pour mon anglais..

10voto

Ellen S Points 544

Voici un exemple d'application iPhone où la boussole est compensée par le gyroscope. Le code et le projet peuvent être consultés ici: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

0voto

hotpaw2 Points 40796

La direction du vecteur de l'axe de lacet n'est pas définie en cas de gravité nulle (ou en chute libre, ou suffisamment près).

Pour effectuer la synchronisation en mouvement, vous devez créer un filtre pour votre valeur "horizontale" qui a les mêmes caractéristiques de réponse de retard / retard que le compas magnétique. Soit cela, soit attendez que le mouvement s'arrête suffisamment longtemps pour que les deux valeurs se stabilisent avant de recalculer le décalage.

0voto

Developer Points 84

Réponse à la question 1 est Oui, la question 2, vous êtes sur la bonne voie, mais vous pouvez utiliser un nom de variable qui n'est pas "horizontale", la question 3 est répondu par hotpaw2 et également un lacet dans un hachoir ou d'un hélicoptère à proximité de l'altitude zéro serait alerte le pilote d'une alarme. Il y a un décalage dans le temps, parce que le logiciel est local alors qu'il ya d'autres facteurs qui peuvent ralentir y compris l'accès à un capteur pour la détection des ondes magnétiques, la position de l'appareil et de la direction, la préparation de la sortie graphique pour l'affichage de la boussole, de l'informatique et de la sortie de données du gyroscope et de capteurs via une interface relativement lente, à l'aide d'un usage général de poche le dispositif n'est pas conçu sur mesure pour le type de travail demandé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X