2011-10-27 12 views
6

CoreMotion'un yeni özelliklerini deniyorum, her şeyden önce referans çerçevesini ayarlama imkanı, ancak bir DeviceMotionHandler ve CMAttitudeReferenceFrameXTrueNorthZVertical için ayarlanmış referans çerçevesi kullanırsam çıktı CMAttitudeReferenceFrameXArbitraryCorrectedZVertical'in bazıları. Ben uygulamayı her zaman aynı yaw rotasyonda benim masamıza saygı ile başlatmak ve farklı başlangıç ​​yaw rotasyon test, ama sonuç her zaman aynıdır.CoreMotion Referans çerçevesiyle iOS 5 davranışı çalışmıyor

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]; 

Sorunumun çözümünü buldum, ancak önceki kodun neden çalışmadığını anlayamıyorum. HareketHandler'da sadece bir CMAttitude değişkeni * a ekliyorum. İlk işleyicisi tanımlarsanız

- (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

Aynı davranışı görüyorum. Bloğa iletilen hareket parametresindeki tutum, "normal" tutum gibi görünüyor, deviceMotion özelliğindeki tutum ise referans karesiyle dengeleniyor gibi görünüyor. Bu bir hata mı, yoksa bu davranışa güvenip inanamayacağımı merak ediyorum. İkiyi birleştirmek, iPhone'un ilginç manyetik davranışını kararlı bir jiro türevi yönlendirme ile telafi etmeyi mümkün kılar. – fishinear

+0

Bunu Apple'a karşı bir hata olarak bildirdim: https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/59/wo/1sukWbI5nvOZQ2Y6MPBXnw/14.66 – fishinear

cevap

0

Ben Hareket nesnenin tutum özelliği zaten varsayılan değer olarak ayarlandı .. çünkü bu olduğunu düşünüyorum. Daha sonra kendi kodunuzda bu tutum özelliği sadece okunur. Bu nedenle, hareket güncellemelerini bu işleyici ile başlattığınızda, hareketin tutum özelliği artık değiştirilemez. Ancak, motionManager.deviceMotion öğesinin tutum özelliği, startDeviceMotionUpdatesUsingReferenceFrame öğesinde belirttiğiniz her şeye ayarlanır ve bu, hareket güncellemelerini startDeviceMotionUpdatesUsingReferenceFrame ile başlattığınızda bir nesneye okunur. Hareket nesnesi varsayılan tutuma sahipken, şimdi bir nesne doğru tutuma sahiptir.

+0

motionHandler'ı startDeviceMotionUpdatesUsingReferenceFrame yönteminin içinde tanımlamaya çalışıyorum, ama sonuç her zaman aynı. '[motionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXTrueNorthZVertical toQueue: [NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * hareket, NSError * hatası) { CMAttitude * test = motion.testAttitude; labelAncle4.text = [NSString stringWithFormat: @ "% f% f% f", radiansToDegree (test.pitch), radiansToDegree (test.roll), radiansToDegree (test.yaw)]; }]; ' – Batti

+0

Eski cevabımın doğru olmadığı aşikar. Bu iki CMDeviceMotion örneğinin aynı olmadığı da açıktır. Referans çerçevesi açıkça CMDeviceMotionMananger.deviceMotion nesnesine aittir ve işleyicide belirtilen CMDeviceMotion nesnesine ait değildir. Bu bir hata mı? – janBP

+0

Bir CMDeviceMotion nesnesinin kendisi herhangi bir AttitudeReferenceFrame değerine sahip değil. AttitudeReferenceFrame, CMMotionManager nesnesinin bir özelliğidir. CMDeviceMotion nesnesine işleyicilerin işaretçisinin CMMotionManagers özellik deviceMotion öğesinin bir işaretçisi olduğunu düşündüm. Açıkçası, herhangi bir referans çerçevesinden önce veriler değil, bir göstericidir. – janBP