2015-02-06 88 views
4

我想通過使用CoreMotion從我的iphone 6中獲取磁場數據。如何使用swift獲取磁力計數據?

我沒有問題用下面的代碼訪問原始數據:

if available { 
     motionMangager.magnetometerUpdateInterval = updateInterval 
     motionMangager.startMagnetometerUpdatesToQueue(queue, withHandler: { 
      (data, error: NSError!) -> Void in 
      println("x: \(data.magneticField.x), y: \(data.magneticField.y), z: \(data.magneticField.z)") 
     }) 
    } 

BUT:我通過使用設備運動實例需要導出的數據。

所以我做了以下內容:

if motionMangager.deviceMotionAvailable { 
     motionMangager.magnetometerUpdateInterval = updateInterval 
     motionMangager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrameXArbitraryZVertical, toQueue: queue, withHandler: { 
      (deviceMotion: CMDeviceMotion!, error: NSError!) -> Void in 
      // If no device-motion data is available, the value of this property is nil. 
      if let motion = deviceMotion { 
       println(motion) 
       var accuracy = motion.magneticField.accuracy 
       var x = motion.magneticField.field.x 
       var y = motion.magneticField.field.y 
       var z = motion.magneticField.field.z 
       println("accuracy: \(accuracy.value), x: \(x), y: \(y), z: \(z)") 
      } 
      else { 
       println("Device motion is nil.") 
      } 
     }) 
    } 

這裏的問題是:

我總是爲現場獲得零座標x,y和z。準確度也是-1。根據Apple文檔,-1的準確性意味着「CMMagneticFieldCalibrationAccuracyUncalibrated」意味着「該設備沒有磁力計」......但是不是!這是一個iPhone 6 ...

所以我做錯了什麼?我嘗試了所有四個CMAttitudeReferenceFrame。請我需要幫助。有任何想法嗎?

+0

設備運動(CMAttitudeReferenceFrameXMagneticNorthZVertical):您是否使用 QuaternionX 0.007901 QuaternionY 0.004146 QuaternionZ 0.000132 QuaternionW 0.999960 UserAccelX 0.000576 UserAccelY -0.000035 UserAccelZ -0.001655 RotationRateX 0.000056 RotationRateY 0.009508 RotationRateZ 0.000458 0.000000 MagneticFieldX 0.000000 MagneticFieldY 0.000000 MagneticFieldZ -1 MagneticFieldAccuracy @ 203585.926003 – iSteffi 2015-02-06 11:52:01

+0

模擬器還是實際設備? – Bill 2015-02-06 12:32:56

+0

設備:iphone 6 – iSteffi 2015-02-06 13:14:31

回答

2

好的..我解決了它。

0的原因是未校準的磁力計!但這並不意味着蘋果文檔中沒有像磁力計那樣的磁力計。無論如何,我從來沒有料到過。

我只需要添加指南針校準功能。這是相當容易的添加:

motionMangager.showsDeviceMovementDisplay = true 

(參見:https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/

所以現在是這樣的:當我得到的零和-1的準確性比警告,要求進行校準彈出。移動後,它消失,我得到適當的價值。在控制檯

+0

我想補充一點,爲了這個工作,參考框架應該是除了'XArbitraryZVertical'之外的任何東西,它只是不適用於這個選項。來源:http://stackoverflow.com/questions/30840844/cmdevicemotion-returns-0-values-for-magnetic-field – lzt 2016-02-22 02:26:11

相關問題