如何初始化CMCalibratedMagneticField属性以使其不返回零?

时间:2013-07-14 21:02:18

标签: ios6 calibration magnetometer

之前已经问过这个问题 CMCalibratedMagneticField doesn't update 但它没有得到真正的回答。我很失落这个。

我使用的是简单的公式,但field.field.x,y,z始终为零。

if (motionManager.deviceMotionAvailable)
{
    [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]  
                                       withHandler:
       ^(CMDeviceMotion *motionData, NSError *error) {
           CMCalibratedMagneticField field = motionData.magneticField;
           NSLog(@"x: %f  y:%f  z:%f", field.field.x
                                     , field.field.y
                                     , field.field.z);

    }];       
}

示例输出

2013-07-14 22:18:27.865 TestApp[6678:907] x: 0.000000  y:0.000000  z:0.000000

2013-07-14 22:18:27.869 TestApp[6678:907] x: 0.000000  y:0.000000  z:0.000000

2013-07-14 22:18:27.879 TestApp[6678:907] x: 0.000000  y:0.000000  z:0.000000

我很确定问题不是前面的答案所说的电话:我正在编写一个相当现代的4S。我有CoreMotion,CoreLocation和CoreData框架 - 可能有一个我不知道的头文件,我需要在实现中导入?目前我似乎只需要

#import <tgmath.h>

但那是其他的东西。

任何帮助将不胜感激!

蒂姆雷德菲尔德

1 个答案:

答案 0 :(得分:2)

请改为尝试:

- (void)startDeviceMotionUpdatesUsingReferenceFrame:(CMAttitudeReferenceFrame)referenceFrame 
                                            toQueue:(NSOperationQueue *)queue 
                                        withHandler:(CMDeviceMotionHandler)handler

以下任何一项:

     CMAttitudeReferenceFrameXArbitraryCorrectedZVertical  
     CMAttitudeReferenceFrameXMagneticNorthZVertical  
     CMAttitudeReferenceFrameXTrueNorthZVertical  

但不是:

     CMAttitudeReferenceFrameXArbitraryZVertical

(你错过的另一个问题:CoreMotion - magneticField is always 0

如果你想了解磁力计数据的太多信息,请参阅我对这个问题的回答:In iOS, what is the difference between the Magnetic Field values from the Core Location and Core Motion frameworks?