21

私は、(現時点では)単純な立方体を表面の上に表示し、空間内を移動して(回転と変位の両方で)立方体をさまざまな角度で見ることができるようにする拡張現実アプリケーションを開発しています。カメラのキャリブレーションの問題はここでは当てはまりません。キューブを配置したい面に iPhone を置き、ボタンを押して姿勢をリセットするようにユーザーに依頼するからです。ジャイロスコープと Core Motion を使用すると、カメラの回転を簡単に確認できます。私はこのようにします:

if (referenceAttitude != nil) {
    [attitude multiplyByInverseOfAttitude:referenceAttitude];
}

CMRotationMatrix mat = attitude.rotationMatrix;

GLfloat rotMat[] = {
    mat.m11, mat.m21, mat.m31, 0,
    mat.m12, mat.m22, mat.m32, 0,
    mat.m13, mat.m23, mat.m33, 0,
    0, 0, 0, 1
};

glMultMatrixf(rotMat);

これは本当にうまくいきます。とにかく、加速中の空間の変位を見つけようとすると、さらに多くの問題が発生します。Core Motion を使用した Apple Teapot の例では、加速度ベクトルの x、y、および z 値を位置ベクトルに追加するだけです。これは(あまり意味がありませんが)、加速後にオブジェクトを元の位置に戻す結果をもたらします。(加速度は正から負、またはその逆になるため)。彼らは次のようにしました:

translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;

ある瞬間の加速度から変位を求めるにはどうすればよいですか?(既知の時差あり)。他のいくつかの答えを見ると、加速度から速度を取得し、速度から位置を取得するには、2回積分する必要があるようです。しかし、コードにはまったく例がなく、本当に必要だとは思いません。また、iPhoneがまだ飛行機に乗っているとき、加速度計の値がnullにならないという問題があります(ノイズがあると思います)。これらの値をどの程度フィルタリングする必要がありますか? それらをまったくフィルタリングする必要がありますか?

4

4 に答える 4

22

クール、同じ問題に苦しんでいる人がいるので、時間を費やす価値があります:-)

私は westsider の声明に同意します。数週間かけてさまざまなアプローチを試した結果、結果は芳しくありませんでした。距離が長くなる場合や、1 秒または 2 秒以上続くスローモーションの場合、許容できる解決策はないと確信しています。短い距離 (< 10 cm) やモーションの特定の最小速度などの制限に耐えられる場合は、解決策を見つけるチャンスがあると思いますが、保証はまったくありません。もしそうなら、それはあなたにかなりの研究とフラストレーションのかなりの時間を必要としますが、あなたがそれを得るならば、それは非常にクールです:-) これらのヒントが役に立つと思うかもしれません:

まず第一に、物事を簡単にするために、x などの 1 つの軸を見てください。ただし、左 (-x) と右 (+x) の両方が表現可能な状況であると考えてください。

はい、その通りです。時間の関数として位置を取得するには、2 回積分する必要があります。さらに処理するために、最初の統合の結果 (== 速度) を保存する必要があります。これは、後の段階で最適化のために必要になるためです。小さなバグが短期間で大きなエラーにつながるため、細心の注意を払ってください。

非常に小さな誤差 (例: <0.1%) であっても、積分を 2 回実行すると急速に大きくなることに常に注意してください。たとえば 50 Hz で加速度計を構成すると、状況は 1 秒後にさらに悪化します。つまり、50 ティックが処理され、小さな無視できるエラーが「真の」値を上回ります。台形則に頼るのではなく、少なくとも Simpson またはそれ以上の Newton-Cotes 式を使用することを強くお勧めします。

これを管理した場合は、適切なローパス フィルタリングの設定に注意する必要があります。一般的な値を示すことはできませんが、経験則として、0.2 から 0.8 の間のフィルター係数を試してみることをお勧めします。適切な値は、必要なビジネス ケースによって異なります。たとえば、ゲームの種類、イベントへの反応の速さなどです。

これで、特定の状況下で短期間でかなりうまく機能するソリューションが得られます。しかし、数秒後、オブジェクトが離れていくため、問題が発生します。ここで、指定された時間範囲内で最終的に処理できなかったソリューションの難しい部分に入ります:-(

有望なアプローチの 1 つは、私が「合成力」または「仮想力」と呼ぶものを導入することです。これは、デバイスが固定されたまま (? ネイティブ スピーカーがいない、つまり移動せずに) にも関わらず、オブジェクトが離れていくいくつかの悪い状況に対応するための戦略です。最も厄介なのは、速度が 0 よりも大きく、加速がない場合です。これはエラー伝播の避けられない結果であり、人為的に減速することで処理できます。これは、実際の対応物がなくても仮想減速を導入することを意味します。非常に単純化された例:

if (vX > 0 && lastAccelerationXTimeStamp > 0.3sec) {

     vX *= 0.9;
}

`

獣を飼いならすには、そのような条件の組み合わせが必要になります。正しい方法をつかむには多くの試行錯誤が必要であり、これが問題の難しい部分になります。

コードをクラックできたことがあれば、私に知らせてください。一般的にそれが可能かどうか、非常に興味があります:-)

乾杯ケイ

于 2011-01-08T17:18:26.093 に答える
7

When the iPhone 4 was very new, I spent many, many hours trying to get an accurate displacement using accelerometers and gyroscope. There shouldn't have been much concern about incremental drift as device needed only move a couple of meters at most and the data collection typically ran for a few minutes at most. We tried all sorts of approaches and even had help from several Apple engineers. Ultimately, it seemed that the gyroscope wasn't up to the task. It was good for 3D orientation but that was it ... again, according to very knowledgable engineers.

I would love to hear someone contradict this - because the app never really turned out as we had hoped, etc.

于 2011-01-07T04:59:53.090 に答える
5

また、iPhoneでディスプレイスメントを取得しようとしています。積分を使用する代わりに、d = .5a * t^2 の基本的な物理公式を使用して、初期速度を 0 と仮定しました (初期速度を 0 と仮定できるようには思えません)。これまでのところ、非常にうまく機能しているようです。

私の問題は、deviceMotion. を使用していて、値が正しくないことです。deviceMotion.gravity はほぼ 0 です。何かアイデアはありますか? - OK 修正済み、明らかに deviceMotion.gravity には ax、y、および z の値があります。どちらを指定しないと、x が返されます (これは 0 に近いはずです)。

于 2011-01-15T21:29:31.550 に答える
1

2 年後にこの質問を見つけてください。pARk という名前の iOS 6 docset で AR プロジェクトを見つけました。Gyroscope、別名 CoreMotion.Framework を使用した近接変位のキャプチャと計算を提供します。

私はちょうどコードを学び始めています。

つづく...

于 2012-10-11T09:29:56.213 に答える