2010-11-18 44 views
30

J'ai expérimenté avec la boussole et le gyroscope sur l'iPhone 4 et je voudrais de l'aide pour un problème que j'ai. Je veux compenser la lenteur de la boussole en utilisant les données du gyroscope.Compenser le décalage de la boussole avec le gyroscope sur l'iPhone 4

En utilisant CMMotionManager et son objet CMDeviceMotion (motionManager.deviceMotion), j'obtiens l'objet CMAttitude. Corrigez-moi si je me trompe (s'il vous plaît), mais voici ce que j'ai déduit de la propriété de l'objet CMAttitudeyaw (je ne ai pas besoin pitch ni roll pour mes besoins):

  • yaw varie de 0 à PI lorsque le téléphone est dirigée vers le bas (comme indiqué par deviceMotion.gravity.z) et pivotant dans le sens antihoraire et 0--PI lorsque basculé dans le sens horaire
  • lorsque le dispositif est dirigé vers le haut, yaw varie de -PI à 0 et PI-0 respectivement
  • et à partir des données de la boussole (j'utilise locationManager.heading.magneticHeading), je vois que la boussole donne des valeurs 0-360, avec la valeur croissante en balançant dans le sens horaire

D'accord, donc en utilisant tous de cette information ensemble, je suis en mesure d'obtenir une valeur que j'appelle horizontal qui, peu importe si le périphérique pointe vers le haut ou vers le bas, donnera 0 à 360 et augmentera lorsque l'appareil est balancé dans le sens des aiguilles d'une montre (bien que je problème quand deviceManager.gravity.z est autour de 0 - la valeur yaw panique à ceValeur).

Il me semble que je pouvais « synchroniser » les horizontal et magneticHeading valeurs, en utilisant une valeur horizontal calculée qui correspond à magneticHeading et « synchroniser » la valeur horizontal-magneticHeading quand je sens la boussole a « rattrapé. »

Mes questions:

  • Suis-je sur la bonne voie avec ce? Est-ce que j'utilise correctement les données gyro de CMDeviceMotion et que les hypothèses que j'ai énumérées ci-dessus sont correctes?
  • Pourquoi pourrait yaw paniquer lorsque gravity.z est d'environ 0?

Merci beaucoup. J'ai hâte d'entendre vos réponses!

Répondre

21

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

1.Oui vous êtes sur la bonne voie

2.gravity CM est déjà « isolé » de la gravité de l'utilisateur (valeur de gravité provoquée par l'accélération de l'utilisateur) c'est pourquoi il y a deux poids, la « gravité » et « userAcceleration » son sur la documentation CM apple // note: pas tout à fait isolé //

3. si vous avez une gravité 0 cela signifie que l'axe correspondant est perpendiculaire à la gravité. gravity.z est l'écran de l'iPhone c'est pourquoi -9.82m/s2 si vous mettez sur le bureau avec l'écran vertical, il est difficile d'obtenir 0 ou la valeur maximale de la gravité en raison du bruit du capteur (c'est normal, tous les capteurs ont un capteur de bruit particulièrement bon marché). Ce que je fais sur mes applications est que je vais changer mon axe de référence à un autre axe (dans votre cas, peut être x ou y) pour certaines limites, comment la stratégie dépend de l'objectif ou du côté est votre référence.

l'autre chose est, gyro est rapide mais ce n'est pas stable, vous devez recalibrer la valeur pendant plusieurs intervalle. Dans mon cas toutes les 5 secondes. J'ai expérimenté avec gyro pour calculer l'angle entre deux plans, j'essaie avec une règle exacly 90 degrés et il donnera une erreur d'environ 0.5 degré chaque seconde et continuer à augmenter, mais c'est à moi, peut-être que d'autres ont une meilleure Erreur.

ci-dessous est mes pas "

  1. Init
  2. Lire la gravité XYZ -> Xg Yg Zg
  3. Vérifiez si Xg < 0,25 Si TRUE essayez Yg alors Zg // Note 1 = 1 g = 9,82 m/s^2
  4. Lire le compas gyroscopique et
  5. Configurer et calibrer le compas gyroscopique à l'aide du calulate et sur la base de laquelle on utilise l'axe I au point 3.
  6. Si 5 secondes sont réussies puis recalibrez, lisez la boussole
  7. Si la différence avec la lecture du gyroscope est> 5 degrés, sautez le calibrage du gyroscope.
  8. Si la différence avec la lecture du gyroscope est < 5 degrés calibrer en utilisant la valeur de la boussole du gyroscope

Note: pour le numéro 7: est de vérifier si le téléphone affecté avec le champ magnétique ou à proximité énorme acier telle ou haute tension ligne électrique ou dans l'équipement bruyant et lourd dans l'usine d'usine.

C'est tout ... J'espère que cela pourrait vous aider ... Et désolé pour mon anglais ..

+0

Pour l'étape d'initialisation, assurez-vous d'inviter l'utilisateur à s'arrêter un moment. passez l'étape 7 si vos applications ne rencontrent pas l'acier ou l'électricité, dans mon cas j'en ai besoin car il est utilisé en usine avec un équipement haute tension et un pipeline en acier. – FerryHtw

0

La direction du vecteur d'axe de lacet n'est pas définie en cas d'apesanteur (ou chute libre, ou assez proche). 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, ou attendez que le mouvement s'arrête suffisamment longtemps pour que les deux valeurs se stabilisent avant de recalculer le décalage.

0

La réponse à la question 1 est Oui, question 2 vous êtes sur la bonne voie mais vous pouvez utiliser un nom de variable qui n'est pas horizontal, la question 3 est traitée par hotpaw2 et aussi un lacet dans un hélicoptère l'altitude nulle alerterait le pilote avec une alarme. Il y a un décalage temporel car une partie du logiciel est locale alors que d'autres facteurs peuvent la ralentir: accès à un capteur pour détecter les ondes magnétiques, position et direction du périphérique, préparation de la sortie graphique pour l'affichage de la boussole, calcul et sortie les données du gyroscope et des capteurs à travers une interface relativement lente, en utilisant un appareil portatif à usage général non conçu pour le type de tâche qui lui est demandé.