Étalonnage dynamique du magnétomètre

19

Je travaille sur un magnétomètre AK8975 faisant partie d'une IMU. Ce qui me semble très délicat. Cette puce donne un vecteur 3D en sortie décrivant le champ magnétique terrestre à n'importe quel endroit sur la terre ou à proximité.

J'ai essayé deux types d'algorithmes de calcul de cap: l'un est simple arctan(-y/x)et l'autre est le calcul annulé par inclinaison (tangage) et inclinaison (roulis) comme mentionné ci-dessous. Tant l'inclinaison que les inclinaisons donnent une sortie incorrecte.

Je suis capable d'obtenir le cap correct par rapport à la terre (en utilisant les ressources d'étude disponibles simples disponibles) quand il est tourné en gardant horizontal par rapport au plan au sol en utilisant l'un des deux algos.

J'ai essayé l'étalonnage pour les erreurs de fer doux et dur. Je pourrais le tracer en 3D et montre une sphère 3D parfaite. Ne fonctionne toujours pas sur l'inclinaison ou la déclinaison.

Tout pointeur sera utile.

Le code et ses implémentations sont les suivants:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

magnetom_x, #_yet #_zsont des composantes d'un vecteur 3D qui sont en fait des valeurs brutes du magnétomètre. le roulis et le tangage proviennent d'un mystérieux filtre Kalman émis par l'accéléromètre et le gyroscope embarqués. Ces trois capteurs sont en ATAVRSBIN1 . Le roulis et le tangage sont corrects jusqu'à cette étape.

Maintenant, un simple calcul de cap selon journal_of_sensors_renaudin et al_2010c.pdf aurait dû être MAG_Heading = atan2(-magnetom_y, magnetom_x) ;et avec compensation comme ci-dessus.

Le code global provient simplement de OPEN AHRS .


Données au format Roll, Pitch et Yaw. J'ai tourné l'appareil uniquement avec ma main. Les trois premiers se sont concentrés respectivement sur Roll, Pitch et Yaw. Les deux autres ont d'abord fait pivoter l'appareil d'environ 45 degrés le long de X (roulé) puis tourné le long du Z local du magnétomètre.

Les graphiques tracés dans la plage de -180 à 180 degrés.

Rouleau Angles en degrés dans un fichier Les caractéristiques YAW sur Roll.

Pas Angles en degrés dans un fichier Les caractéristiques YAW sur Pitch.

Embardée Angles en degrés dans un fichier Les caractéristiques YAW sur le lacet lui-même.

Lacet à 45 degrés incliné (roulé) Angles en degrés dans un fichier Les caractéristiques YAW sur Yaw avec 45 degrés roulés.

Lacet à 45 degrés incliné (incliné) Angles en degrés dans un fichier Les caractéristiques YAW sur Yaw avec 45 degrés inclinés.

Remarque: Pour les 2 dernières photos: Tout d'abord maintenu en position d'origine, c'est la même chose pour tous (reportez-vous aux fichiers txt). Puis roulé à 45 degrés puis en utilisant l'appareil plan (avec magnétomètre) a été tourné le long de l'axe Z du magnétomètre.

De même pour la dernière image, l'appareil a été incliné à 45 degrés puis le long de l'axe Z du magnétomètre.

J'espère que cela aidera à résoudre mon problème.


Les nouveaux développements sont les suivants:

J'en ai travaillé sur la rubrique. J'ai obtenu la sortie suivante. Rouleau csv

Pas csv

Embardée csv


Rick2047
la source
pas encore de réponse !!
4
Je pense que vous obtiendrez plus de réponses si vous montrez les mathématiques que vous essayez d'implémenter et le code que vous avez utilisé pour l'implémenter. Il nous reste très peu de choses à faire autrement que "ça ne marche pas, aide" - c'est ainsi que se lit votre question. Pardon!
Martin Thompson
L'utilisation du magnétomètre est un domaine très spécialisé avec lequel relativement peu de gens auront une expertise. En lisant votre question plusieurs fois, je ne sais toujours pas exactement ce qui ne va pas. Vous dites que cela donne la "mauvaise sortie" mais c'est assez vague. Peut-être quelques exemples numériques?
Jason R
1
Est-ce une question sur la façon d'interpréter les sorties du capteur ou de calculer des mesures utiles à la navigation à partir du vecteur x, y, z fourni par le capteur? Vos mesures sont-elles reproductibles avec une autre instance du même capteur?
vicatcu
1
@Rahul - Je suis surpris que cela n'attire pas plus l'attention!
Kevin Vermeer

Réponses:

8

