65 votes

Sous iOS, quelle est la différence entre les valeurs de champ magnétique des infrastructures Core Location et Core Motion?

J'ai deux façons d'obtenir les champs magnétiques (la force, x, y, et z) à l'aide de l'appareil iOS du magnétomètre.

1) L'Emplacement De Noyau
Utilisé le CLHeading de CLLocationManagerDelegate méthode locationManager:didUpdateHeading:. Ceci est similaire à Apple Teslameter exemple d'application.

2) Les Principales Motion
Utilisé CMMagneticField de CMMotionManagers' magnetometerData.magneticField.

Questions:
a) Quelle est la différence entre les deux? J'obtiens des valeurs différentes à la fois. Je m'attendais à ce qu'ils seront de retour les mêmes valeurs.
La différence est la plus notable lors du démarrage de l'application à partir d'une position de repos (face vers le haut dans un tableau), puis soulevez l'appareil dans l'air.
b) Si il y a une différence, quand dois-je utiliser le champ magnétique du Noyau de l'Emplacement de la rubrique, et quand dois-je utiliser le champ magnétique du Noyau de Mouvement?

Note: je ne suis pas sûr si le "champ magnétique" de l'Emplacement de Noyau et le Noyau de Mouvement se référer à différentes champ magnétique concepts.
Note: j'ai calculé la force comme la racine carrée de (x^2 + y^2 + z^2) pour les deux approches.

191voto

foundry Points 15423

Pour comprendre ce que j'ai passé un peu trop de temps à creuser par le biais de l'Apple docs.

Il y a trois façons d'obtenir des données du magnétomètre

1/ Core Motion cadre
CMMotionManagers de l' CMMagnetometer classe

2/ Core Motion cadre
CMDeviceMotion CMCalibratedMagneticField de la propriété

3 / l'Emplacement de Noyau cadre
CLLocationManager de l' CLHeading

1/ fournitures "brutes" des données du magnétomètre.
2/ et 3/ retour "dérivées" des données. Les nombres dans les deux cas sont similaires (mais pas exactement le même).

La différence entre le niveau de Base du Mouvement CMMagnetometer et CMCalibratedMagneticField

1/ et 2/ - à la fois à partir de la Base de Motion - cadre diffèrent comme suit:

CMDeviceMotion De Référence De Classe

@property(readonly, nonatomic) CMCalibratedMagneticField magneticField

Discussion
Le CMCalibratedMagneticField retourné par cette propriété vous donne le champ magnétique total dans l'appareil à proximité de sans dispositif de polarisation. Contrairement à la magneticField propriété de la CMMagnetometer classe, ces valeurs reflètent le champ magnétique terrestre, plus les champs environnants, moins le dispositif de polarisation.

CMMagnetometer nous donne des données brutes, CMCalibratedMagneticField est ajusté de données.

La différence entre le niveau de Base du Mouvement CMCalibratedMagneticField et l'Emplacement de Noyau de CLHeading

Les docs ne sont pas immédiatement clair sur la différence entre les 2/ et 3/, mais ils génèrent des numéros différents nous allons donc faire quelques recherches....

L'Emplacement de noyau cadre
CLHeading

À Partir De L'Emplacement De Sensibilisation Guide De Programmation

L'Obtention De La Rubrique Événements Liés À La

La rubrique événements sont disponibles pour les applications en cours d'exécution sur un appareil qui dispose d'un magnétomètre. Un magnétomètre mesures à proximité de champs magnétiques émanant de la Terre et l'utilise pour déterminer l'orientation précise de l'appareil. Bien qu'un magnétomètre peut être affectée par les champs magnétiques, tels que ceux émanant des aimants fixes trouvé dans l'audio haut-parleurs, moteurs, et de nombreux autres types d'appareils électroniques, Base de l'Emplacement est assez intelligent pour filtrer les champs qui se déplacent avec le périphérique.

Voici les CLHeading "brutes" propriétés

@property(readonly, nonatomic) CLHeadingComponentValue x
@property(readonly, nonatomic) CLHeadingComponentValue y
@property(readonly, nonatomic) CLHeadingComponentValue z

Le géomagnétique de données (mesurée en microteslas) pour le [x|y|z]-axe. (lecture seule)
Cette valeur correspond à la valeur [x|y|z]-déviation de l'axe de lignes de champ magnétique sont suivis par le dispositif. (les anciennes versions de la documentation ajouter:) La valeur indiquée par cette propriété est normalisée à la plage de -128 à +128.

