0

私は、デバイスの磁力計だけに依存することによって、磁北からのデバイスの赤緯を度単位で取得しようとしています。これは私が書いたコードですが、0度になります。何が間違っているのでしょうか。

CMMotionManager *motionManager;

motionManager = [[CMMotionManager alloc] init];

[motionManager startDeviceMotionUpdates];

CMDeviceMotion *deviceMotion;

deviceMotion = [[CMDeviceMotion alloc] init];

while(!self.stopButtonPressed)
{
    double x = motionManager.deviceMotion.magneticField.field.x;

    double y = motionManager.deviceMotion.magneticField.field.y;

    double degrees = asin(y/sqrt(pow(x, 2.0) + pow(y, 2.0))) * 180.0 / M_PI ;

    int degreesRounded = (int)degrees;

    NSLog(@"Degrees : %i", degreesRounded);
}
4

3 に答える 3

0

シミュレータはこれらのメソッドの通常の値を返さない可能性が高いため、実際のデバイスでテストする必要があります。

CLLocationManagerメソッドdidUpdateHeading:はシミュレータでは機能しないため、おそらくここで同様のことが発生しています。

編集:

ドキュメントから:

「デバイスモーションデータの最新サンプル。(読み取り専用)

@property(readonly)CMDeviceMotion * deviceMotion

考察デバイスモーションデータが利用できない場合、このプロパティの値はnilです。startDeviceMotionUpdatesを呼び出した後にデバイスモーションデータを受信して​​いるアプリケーションは、このプロパティの値を定期的にチェックし、デバイスモーションデータを処理します。」

モーションマネージャのそのプロパティがnilであるかどうかを確認してください。そうである場合、磁場特性は0になります。

編集2:

を使用する代わりに、を使用startDeviceMotionUpdatesする必要がありますstartMagnetometerUpdatesToQueue:。ドキュメントはこれを言います:

「磁力計。magnetometerUpdateIntervalプロパティを設定して更新間隔を指定します。startMagnetometerUpdatesToQueue:withHandler:メソッドを呼び出し、CMMagnetometerHandlerタイプのブロックを渡します。磁場データはCMMagnetometerDataオブジェクトとしてブロックに渡されます。」

ドキュメントはこちらです。

于 2012-07-29T18:05:27.357 に答える
0

上記のコードはどのスレッドで実行されていますか?メインスレッドで実行している場合は、時間の経過とともにデバイスのモーションデータの更新が表示されない可能性があります。NSTimerまたは同様のメカニズムを使用して、時間の経過とともにモーションをサンプリングします。これにより、メインスレッドは他のこと(コアモーションサブシステムからのサービスリクエストなど)を自由に実行できます。

于 2012-07-29T18:11:52.397 に答える
0

これが私が実際のデバイスでテストしたものです:

   CMMotionManager *myMotionManager= [[CMMotionManager alloc] init];
    myMotionManager.deviceMotionUpdateInterval = 1;
    [myMotionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXMagneticNorthZVertical  toQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
        double x = myMotionManager.deviceMotion.magneticField.field.x;
        double y = myMotionManager.deviceMotion.magneticField.field.y;
        double z = myMotionManager.deviceMotion.magneticField.field.z;
        NSLog(@"Field.x= %f; Field.y = %f; Field.z= %f",x,y,z);
    }];
于 2014-06-24T06:14:55.503 に答える