2011-10-27 60 views
6

我想要CoreMotion的新功能,首先設置參考框架的可能性,但如果我使用DeviceMotionHandler和參考框架設置爲CMAttitudeReferenceFrameXTrueNorthZVertical輸出是一些CMAttitudeReferenceFrameXArbitraryCorrectedZVertical。 我開始與iPhone的應用程序總是在相同的偏航旋轉尊重我的桌子,我測試不同的初始偏航旋轉,但結果總是相同的。CoreMotion iOS 5態度與參考框架不起作用

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

我發現我的問題的解決方案,但我不明白爲什麼以前的代碼不起作用。 我在motionHandler中只添加了一個CMAttitude變量* a。

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

我看到相同的行爲。傳遞給塊的運動參數的態度似乎是「正常」的態度,而deviceMotion屬性中的態度似乎用參考幀來補償。我想知道這是一個錯誤,還是我可以依賴這種行爲,因爲它非常有用。將這兩者結合起來,可以用穩定的陀螺儀衍生方向來補償iPhone的古怪磁性行爲。 – fishinear

+0

我已經向Apple報告了這個錯誤:https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/59/wo/1sukWbI5nvOZQ2Y6MPBXnw/14.66 – fishinear

回答

0

我想這是因爲..如果你先定義處理程序,你的運動對象的態度財產已經被設置爲默認值。稍後在您自己的代碼中,此態度屬性將變爲只讀。所以,當你用這個處理程序開始運動更新時,運動的姿態屬性不再可以改變。但motionManager.deviceMotion的姿態屬性設置爲您在startDeviceMotionUpdatesUsingReferenceFrame中指定的任何屬性,並且當您使用startDeviceMotionUpdatesUsingReferenceFrame啓動動作更新時,會將此屬性讀入對象。一個對象現在擁有正確的態度,而運動對象具有默認的態度。

+0

我嘗試在方法startDeviceMotionUpdatesUsingReferenceFrame中定義motionHandler,但結果總是一樣的。 [MotionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * motion,NSError * error){CMAttitude * test = motion.testAttitude;我們可以使用下面的例子來說明如何使用標準字符串來測試字符串的大小,如下所示:labelAncle4.text = [NSString stringWithFormat:@「%f%f%f」,radiansToDegree(test.pitch),radiansToDegree(test.roll),radiansToDegree(test.yaw)]; }]; ' – Batti

+0

很明顯,我以前的答案是不正確的。很明顯,這兩個CMDeviceMotion實例是不一樣的。該參考框架顯然屬於CMDeviceMotionMananger.deviceMotion對象,而不屬於處理程序中指定的CMDeviceMotion對象。這可能是一個錯誤? – janBP

+0

CMDeviceMotion對象沒有任何attitudeReferenceFrame本身。 attitudeReferenceFrame是CMMotionManager對象的屬性。我真的認爲指向CMDeviceMotion對象的處理程序指針是指向CMMotionManagers屬性deviceMotion的指針。這顯然不是,而是在任何參考框架之前指向數據的指針。 – janBP