1

デバイスからの加速度値 (x、y、z) を使用してジェスチャに取り組んでいます。

デバイスを静止位置 (x,y,z) = ((0,0,0)) で手に持っているとします。しかし、デバイスの方向を変更すると (静止位置のまま)、値は ((766,766,821)) のように変更されます。すべての x、y、z 軸が元の向きと比較して変更されます。

この問題を解決する方法 (三角関数またはその他) はありますか?

4

4 に答える 4

5

重力による加速度は常に存在します。デバイスが特定の向きにあるときに、軸の 1 つからその値を減算しているようです。

ジェスチャを検出するために必要なことは、デバイスが動き始めるときに重力による加速度から瞬間的に現れるわずかな違いを検出することです。デバイスが静止しているか一定速度で移動しているかは検出できませんが、回転しているか加速しているかは判断できます。

(x,y,z) 値は、加速度の方向を示すベクトルを提供します。このベクトルの長さ (の二乗) は、x^2 + y^2 + x^2 として計算できます。これがデバイスが静止しているときと同じである場合、デバイスは加速されていませんが、特定の方向にあることがわかります。(静止しているか、一定の速度で移動しています。)

動きを検出するには、デバイスが動き始めたときと停止したときのベクトルの長さの瞬間的な変化に注意する必要があります。この変化は、重力に比べておそらく小さいでしょう。

モーションの方向を決定するには、移動中に加速度ベクトルの方向を比較する必要があります。すべてのジェスチャーを区別することはできないことに注意してください。たとえば、デバイスを前方に動かす (そしてそこで停止する) と、デバイスを少し傾けてから同じ方向に戻すのと同じ効果があります。

検出しやすいジェスチャは、デバイスの向きを変えるジェスチャです。パンチ モーションなどの他のジェスチャは、検出が難しくなります。それらは加速度ベクトルの長さの変化として現れますが、変化量はおそらく小さいでしょう。

編集:

上記の説明は、x、y、および z の正規化された値に関するものです。ベクトルを取得するには、読み取り値から減算する値を決定する必要があります。上記のコメントから、減算する「ゼロ」値は 766 のように見えます。ただし、デバイスの軸によって異なる場合があります。デバイスを 6 方向すべてに向けて読み取り値を測定します。つまり、x、y、z の最大値と最小値を取得します。中央の値は、両極端の中間にある必要があります (できれば 766)。

特定のジェスチャーには、明確な署名があります。

デバイスを落とすと、加速度ベクトルが一時的に減少し、デバイスが停止すると瞬間的に増加します。

デバイスを上げると、ベクターが一時的に増加してから、一時的に減少します。

前方への動きはベクトルを一時的に増加させますが、ベクトルをわずかに前方に傾けてから、再び一時的に増加させますが、デバイスが停止すると後方に傾けます。

ほとんどの場合、ベクトルの長さは重力による加速度と等しくなります。

于 2009-07-09T07:48:39.180 に答える
1

あなたの質問は不明確だと思います。正確には何を測定し、何を期待していますか?

一般に、加速度計は、固定位置に保持されている場合、地球の重力を測定します。これは上向きの加速度として表示されます。最初は奇妙に聞こえるかもしれませんが、完全に正しいです。重力が「下向き」に加速していて、デバイスが固定位置にあるため、反対方向、つまり「上向き」の力を加える必要があるためです。デバイスを固定位置に保持するために必要な力はこの力であり、対応する「上」方向の加速度があります。

デバイスによっては、PC で値を取得する前に、この重力加速度が差し引かれる場合があります。しかし、加速度計を回すと、重力加速度はまだ周囲にあり、同じ「上」方向を指しています。加速度計を回す前に、「上」がxに対応する場合、90°回転すると別の軸に対応し、たとえばyになります。したがって、 x軸とy軸で測定された加速度の両方が変化します。

したがって、あなたの質問に答えるには、加速度計がどのように値を示すかを知る必要があります。静止位置で測定された加速度値が (0, 0, 0) であるとは思えません。

于 2009-07-09T07:36:39.937 に答える
1

あなたのコメントはあなたの質問をより明確にします。必要なことは、向きが変わるたびに加速度計を調整することです。これを回避する方法はありません。アプリケーションの UI 要素にするか、用途に適合する場合は、加速度が一定時間比較的一定である場合は 0 に再調整します (長い加速度を測定すると機能しません)。

キャリブレーションは、デバイスの API に組み込まれている (ドキュメントを確認してください) か、手動で行う必要があります。手動で行うには、現在の加速度を読み取り、それらの 3 つの値を保存する必要があります。次に、デバイスから読み取り値を取得するたびに、各読み取り値からこれらの 3 つの値を減算します。

于 2009-07-09T07:43:45.210 に答える
0

デバイスが重力加速度を自動的に補正しない場合は、デバイスの出力から (0,0,~9.8m/s2) ベクトルを差し引く必要があります。

ただし、デバイスの向き (オイラー角または回転行列) も必要です。デバイスがそれを提供していない場合、シグナルされた加速度が実際にデバイスを動かしたことによるものか (線形加速度)、単に回転したことによるものか (重力の方向の変化) を判断することは基本的に不可能です。

補償された加速度は次のようになります。

 OutputAcc = InputAcc x RotMat - (0,0,9.8)

このようにして、OutputAcc ベクトルは常にローカル座標フレームになります (つまり、Z は常に上です)。

于 2009-07-09T08:01:53.087 に答える