30

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

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

  • yaw範囲は0PI電話が下を向いて(で示されているようにdeviceMotion.gravity.z)反時計回りに振っ0ている-PIときから時計回りに振っているときまでです。
  • デバイスが上を向いているときのyaw範囲は、それぞれ-PIから0PIまでです。0
  • そして、コンパスデータ(私が使用しているlocationManager.heading.magneticHeading)から、コンパスはから0まで360の値を与え、時計回りに振ると値が増加することがわかります

さて、この情報をすべて一緒に使用するとhorizontal、デバイスが上を向いているか下を向いているかに関係なく、デバイスを時計回りに振ると、からの値が得られ、値が増加するという値を取得できます(ただし0、が周りにある360ときはまだ問題があります-値はこの値で異常になります)。deviceManager.gravity.z0yawgravity.z

にマップする計算値を使用してhorizontalとの値を「同期」し、コンパスが「追いついた」と感じたときに値を「同期」できるように思えます。magneticHeadinghorizontalmagneticHeadinghorizontalmagneticHeading

だから私の質問:

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

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

4

4 に答える 4

21

ただ答えようとしている...私が間違っているなら私を訂正してください。

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

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

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

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

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

以下は私の手順です」

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

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

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

于 2010-12-13T09:23:27.093 に答える
10

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

于 2011-09-19T16:03:02.230 に答える
0

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

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

于 2010-12-08T06:18:54.840 に答える
0

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

于 2010-12-12T16:13:18.293 に答える