2011-10-27 26 views
6

estoy probando las nuevas características de CoreMotion, sobre todo la posibilidad de establecer el marco de referencia, pero si uso un DeviceMotionHandler y el marco de referencia establecido en CMAttitudeReferenceFrameXTrueNorthZVertical la salida es algunos de CMAttitudeReferenceFrameXArbitraryCorrectedZVertical. inicio la aplicación con el iphone siempre en la misma rotación de orientación respecto a mi escritorio, y pruebo diferentes rotaciones iniciales de guiñada, pero el resultado es siempre el mismo.CoreMotion iOS 5 actitud con marco de referencia no funciona

motionManager = [[CMMotionManager alloc] init]; 
motionManager.showsDeviceMovementDisplay = YES; 
motionManager.deviceMotionUpdateInterval = 1.0/60.0;  

CMDeviceMotionHandler motionHandler =^(CMDeviceMotion *motion, NSError *error) { 
    NSLog(@"%f  %f   %f", motion.attitude.pitch, motion.attitude.roll, motion.attitude.yaw); 
}; 

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:motionHandler]; 

encontré la solución a mi problema, pero no puedo entender por qué el código anterior no funciona. Agrego solo una variable CMAttitude * a en motionHandler.

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
motionManager = [[CMMotionManager alloc] init]; 
motionManager.showsDeviceMovementDisplay = YES; 
motionManager.deviceMotionUpdateInterval = 1.0/60.0;  

CMDeviceMotionHandler motionHandler =^(CMDeviceMotion *motion, NSError *error) { 
    CMAttitude *a = motionManager.deviceMotion.attitude; 
    labelAngle.text = [NSString stringWithFormat:@"%f  %f   %f",a.pitch, a.roll,a.yaw]; 
    labelAngle2.text = [NSString stringWithFormat:@"%f  %f  %f", motion.attitude.pitch, motion.attitude.roll, motion.attitude.yaw]; 
}; 

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];} 
+0

Veo el mismo comportamiento. La actitud en el parámetro de movimiento que se pasa al bloque parece ser la actitud "normal", mientras que la actitud en la propiedad deviceMotion parece compensarse con el marco de referencia. Me pregunto si esto es un error, o si puedo confiar en este comportamiento, ya que es bastante útil. La combinación de los dos hace posible compensar el peculiar comportamiento magnético del iPhone con una dirección derivada del giros estable. – fishinear

+0

He informado esto como un error hacia Apple: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/59/wo/1sukWbI5nvOZQ2Y6MPBXnw/14.66 – fishinear

Respuesta

0

creo que esto se debe a que .. si se define el controlador en primer lugar, la propiedad actitud de su movimiento objeto ya se ha establecido en el valor predeterminado. Más tarde en su propio código, esta propiedad de actitud se convierte en solo lectura. Por lo tanto, cuando inicie las actualizaciones de movimiento con este manejador, la propiedad actitud del movimiento ya no se puede cambiar. Pero la propiedad de actitud de motionManager.deviceMotion se establece en lo que especifique en startDeviceMotionUpdatesUsingReferenceFrame y se lee en el objeto a cuando inicia las actualizaciones de movimiento con startDeviceMotionUpdatesUsingReferenceFrame. El objeto a tiene ahora la actitud correcta, mientras que el objeto de movimiento tiene la actitud predeterminada.

+0

intento definir el gestor de movimiento dentro del método startDeviceMotionUpdatesUsingReferenceFrame, pero el resultado es siempre el mismo. '[motionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXTrueNorthZVertical toQueue: [NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * motion, NSError * error) { CMAttitude * test = motion.testAttitude; labelAncle4.text = [NSString stringWithFormat: @ "% f% f% f", radianesToDegree (test.pitch), radianesToDegree (test.roll), radianesToDegree (test.yaw)]; }]; ' – Batti

+0

Es obvio que mi respuesta anterior no es correcta. También es obvio que estas dos instancias de CMDeviceMotion no son lo mismo. El marco de referencia obviamente pertenece al objeto CMDeviceMotionMananger.deviceMotion y no al objeto CMDeviceMotion especificado en el controlador. ¿Es esto tal vez un error? – janBP

+0

Un objeto CMDeviceMotion no tiene ningún attitudeReferenceFrame. Un attitudeReferenceFrame es una propiedad de un objeto CMMotionManager. Realmente pensé que el puntero de los manejadores del objeto CMDeviceMotion era un puntero a la propiedad CMMotionManagers deviceMotion. Obviamente no es, sino más bien un puntero a los datos antes de cualquier marco de referencia. – janBP