как получить правильное значение x, y и z магнитного поля вокруг устройства iOS?

Я пытаюсь получить значение магнитного поля вокруг моего устройства iOS (iPad 2). Я долго гуглил об этих темах, но не мог найти ничего, что работало бы должным образом.

я пытаюсь сделать что-то вроде этого.

я прочитал документацию Apple о магнитном поле, как я могу получить значение, есть две структуры, которые могут помочь мне движение ядра и местоположение ядра, но в моем случае я буду использовать движение ядра, чтобы получить откалиброванное магнитное поле вокруг моего устройства с помощью CMDeviceMotion и этого свойства CMCalibratedMagneticField

CMCalibratedMagneticField, возвращаемый этим свойством, дает вам полное магнитное поле поблизости от устройства без смещения устройства.

этот код написан в SWIFT

        let manager = CMMotionManager()
        var valX: Double!
        var valY: Double!
        var valZ: Double!
        var valAccuracy: Int32!
        if manager.deviceMotionAvailable{
            manager.deviceMotionUpdateInterval = .1
            manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
                (data: CMDeviceMotion!, error: NSError!) in

                if let isError = error{
                    NSLog("Error: %@", isError)
                }
                valX = data.magneticField.field.x
                valY = data.magneticField.field.y
                valZ = data.magneticField.field.z
                valAccuracy = data.magneticField.accuracy.value


                if values != nil{
                    values!(x: valX, y: valY, z: valZ, accuracy: valAccuracy)
                }

                self.delegate?.getMagneticFieldFromDeviceMotion!(valX, y: valY, z: valZ)
            }

        } else {
            NSLog("Device Motion is not available")
        }

Когда я пытаюсь запустить свое приложение в (IPad 2), оно возвращает значения x, y, z, но они меняются сумасшедшим образом и очень быстро! Если я перемещаю магнит по оси x, также меняется и y!! Я использую неодимовый магнит, я был очень осторожен, когда использую его, чтобы он не навредил моему устройству.

Вопросы:

  1. почему, когда я пытаюсь переместить магнит, x и y меняются, даже если я меняю только x?
  2. я должен сделать калибровку, прежде чем я начну иметь точное значение?
  3. я должен поместить свое устройство в определенную ситуацию, чтобы получить правильное значение?
  4. есть ли какой-либо алгоритм, который я должен использовать для фильтрации x, y и z?

person Suzan Alamassy    schedule 03.04.2015    source источник
comment
Для того, что вы делаете, я думаю, вам понадобится CMMagnetometerData, а не откалиброванная версия. Обязательно посмотрите на этот очень хорошо изученный ответ: stackoverflow.com/a/15470571/59541   -  person Nate Cook    schedule 05.04.2015
comment
спасибо за ответ, я буду использовать значение x, y и z магнитного поля вокруг моего устройства, чтобы ввести его в мое приложение для рисования, я прочитал эту тему, это очень полезно, особенно когда он говорит о ( CMCalibratedMagneticField ), который я использую, чтобы получить магнитное поле вокруг устройство без смещения устройства, но я не получил ответа на свой вопрос, я запускаю его приложение в github, но та же проблема, о которой я упоминал выше (x и y меняются, даже если я меняю только x?), хотя я положил устройство на плоскую поверхность !! @NateCook   -  person Suzan Alamassy    schedule 05.04.2015