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 CMDeviceMotion
s'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
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.