2012-07-08 5 views
8

Quiero obtener la desviación del dispositivo del Norte magnético en grados, y usar ese valor en algún código que estoy escribiendo.¿Qué clase/código de iOS devuelve el Norte magnético?

No quiero utilizar los servicios de localización del dispositivo y, por lo tanto, no estoy interesado en obtener el norte verdadero sino el norte magnético (utilizando solo el magnetómetro del dispositivo).

¿Qué clase (o proceso de codificación) podría proporcionarme ese valor (basándose únicamente en el magnetómetro)?

la clase CLLocationManager y sus propiedades dependen de los servicios de localización están activados/disponible

donde como el marco básico de movimiento con su clase CMMagnetometerData nos proporciona la siguiente propiedad:

@property(readonly, nonatomic) CMMagneticField magneticField 

A structure containing 3-axis magnetometer data 

typedef struct { 
    double x; 
    double y; 
    double z; 
} CMMagneticField; 

¿Cómo llego grados de eso? o hay alguna otra forma (clase/propiedad/método) para obtener grados del magnetómetro únicamente?

¡Gracias de antemano a cualquier persona que tenga información útil al respecto! :)

Respuesta

12

El iOS documentation indica que los datos de CMMagneticField son crudos, lo que significa que incluyen los sesgos introducidos desde el dispositivo mismo y su entorno. CMDeviceMotion proporciona los mismos valores de campo magnético filtrados.

Para determinar el norte magnético, debe usar los valores filtrados y el dispositivo debe estar nivelado con la superficie de la Tierra.

Conociendo los valores de x e y del campo magnético del ángulo (declinación de norte magnético en grados) se puede calcular con la siguiente formula:

if (y>0): heading = 90.0 - [arcTan(x/y)]*180/π 
if (y<0): heading = 270.0 - [arcTAN(x/y)]*180/π 
if (y=0, x<0): heading = 180.0 
if (y=0, x>0): heading = 0.0 

En Obj-C, suponiendo que tiene un objeto CMMagnetometerDatamagnetometerData llamada, que sería algo como:

double heading = 0.0; 
double x = magnetometerData.magneticField.x; 
double y = magnetometerData.magneticField.y; 
double z = magnetometerData.magneticField.z; 

if (y > 0) heading = 90.0 - atan(x/y)*180.0/M_PI; 
if (y < 0) heading = 270.0 - atan(x/y)*180.0/M_PI; 
if (y == 0 && x < 0) heading = 180.0; 
if (y == 0 && x > 0) heading = 0.0; 
+0

¿Qué sucede si quiero obtener el Norte magnético independientemente de cómo sostengo el dispositivo? p.ej. la brújula digital en el iPhone 4S devuelve el Norte magnético (servicios de ubicación desactivados) independientemente de cómo sostengo el dispositivo. ¿Cómo puedo lograr eso? –

+0

la fórmula que sugirió no es válida Objective-C –

+0

La convertí en código Objective-C válido pero obtengo 0 grados todo el tiempo .. –

-2

Usted necesidad de fusionar sensores para imitar las aplicaciones de apple. Usan el acelerómetro y el magnetómetro giroscópico, y matemáticas avanzadas que puede o no haber aprendido para producir resultados tan limpios. Buena suerte. Probablemente no puedas imitarlos.

+1

¿Has leído la pregunta? Por favor revise cuidadosamente lo que el autor estaba pidiendo. – Trinimon

Cuestiones relacionadas