私の現在のプロジェクトでは、Core Motion の CMAttitude によって提供される四元数に関する問題に遭遇しました。iPhone 5 (iOS 6.0.1) を明確な開始位置に置きました。次に、ペースの速いゲームのように、デバイスをすばやく動かし始めます。10 ~ 30 秒後に開始位置に戻ると、報告されたヨー角度は開始位置と 10 ~ 20 度異なります (ほとんどの場合、約 11°)。
効果を検証するために、古い (そして残念ながらもう利用できない) Core Motion Teapot サンプルを使用しました。ロギングのオイラー角は、CMAttitude から直接読み取られます。
NSLog(@"pitch: %f, roll: %f, yaw: %f", attitude.pitch * 180 / M_PI, attitude.roll * 180 / M_PI, attitude.yaw * 180 / M_PI);
これは、異なる工場で異なる時期に製造された 2 つの異なる iPhone 5 デバイスで見つかりました。しかし、本当に奇妙なのは、iOS 5.1.1 を実行している私の iPhone 4 が期待どおりに動作していることです。私には iOS のバグのように思えて、私はすでにバグ レポートを提出しましたが、その一方で、まだ誰もそれに遭遇していないとはほとんど想像できません。再設計された Core Motion API に関係していると思われます。バージョン 5 からは、磁力計 (コンパス) もセンサー フュージョンで考慮されます。コンソールは、場所からのバイアス推定が CoreMotion に提供されることを示しています。
locationd[41] <Notice>: GYTT inserted: bias,-0.196419,1.749323,-1.828088,variance,0.002644,0.004651,0.002527,temperature,31.554688
私の質問: Device Motion を使用しているときに磁力計の読み取りをブロックする可能性はありますか? 位置情報サービスを無効にしてみましたが、Core Motion には影響しません。不可能な場合、加速度計に基づく重力推定の代替/回避策は何ですか?
PS: クォータニオン ベースのモデルを扱っているため、これはジンバル ロックとは関係ありません。
編集:
さらにいくつかの測定を行った後、ヨーだけが影響を受けていることが明らかです。ヨーが開始位置に関係なくドリフトしている間、ピッチとロールは許容範囲内 (<= 1°) の偏差を示します。CMDeviceMotion.gravity
もきれいに見えます。
編集 (2): 最近の XCode バージョンに添付されている MotionGraphs サンプルで問題を再現できました。ヨーグラフは、原点から再現可能にドリフトしています。