web-dev-qa-db-ja.com

iPhone4のジャイロスコープでコンパスラグを補正

私はiPhone4でコンパスとジャイロスコープを試してきましたが、私が抱えている問題について助けを求めています。ジャイロスコープのデータを使ってコンパスの遅さを補いたい。

CMMotionManagerとそのCMDeviceMotionオブジェクト(_motionManager.deviceMotion_)を使用して、CMAttitudeオブジェクトを取得します。私が間違っている場合は訂正してください(お願いします)が、CMAttitudeオブジェクトのyawプロパティから推測したものは次のとおりです(私の目的ではpitchrollも必要ありません):

  • yawの範囲は、電話が下向きで(_0_で示される)、反時計回りにスイングしている場合は_deviceMotion.gravity.z_からPIまで、時計回りにスイングしている場合は_0_から_-PI_
  • デバイスが上を向いている場合、yawの範囲はそれぞれ_-PI_から_0_およびPIから_0_です。
  • コンパスデータ(私は_locationManager.heading.magneticHeading_を使用しています)から、コンパスは_0_から_360_までの値を示し、時計回りに振ると値が増加することがわかります。

さて、このすべての情報を一緒に使用して、horizontalと呼ぶ値を取得できます。この値は、デバイスが上向きか下向きかに関係なく、_0_から_360_までの値を示します。デバイスを時計回りに振ると増加します(ただし、_deviceManager.gravity.z_が_0_付近にある場合はまだ問題があります-yaw値はこの_gravity.z_値で異常になります)。

horizontalにマップされる計算されたmagneticHeading値を使用して、horizontal値とmagneticHeading値を「同期」し、コンパスに「c」があると感じたときにhorizontal値をmagneticHeadingに「同期」できるようです。

だから私の質問:

  • 私はこれで正しい方向に進んでいますか?
  • CMDeviceMotionのジャイロデータを適切に使用していて、上記の仮定は正しいですか?
  • _gravity.z_が_0_の周りにあるのに、なぜyawがおかしくなるのでしょうか。

どうもありがとうございました。ご回答をお待ちしております!

30
donkim

答えようとしているだけです...私が間違っている場合は私を訂正してください。

1.はい、あなたは正しい方向に進んでいます

2.CMの重力はすでにユーザーの重力(ユーザーの加速によって引き起こされる重力値)から「分離」されているため、「重力」と「userAcceleration」の2つの重力がありますApple CMドキュメント//注:完全に分離されているわけではありません//

3.重力が0の場合、対応する軸が重力に垂直であることを意味します。重力.zはiPhoneの画面であるため、画面を直立させて机の上に置くと-9.82m/s2になりますが、実際にはセンサーのノイズのために重力の0または最大値を取得するのは困難です(通常、すべてのセンサーにはノイズ、特に安価なセンサー)。

私がアプリで行うことは、特定の制限、戦略が目的に依存する方法、またはどちら側が参照であるかについて、参照軸を他の軸(あなたの場合はxまたはy)に切り替えることです。

もう1つは、ジャイロは高速ですが安定していないため、数回の間隔で値を再調整する必要があります。私の場合、5秒ごとです。私は2つの平面間の角度を計算するためにジャイロを実験しました、私は正確に90度の定規で試します、そしてそれは毎秒約0.5度のエラーを与え、増加し続けます、しかしそれは私のものです、多分他の人は避けるためのより良い方法を持っていますエラー。

以下は私のステップです」

  1. 初期化
  2. 重力XYZを読む-> Xg Yg Zg
  3. Xg <0.25かどうかを確認するTRUEの場合はYgを試してからZg //注1 = 1g = 9.82 m/s ^ 2
  4. コンパスとジャイロを読む
  5. コンパスを使用してジャイロを構成および調整し、ポイント3で使用する軸に基づいて計算します。
  6. 5秒が経過したら再校正し、コンパスを読み取ります
  7. ジャイロの読み取り値との差が5度を超える場合は、ジャイロの再校正をスキップします。
  8. ジャイロ読み取り値との差が5度未満の場合は、コンパス値を使用してジャイロを校正します

注:番号7の場合:電話が磁界の影響を受けているか、巨大な鋼の近くや高電圧の電線に影響を受けているか、工場の工場の騒がしくて重い機器にあるかどうかを確認します。

それがすべてです...これがあなたを助けることができることを願っています...そして私の英語をごめんなさい..

21
FerryHtw

これは、コンパスがジャイロスコープで補正されるiPhoneアプリの例です。コードとプロジェクトはここで見ることができます: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

10
Ellen S

質問1の回答は「はい」です。質問2は正しい方向に進んでいますが、「水平」ではない変数名を使用できます。質問3はhotpaw2によって回答され、高度がほぼゼロのチョッパーまたはヘリコプターのヨーも警告されます。アラーム付きのパイロット。ソフトウェアの一部がローカルであるためタイムラグがありますが、電磁波を検出するためのセンサーへのアクセス、デバイスの位置と方向、コンパス表示用のグラフィック出力の準備、計算と出力など、ソフトウェアを遅くする可能性のある他の要因があります要求されているタスクのタイプに合わせてカスタム設計されていない汎用ハンドヘルドデバイスを使用した、比較的低速のインターフェイスを介したジャイロおよびセンサーからのデータ。

0
Developer

無重力(または自由落下、または十分に近い)の場合、ヨー軸ベクトルの方向は定義されていません。

動作中に同期を行うには、磁気コンパスと同じラグ/遅延応答特性を持つ「水平」値のフィルターを作成する必要があります。それか、両方の値が落ち着くのに十分な時間モーションが停止するまで待ってから、オフセットを再計算します。

0
hotpaw2