如何使用Swift获取磁力计数据?

4

我正在尝试使用CoreMotion从我的iPhone 6获取磁场数据。

使用以下代码,我可以轻松访问原始数据:

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)")
        })
    }
但是:我需要通过使用设备运动实例获取派生数据。

因此,我采取了以下步骤:

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。根据苹果文档,精度为-1意味着“CMMagneticFieldCalibrationAccuracyUncalibrated”,意味着“设备没有磁力计”...但不是!这是一部iPhone 6...

那么我做错了什么?我尝试了所有四个CMAttitudeReferenceFrame。请帮帮我。有什么想法吗?


设备运动在控制台中的表现(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 MagneticFieldX 0.000000 MagneticFieldY 0.000000 MagneticFieldZ 0.000000 MagneticFieldAccuracy -1 @ 203585.926003 - iSteffi
你是在使用模拟器还是实际设备? - Bill
更新:显然,当使用“CMAttitudeReferenceFrameXTrueNorthZVertical”时,我得到的数据与零不同。但是每次尝试都不稳定,更加随机。我意识到,在两种情况下,在第一次更新轮中,数据为0(准确度也为-1)。我知道这是因为磁力计本身需要一些时间来产生第一次更新的数据。所以,在我只得到零的尝试中,是不是磁力计只是分散注意力或者还没有准备好? - iSteffi
1个回答

2

好的.. 我解决了。

零值的原因是未校准的磁力计!但这并不意味着苹果文档中所述的没有磁力计。无论如何,我从未预料到这一点。

我只需要添加指南针校准功能。这很容易实现:

motionMangager.showsDeviceMovementDisplay = true

(参见:https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/

现在的情况是:当我获取精度为0或-1时,会弹出要求校准的警报。移动后,它就会消失,然后我可以得到正确的值。


我想补充一下,为了使其工作,参考框架应该是除了“XArbitraryZVertical”以外的其他任何选项,因为这个选项不能与其一起使用。来源:https://dev59.com/E4vda4cB1Zd3GeqPgfq6 - fy_iceworld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接