web-dev-qa-db-ja.com

iPhone-iPhoneの回転を理解する

私はこれを理解しようとして壁に頭をぶつけています。次の写真を参照してください。

私がiPhoneをテーブルの上に置いているとしましょう。この時点で、コアモーションを介した回転の読み取り値は、ヨー、ロール、ピッチで0,0,0です(写真A)。

それから私はそれを90度転がします。これで、左側にホームボタンが右側にある状態でテーブルに座っています。これで、0,0,0と表示されます(画像B)。

今、私はそれを180度ヨーイングします。現在、右側をテーブルに置いて座っています。左側のホームボタン。 180,0,0と表示されます(画像C)。

今転がすと問題が発生します。 -45度回転させたとします。私は180、-45,0を読んでいるはずですが、代わりに180、-45,180を読んでいますか???? (写真D)。

何故ですか?変更したことがないのに、なぜピッチの値が得られるのですか?他の角度の回転によってピッチはどのように影響を受けますか?ありがとう。

enter image description here

34
SpaceDog

デルタムーブメントで生活できる場合を考えると、「クォータニオン差分」操作を使用できます。 q1と呼ばれるクォータニオンとしての前のローテーションと現在のローテーションがq2であるとしましょう。次に、q2 = q1 * dQが有効になるように、それらの間のデルタdQを計算できます。あなたがしなければならないのは、q1の逆関数(q1 ^(-1))を作成することだけで、次のようになります。

dQ = q1 ^(-1)* q2

DeviceMotionIntervalが十分に高い場合は、90°の特異点やその他の獣のようなものがなく、常に便利な小さなオイラー角があります。このソリューションの考えられる欠点は、エラーの伝播と仮想空間からのフィードバックの欠如によるわずかなドリフトである可能性があります。例:iPhoneをテーブルに置いて立方体を表示し、一連の回転を行うと、電話を開始位置に戻すと、立方体のangular変位が発生する可能性があります。

[編集:一部を忘れた]ドリフト効果を取り除くには、最後のオブジェクトの実際の位置(q1)をクォータニオン、つまり画面に表示されるアプリ内の座標として表現する方法のみが必要です。 Unityのようなツールを使用している場合は、オブジェクトの適切なプロパティを読み取っているだけかもしれません。簡単にアクセスできない場合は、この位置を手動で追跡できる可能性があります。

これについてもっと読みたい場合は、 グラフィックスとゲーム開発のための3D数学入門書、Fletcher Dunn、Ian Parberryによる 168ページをご覧ください。

9
Kay

オイラー角は、クォータニオンや回転行列のような任意の回転を記述するのにそれほど正確ではありません。多くの場合、回転を宣言する角度のセットは複数あるため、一意ではありません。

[編集:] Harinderのコアモーションで述べられているように、角度は標準的な表現に変換されます。つまり、いくつかの制約があります。よくわかりませんが、ピッチ角は[-90; 90]に制限されていると思います。

ジンバルロック またはこの現象に関する同様の記事をご覧ください。

3
Kay

同じ結果を再現できませんでした。 (無料) ジャイロスコープアプリ を使用して、ロール、ピッチ、ヨーとしてレポート位置Aの場合は(0、0、0)、Bの場合は(-90、0、0)、(-90 、0、180)Cの場合(図とは異なり、実際にはデバイスが私とは反対側を向くようになります)、次に(-45、0、180)Dの場合。

ヨー、ロール、ピッチとしてリストしているように見えるので、それを反転しても、それはまだ(0、0、0)->(0、-90、0)->(180、-90、0)->(180、 -45、0)。レポートの前に-90だけロールを追加すると、ピッチ軸とヨー軸が平行になり、Iよりも高速なタイパーが述べたように ジンバルロック が作成されます。

基本的な問題は、3つの軸で回転を記述しようとすると、暗黙の回転順序が得られることです。つまり、「これだけxの周りを回転し、次にこれだけyの周りを回転し、次にこれだけzの周りを回転します」。どの順序を選択しても、最初の軸を中心に回転すると、他の2つの軸が整列する可能性が常にあります。方向は3次元であるため、3つの数値で記述できます(たとえば、単位四元数を使用し、第4項を暗黙的に残します)が、オイラー角では記述できません。

編集:上記のコメントを参照すると、ハンドラーを-startDeviceMotionUpdatesToQueue:withHandler:に登録することで、デルタ移動を取得できます。これは一連のCMDeviceMotionを受け取り、そこからrotationRateメンバーを確認できます。

1
Tommy

加速度計は、重力とユーザー加速度の2つの加速度ベクトルの合計を測定します。ユーザー加速度は、ユーザーがデバイスに与える加速度です。 Core Motionは、ジャイロスコープと加速度計の両方を使用してデバイスの姿勢を追跡できるため、重力とユーザーの加速度を区別できます。

これはあなたに役立つかもしれません:

絶対度測定

0
iHS

この質問は関連しているようです:

iphone-ヨー、ピッチ、ロールのコアモーション範囲

0
occulus