Question

Je l'ai expérimenté avec la boussole et gyroscope sur iPhone 4 et je 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.

Utilisation CMMotionManager et son objet CMDeviceMotion (de motionManager.deviceMotion), je reçois 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é CMAttitude de l'objet yaw (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ée dans le sens horaire
  • lorsque le dispositif est dirigé vers le haut, se situe yaw 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 de 0 à 360, avec la valeur croissante en balançant dans le sens horaire

D'accord, donc utiliser toutes ces informations, je suis en mesure d'obtenir une valeur que j'appelle horizontal que, indépendamment du fait que l'appareil pointe vers le haut ou vers le bas, donnera des valeurs de 0 à 360 et augmenter lorsque le dispositif est dans le sens horaire balancées. (bien que je suis toujours du mal quand deviceManager.gravity.z est autour 0 - la valeur yaw disjoncte à cette valeur de gravity.z)

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

Alors mes questions:

  • Suis-je sur la bonne voie avec cela?
  • Suis-je utiliser les données du gyroscope de CMDeviceMotion correctement et les hypothèses que j'ai énumérés ci-dessus correcte?
  • Pourquoi peut-yaw paniquer quand gravity.z est autour 0?

Merci beaucoup. Je me réjouis d'entendre vos réponses!

Était-ce utile?

La solution

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 » sur sa documentation CM Apple // Note: pas tout à fait isolé //

3. si vous avez une gravité 0 cela signifie que l'axe est perpendiculaire avec lui correspondant gravité. gravity.z est le thats écran iPhone pourquoi il -9.82m / s2 si vous mettez sur le bureau avec un écran en position verticale, il est difficile de actualy obtenir 0 ou valeur maximale de la gravité en raison du bruit du capteur (il est normal, tout capteur a une bruit capteur expecially pas cher).

ce que je fais sur mes applications est je changer mon axe de référence à un autre axe (dans votre cas x ou y) pour certaines limites, comment la stratégie est dépend de l'objectif ou de quel côté est votre référence.

autre chose est, gyro est rapide mais ce ne est pas stable, vous avez besoin de recalibrer la valeur pour plusieurs intervalles. Dans mon cas, tous les 5 secondes. J'ai l'expérience avec le compas gyroscopique pour calculer l'angle entre deux plans, j'essaie avec exacly 90 règle de degré et il vous donnera une erreur d'environ 0,5 degré chaque seconde essayer et continuer à augmenter, mais c'est est à moi, peut-être que d'autres ont une meilleure méthode pour éviter la Erreur.

ci-dessous est mes pas «

  1. Init
  2. Lire XYZ gravité -> 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 la boussole et gyroscope
  5. Configurer et calibrer le compas gyroscopique à l'aide du calulate et sur la base duquel l'axe I utilise au point 3.
  6. Si 5 secondes est passe recalibrer alors, lisez la boussole
  7. Si la différence avec la lecture du gyroscope est> 5 degrés sauter recalibartion le gyroscope.
  8. Si la différence avec la lecture du gyroscope est <5 degrés en utilisant la valeur de calibrer 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 en acier tels ou haute tension ligne électrique ou dans les équipements bruyants et lourds dans l'usine de l'usine

.

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

Autres conseils

Voici un exemple d'une application iPhone où la boussole dédommagé avec le gyroscope. Code et projet peut être vu ici: http://www.sundh.com/blog/2011/09 / stabalize-boussole-de-iphone-à-gyroscope /

La direction du vecteur d'axe de lacet est définie lorsqu'il est en gravité zéro (ou une 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 retard / de retard que le compas magnétique. Soit ça, ou attendre jusqu'à ce que le mouvement cesse assez longtemps pour que les deux valeurs à régler avant de recalculer le décalage.

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 ne sont pas « horizontale », la question 3 est répondu par hotpaw2 et aussi un lacet dans un hachoir ou un hélicoptère à près de zéro altitude alerterait le pilote avec une alarme. Il y a un décalage dans le temps, parce qu'une partie du logiciel est local alors qu'il existe d'autres facteurs qui peuvent ralentir vers le bas, y compris l'accès à un capteur destiné à détecter les ondes magnétiques, la position du dispositif et la direction, la préparation de la sortie graphique pour l'affichage du compas, de calcul et délivrant les données du gyroscope et des capteurs grâce à une interface relativement lente, en utilisant un appareil de poche à usage général ne sont pas conçus sur mesure pour le type de tâche étant lui sont posées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top