J'aime bien tes graphiques. Ils montrent clairement que le roulis, le tangage et le lacet semblent fonctionner. Toutes nos félicitations! C'est déjà plus de progrès que la plupart des gens.

Je suppose que le code que vous avez présenté calcule "la mauvaise" valeur MAG_Heading, différente de la valeur MAG_Heading que vous attendiez.

Il nous serait beaucoup plus facile de vous aider si vous nous donniez: (Ceci est la section "décrivez les symptômes" de "Comment poser des questions de manière intelligente" )

  • les valeurs de sortie du magnétomètre AK8975 m_x, m_y et m_z à un moment donné.
  • Les valeurs de tangage et de roulis au même instant
  • la valeur de sortie MAG_Heading prétendument erronée calculée à partir de ces valeurs
  • ce que vous attendiez de la MAG_Heading correcte

Donc je suis parti pour spéculer que peut-être vous rencontrez les mêmes types de problèmes que je me crée :-).

  • À quel format d'angle vos fonctions sin () et cos () et atan2 () s'attendent-elles? Avez-vous besoin de faire une sorte de conversion entre le format et le roulis stockés dans ce format? Devez-vous convertir ce format en ce dont vous avez besoin MAG_heading? (brads, degrés ou radians? virgule flottante ou virgule fixe?)
  • Y a-t-il un décalage dans les valeurs brutes m_x, m_y, m_z qui doit être soustrait?
  • Toutes les parties sont-elles alignées de la manière assumée par le code? En particulier, l'axe de tangage et de roulis est-il aligné avec l'axe du magnétomètre? (Est-ce que m_x est censé pointer vers l'avant, le long de l'axe de roulis? Est-ce que m_y doit pointer vers la droite, le long de l'axe de tangage?)
  • Peut-être qu'une valeur de capteur ou une autre - peut-être m_z - doit être annulée avant d'être introduite dans ce code?
  • Peut-être que ce code est interrompu par une interruption ou une autre qui corrompt ses valeurs internes? Il me semble que je me souviens d'un projet différent qui, après que quelqu'un ait mis une "division" dans une routine d'interruption, chaque calcul de fonction trig, partout ailleurs dans le programme, donnait souvent le mauvais résultat.
  • Peut-être les interruptions se déclenchent-elles si souvent que ce code ne termine jamais son exécution?

Il semble que d'autres personnes discutent d'un code très similaire ailleurs: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; etc.

davidcary
la source
Je l'ai vu maintenant .. je vais revenir.
Rick2047
\ 1 / Je crée un fichier csv pour [Roll, pitch, yaw and (Mx, My, Mz)]. \ 2 / Je m'attends à ce que le MAG_Heading ne change pas avec le changement de roulis et de tangage au moins jusqu'à deux quadrants successifs. Le cap signifie que s'il se dirige vers le NE, il doit continuer à pointer vers le NE jusqu'à ce qu'il traverse les 90 degrés de l'horizon dans les directions de rotation vers le haut ou vers le bas pour l'inclinaison et devrait être le même en cas d'inclinaison ou de combinaison.
Rick2047
\ 3 / Tous les calculs internes ont été effectués en radians et toutes les fonctions de consine n'attendent que des radians. Pour l'affichage, seules les valeurs sont copiées et converties en degrés. \ 4 / Virgule flottante. \ 5 / Tous les capteurs sont alignés et toutes les combinaisons pertinentes possibles ont été essayées pour l'alignement à l'aide de SENSOR_SIGN [9]. \ 6 / Je le fais dans l'interrogation, donc les interruptions basées sur tous les problèmes ne seront pas ici.
Rick2047
Pour mon point \ 1 / ici pour tous les graphiques, j'ai également joint les fichiers csv correspondants. Ou vous avez demandé autre chose. Merci pour cette bonne réponse. :) J'implémenterai "Comment poser des questions de manière intelligente" autant que mes efforts et mon temps le permettront. :)
Rick2047
\ 1 / Je travaillerai plutôt pour [Roulis, tangage, lacet et (Mx, My, Mz) (cap, déclinaison)].
Rick2047
1

La note d'application du LSM303 contient un guide utile pour calibrer une boussole à inclinaison compensée qui s'applique à votre problème. C'est assez détaillé, sinon j'aurais réécrit les calculs ici. Notez que les valeurs de l'accéléromètre sont nécessaires pour les calculs de tangage complet, de roulis et de lacet car une rotation autour de l'axe des lignes de champ magnétique n'entraîne aucun changement dans les valeurs du magnétomètre. De même pour la gravité avec l'accéléromètre.

geometrikal
la source
Le lien montre un signe différent dans la même équation. Je vais essayer toutes les autres combinaisons.
Rick2047