私はiPhone4でコンパスとジャイロスコープを試してきましたが、私が抱えている問題について助けを求めています。ジャイロスコープのデータを使ってコンパスの遅さを補いたい。
CMMotionManager
とそのCMDeviceMotion
オブジェクト(_motionManager.deviceMotion
_)を使用して、CMAttitude
オブジェクトを取得します。私が間違っている場合は訂正してください(お願いします)が、CMAttitude
オブジェクトのyaw
プロパティから推測したものは次のとおりです(私の目的ではpitch
もroll
も必要ありません):
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
がおかしくなるのでしょうか。どうもありがとうございました。ご回答をお待ちしております!
答えようとしているだけです...私が間違っている場合は私を訂正してください。
1.はい、あなたは正しい方向に進んでいます
2.CMの重力はすでにユーザーの重力(ユーザーの加速によって引き起こされる重力値)から「分離」されているため、「重力」と「userAcceleration」の2つの重力がありますApple CMドキュメント//注:完全に分離されているわけではありません//
3.重力が0の場合、対応する軸が重力に垂直であることを意味します。重力.zはiPhoneの画面であるため、画面を直立させて机の上に置くと-9.82m/s2になりますが、実際にはセンサーのノイズのために重力の0または最大値を取得するのは困難です(通常、すべてのセンサーにはノイズ、特に安価なセンサー)。
私がアプリで行うことは、特定の制限、戦略が目的に依存する方法、またはどちら側が参照であるかについて、参照軸を他の軸(あなたの場合はxまたはy)に切り替えることです。
もう1つは、ジャイロは高速ですが安定していないため、数回の間隔で値を再調整する必要があります。私の場合、5秒ごとです。私は2つの平面間の角度を計算するためにジャイロを実験しました、私は正確に90度の定規で試します、そしてそれは毎秒約0.5度のエラーを与え、増加し続けます、しかしそれは私のものです、多分他の人は避けるためのより良い方法を持っていますエラー。
以下は私のステップです」
注:番号7の場合:電話が磁界の影響を受けているか、巨大な鋼の近くや高電圧の電線に影響を受けているか、工場の工場の騒がしくて重い機器にあるかどうかを確認します。
それがすべてです...これがあなたを助けることができることを願っています...そして私の英語をごめんなさい..
これは、コンパスがジャイロスコープで補正されるiPhoneアプリの例です。コードとプロジェクトはここで見ることができます: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/
質問1の回答は「はい」です。質問2は正しい方向に進んでいますが、「水平」ではない変数名を使用できます。質問3はhotpaw2によって回答され、高度がほぼゼロのチョッパーまたはヘリコプターのヨーも警告されます。アラーム付きのパイロット。ソフトウェアの一部がローカルであるためタイムラグがありますが、電磁波を検出するためのセンサーへのアクセス、デバイスの位置と方向、コンパス表示用のグラフィック出力の準備、計算と出力など、ソフトウェアを遅くする可能性のある他の要因があります要求されているタスクのタイプに合わせてカスタム設計されていない汎用ハンドヘルドデバイスを使用した、比較的低速のインターフェイスを介したジャイロおよびセンサーからのデータ。
無重力(または自由落下、または十分に近い)の場合、ヨー軸ベクトルの方向は定義されていません。
動作中に同期を行うには、磁気コンパスと同じラグ/遅延応答特性を持つ「水平」値のフィルターを作成する必要があります。それか、両方の値が落ち着くのに十分な時間モーションが停止するまで待ってから、オフセットを再計算します。