Je ne suis pas clair comment un microtesla de mesure peut être "normalisés" (compressé? coupées?) pour une fourchette de +/-128 et continuent de représenter l'unité qu'il prétend mesurer. Peut-être que c'est pourquoi la phrase a été retiré de la documentation. Les unités sur un iPad mini ne semblent conformes à ce genre de gamme, mais les iPhone4S donne CMMagnetometer lectures dans les gammes supérieures, par exemple de 200 à 500.

L'API clairement attend de vous que vous utilisez les propriétés dérivées:

@property(readonly, nonatomic) CLLocationDirection magneticHeading
@property(readonly, nonatomic) CLLocationDirection trueHeading

qui donnent stable N/S E/W utilisation de la boussole, en degrés (0 = Nord, 180 = Sud, etc). Pour le cap vrai, les autres services de Localisation sont nécessaires (géolocalisation) pour obtenir la déviation magnétique à partir du nord vrai.

Voici un extrait de l' CLHeading fichier d'en-tête

/*
 *  CLHeading
 *  
 *  Discussion:
 *    Represents a vector pointing to magnetic North constructed from 
 *    axis component values x, y, and z. An accuracy of the heading 
 *    calculation is also provided along with timestamp information.
 *  
 *  x|y|z
 *  Discussion:
 *    Returns a raw value for the geomagnetism measured in the [x|y|z]-axis.

Core Motion cadre
CMDeviceMotion CMCalibratedMagneticField

/*
 *  magneticField
 *  
 *  Discussion:
 *          Returns the magnetic field vector with respect to the device for devices with a magnetometer.
 *          Note that this is the total magnetic field in the device's vicinity without device
 *          bias (Earth's magnetic field plus surrounding fields, without device bias),
 *          unlike CMMagnetometerData magneticField.
 */
@property(readonly, nonatomic) CMCalibratedMagneticField magneticField NS_AVAILABLE(NA,5_0);

CMMagnetometer

 *  magneticField
 *  
 *  Discussion:
 *    Returns the magnetic field measured by the magnetometer. Note
 *        that this is the total magnetic field observed by the device which
 *        is equal to the Earth's geomagnetic field plus bias introduced
 *        from the device itself and its surroundings.
 */
@property(readonly, nonatomic) CMMagneticField magneticField;  

CMMagneticField
C'est la structure qui contient le vecteur.
C'est la même chose pour CMDeviceMotions'calibré champ magnétique et d' CMMagnetometer's non calibré version:

