2

iOS アプリに Core Motion マネージャーがあります。

motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;
if ([motionManager isDeviceMotionAvailable]) {
    [motionManager startDeviceMotionUpdates];
}

update メソッド (私は cocos3d を使用していますが、それは問題ではありません) で、私はこれを持っています:

-(void) updateBeforeTransform:(CC3NodeUpdatingVisitor *)visitor
{
    if (motionManager.deviceMotionActive)
    {
        CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
        CMAttitude *attitude = deviceMotion.attitude;

        NSLog(@"%f, %f, %f", attitude.yaw, attitude.pitch, attitude.roll);

    }
}

デバイスをテーブルに置き、ヨー、ピッチ、ロールの値を監視し始めました。ヨーは常に変化しています。数分で約 10 度変化しており、私のアプリでは絶対に許容できません。その変更の理由は何ですか?どうすればそれを回避できますか? 地球の自転のせいかと思い始めましたが、速度が速すぎます:)

前もって感謝します!

4

2 に答える 2

3

暗がりで撮ってみようかな。iOS 5 では、磁力計データは Core Motion センサー フュージョン アルゴリズムの一部です。ゲームのような多くのアプリケーションでは、エネルギー消費が増加し、コンパスのキャリブレーションが必要になる可能性があるため、ユーザーにこの 8 のような動きを強制する必要はありません。

したがって、コンパス データは、 startDeviceMotionUpdates の代わりにCMMotionManagerのstartDeviceMotionUpdatesUsingReferenceFrameを使用して明示的に指定された場合にのみ、センサー フュージョン内で考慮されると推測します。CMAttitudeReferenceFrameXMagneticNorthZVerticalを試して、ドリフト効果が減少するかどうかを確認します。

于 2012-07-26T14:02:10.700 に答える
3

あなたが経験しているのはドリフトと呼ばれるものであり、それについてはどうすることもできません。

基本的に、ジャイロスコープは回転速度の測定には優れていますが、瞬間的な方向を測定することはできません。したがって、デバイスの現在の向きを計算するには、センサー アルゴリズムが感知した速度を位置に統合する必要があります。ただし、位置が計算されると、時間の経過とともに小さなエラーが蓄積され、デバイスがほとんど静止していても、計算された方向がずれることがあります。

デバイスに磁力計などの瞬間的な向きを測定できるセンサーがある場合、センサー フュージョン アルゴリズムはセンサー入力を比較/結合することでドリフトを修正できるため、Apple の参照フレーム オプション: CMAttitudeReferenceFrameXArbitraryCorrectedZVertical.

しかし、Apple の実装は完璧ではありません。そのため、CMAttitudeReferenceFrameXArbitraryCorrectedZVertical が有効になっていると、エラーの蓄積を修正するために大規模なジャンプが発生します。より良いアルゴリズムは、少なくとも時間の経過とともにエラー修正を滑らかにするものかもしれません.

于 2013-11-12T16:52:54.600 に答える