質問
私は私のiOSアプリにCore Motion Managerを持っています:
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;
if ([motionManager isDeviceMotionAvailable]) {
[motionManager startDeviceMotionUpdates];
}
.
および更新方法(私は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度の間変化しており、私のアプリでは絶対にわかりやすくなります。その変化の理由は何ですか?どうやってそれを避けることができますか?私はそれが地球の回転のために起こると考え始めました、しかし速度は多すぎる:)
事前にありがとう!
解決
暗闇の中で撮影してみてください。 IOS 5では、磁力計データはコアモーションセンサ融合アルゴリズムの一部です。ゲームのような多くのアプリケーションのためには、エネルギー消費の増加とユーザーに強制的に行うためのコンパスを校正する必要があるため、危険またはより良いのは必要ありません。
私はコンパスデータが明示的にCMMotionManagerの startdeviceMotionUpdatesUsingReferenceFrame startDeviceMotionUpdates 。 CMattitudereferenceFramexMagneticNorthzvertical と漂流効果が低下するかどうかを確認してください。
他のヒント
あなたが経験していることはドリフトと呼ばれるものであり、あなたはそれについて多くをすることはできません。
基本的に、ジャイロスコープは回転速度を測定するのが非常に良好ですが、瞬間的な向きを測定することはできません。したがって、デバイスの現在の向きを計算するために、センサーアルゴリズムは感知されたレートを位置に統合しなければなりません。しかしながら、位置が計算されるにつれて、デバイスがほとんど依然として依然として残っていても、時間の経過とともに蓄積され、計算された向きはドリフトすることがある。
装置が磁力計などの瞬間的な向きを測定できるセンサーが発生した場合、センサー融合アルゴリズムは、センサー入力を比較/組み合わせてドリフトを補正することができます。
しかし、アップルの実装は完璧ではありません、それがCMattitudereferenceFramexarBitraryCorrecticalCorrecticalが有効になっているときに、誤ったジャンプを前後にジャンプするのがわかります。より良いアルゴリズムは、少なくとも時間の経過とともに誤り訂正を滑らかにするものであるかもしれません。