/*  CMMagneticField - used in 
 *  CMDeviceMotion.magneticField.field
 *  CMMagnetometerData.magneticField
 *  
 *  Discussion:
 *    A structure containing 3-axis magnetometer data.
 *
 *  Fields:
 *    x:
 *      X-axis magnetic field in microteslas.
 *    y:
 *      Y-axis magnetic field in microteslas.
 *    z:
 *      Z-axis magnetic field in microteslas.

La différence entre les 2/ et 3/ sont suggérées ici:

L'Emplacement De Noyau CLHeading

Représente un vecteur pointant vers le Nord magnétique construit à partir de l'axe des valeurs des composantes x, y et z

L'Emplacement de noyau est assez intelligent pour filtrer les champs qui se déplacent avec le périphérique

Core Mouvement CMCalibratedMagneticField

[représente] champ magnétique de la Terre , plus les champs alentours, sans dispositif de polarisation

Donc - selon les documents que nous avons:

1/ CMMagnetometer
Premières mesures du magnétomètre

2/ _CMDeviceMotion (CMCalibratedMagneticField*) magneticField_
Magnétomètre lectures corrigées pour le dispositif de polarisation (à bord des champs magnétiques)

3/ CLHeading [x|y|z]
Magnétomètre lectures corrigées pour le dispositif de polarisation et filtrée pour éliminer les locaux des champs magnétiques externes (tel que détecté par le mouvement de l'appareil - si le champ se déplace avec l'appareil, de l'ignorer, sinon la mesurer)

Les tests de la théorie

enter image description here

J'ai mis un Magnet-O-Mètre de démonstration de l'application sur gitHub qui affiche certaines de ces différences. C'est assez révélateur de passer un aimant autour de votre appareil lorsque l'application est en cours d'exécution et de regarder la façon dont les différentes Api de réagir:

CMMagnetometer ne réagissent pas bien à quoi que ce soit, sauf si vous tirez un aimant de terre rare de près. Le bord des champs magnétiques semblent bien plus importants que ce que les champs externes ou champ magnétique de la terre. Sur mon iPhone 4S de manière cohérente les points vers le bas à gauche de l'appareil, sur l'iPad mini, il pointe généralement vers le haut à droite.

CLHeading.[x|y|z] est la plus vulnérable (responsive) pour locaux les champs externes, que ce soit en mouvement ou statique par rapport à l'appareil.

(CMDevice)CMCalibratedMagneticField est le plus stable dans le visage de divers champs externes, mais sinon, les pistes l'Emplacement de Noyau homologue CLHeading.[x|y|z] à peu de choses près.

CLHeading.magneticHeading - Apple recommandation du compas magnétique de lecture est beaucoup plus stable que l'un de ces. C'est à l'aide de données provenant d'autres capteurs pour stabiliser le magnétomètre de données. Mais vous n'obtenez pas un raw de répartition de x,y,z

             influenced by
             onboard fields    local external fields   earth's field
yellow               X                   X                 X
green                _                   X                 X
blue                 _                   _                 X
red                  _                   _                 X           

jaune CMMagnetometer
vert CLHeading.[x|y|z]
bleu CMCalibratedMagneticField
rouge CLHeading.magneticHeading

Cela ne semblent contredire les docs, qui suggèrent que CLHeading.[x|y|z] devrait être moins influencés par les locaux les champs externes que CMCalibratedMagneticField.

Quelle approche faut-il prendre? Basé sur mon test limité, je dirais...
Si vous voulez une lecture de la boussole
CLHeading de l' magneticHeading et trueHeading vous donnera le plus précis et le plus stable de la lecture de la boussole.
Si vous avez besoin pour éviter l'Emplacement de Noyau
CMDeviceMotion de l' CMCalibratedMagneticField semble être la plus souhaitable, bien que nettement moins stable et précise que l' magneticHeading.
Si vous êtes intéressé par champs magnétiques locaux
CLHeading du "brut" x y et z propriétés semblent être plus sensibles aux champs magnétiques locaux.
Si vous souhaitez que toutes les données, y compris à bord des champs magnétiques
Raw magnétomètre de données à partir de CMMagnetometer. Il n'y a vraiment pas beaucoup de point à l'aide de cela, sauf si vous êtes prêt à faire des tonnes de filtrage, car il est très influencé par des champs magnétiques générés sur l'appareil lui-même.

1voto

Pete Points 49

cette réponse est fondée sur mon interprétation de la documentation liens ci-dessous

http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLHeading_Class/Reference/Reference.html#//apple_ref/doc/c_ref/CLHeading

http://developer.apple.com/library/ios/#documentation/CoreMotion/Reference/CMMagnetometerData_Class/Reference/Reference.html#//apple_ref/doc/c_ref/CMMagnetometerData

a) CLHeading est "déviation de lignes de champ magnétique sont suivis par le dispositif" tout en magnetometerData.magneticField "est le champ magnétique total observé par l'appareil qui est égal à la Terre du champ géomagnétique en plus des biais introduits à partir de l'appareil lui-même et de ses environs".

Donc CLHeading vous donne les valeurs filtrées avec le Cadre de Référence étant l'existant champ magnétique de la terre. Alors que magnetometerData vous donne des valeurs non filtrées avec le Cadre de référence en cours de l'appareil.

b) si vous faites n'importe quoi avec emplacement où vous avez voulu savoir où est magnétique ou vrai nord, je vous recommande d'utiliser CLHeading. Si vous souhaitez créer une application qui répond à des champs magnétiques dans les dispositifs de proximité ou vous avez eu des capteurs spécifiques fusion vous voulez faire peut-être essayer de créer un AHRS par exemple, puis aller avec CMMagneticField.

1voto

millport Points 646

Une chose importante à retenir lors de l'utilisation de la CLHeading.[x|y|z] valeurs pour calculer le champ magnétique local de force, c'est que la méthode CLLocationManagerDelegate

  • (BOOL)locationManagerShouldDisplayHeadingcalibration:(CLLocationManager *)le gestionnaire de

devrait être fixé pour le retour OUI. J'ai trouvé que le magnétomètre lectures ne sont jamais calibré si cet avertissement d'étalonnage est éteint, et qu'en conséquence, l'intensité de champ calculé est très instable lorsque l'orientation de l'appareil est modifié.

0voto

BanksySan Points 2992

Je pense que le champ magnetometerData.magneticField vous indique l'accélération, pas la position (d'où la raison pour laquelle les valeurs importantes se déplacent d'alternative à constante) alors que le gestionnaire de localisation fournit des données sur l'orientation de l'appareil.

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