6

私は、垂直方向の動きの検出を必要とする Android アプリに取り組んでいます。タブレットを上に動かすと、ジャイロスコープ、加速度計、線形加速度センサーが、上向きまたは下向きの動きを示す対応する値を提供します。

私が抱えている問題は、タブレットをユーザーの方に傾けたり、ユーザーから離したりすると、これらのセンサーが上向き/下向きの動きも読み取ることです。たとえば、ジャイロスコープの x 値は垂直面を表します。ただし、デバイスを前方に傾けると、x 値が変化します。この動きをすると、上下の動きを読み取る同じセンサーがこの値を読み取ります。 ここに画像の説明を入力

残りのセンサーについても同様です。ジャイロと組み合わせた向きを使用して条件ステートメントを作成しようとしましたが、ピッチが変化していないが x 変数が上下に移動している場合、垂直方向の動きがあります。これに関する問題は、ユーザーが上に動かして少し傾けると、機能しなくなることです。傾きに変化があれば上下動しないようにも作ってみました。しかし、反復が非常に速いため、1/100 秒の間は傾斜が変化する可能性がありますが、次の場合は変化しません。

デバイスのピッチの変化ではなく、垂直方向の変化のみを読み取る方法はありますか?

ここに私が検出したいものがあります: ここに画像の説明を入力

編集:

「あなたが考える『上向き』の定義について、数学的に正しい定義を考えてください。」これが私の最初の質問でした。上方向への垂直移動を考えます。これをどのように検出しますか?どこから始めればいいのかわかりません、ありがとう。

4

2 に答える 2

2

この質問はかなり古いものですが、現在の回答とコメントには多くの混乱が見られるため、誰かがこれを見つけた場合に備えて、いくつかのことを解決するつもりです.

ジャイロスコープ

まず第一に、ジャイロスコープは定義どおりに垂直方向の動き (並進運動) を測定しません。以下の図のように定義された各軸の周りの回転を測定します。したがって、デバイスを前後に傾けると、実際には x 軸を中心に回転するため、ジャイロスコープ センサーの x 値にゼロ以外の値が表示されます。

デバイス軸

ジャイロスコープの x 値は垂直面を表します。

「垂直面」が何を意味するのかはわかりませんが、x 値は確かに面自体も面内のデバイスの向きも表していません。

ジャイロスコープ センサーの x 値は、x 軸周りのデバイスの現在の角速度を表します (例: 回転の変化)。

ただし、デバイスを前方に傾けると、x 値が変化します。この動きをすると、上下の動きを読み取る同じセンサーがこの値を読み取ります。

ここで何を指しているのかよくわかりません。「上下の動きを読み取るのと同じセンサー」はジャイロスコープだと思いますが、前述のように上下の動きは読み取れません。それは缶に書かれていることを正確に行います。

デバイス座標系

これは、元の質問よりもユーザー Ali の回答への回答ですが、どちらの場合にも関連性があります。

線形加速度センサー (またはその他のセンサー) の個々の出力は、上の画像に示すように、デバイスの座標系で表されます。これは、デバイスをわずかに回転させると、出力が以前に一致したワールド軸と平行ではなくなることを意味します。そのため、デバイスがアプリケーションの特定の方向にあることを強制するか、新しい方向を考慮する必要があります。

ROTATION_VECTOR四元数演算またはメソッドと組み合わせたセンサーはgetRotationMatrixFromVector()、測定値をデバイス座標からワールド座標に変換する 1 つの方法です。同じ目標を達成する方法は他にもありますが、一度達成すると、デバイスの持ち方は垂直方向の動きの測定には関係ありません。

いずれの場合も、探している軸は z 軸ではなく y 軸です。

(万が一、「デバイスの y 軸に沿って」を「垂直」として意味した場合は、すべての向きを無視して、線形加速度センサーを使用してください)

ノイズ

質問でノイズと更新レートに関するいくつかの問題について言及したので、ここで言及します。非常に頻繁に変化するものから適切で一貫したデータを取得する最も簡単で一般的な方法の 1 つは、ローパス フィルターを使用することです。どのタイプのフィルターが最適かはアプリケーションによって異なりますが、ほとんどの場合、指数移動平均フィルターが実行可能であることがわかりました。

仕上げの考え

方向に適切に注意すれば、変換された線形加速度出力は、ノイズをフィルタリングすることなく、垂直方向の動き (つまり、動きの変化) の適切な近似になることに注意してください。

また、速度のように垂直方向の「動き」を測定する場合は、加速度計の出力を統合する必要があります。位置を測定しようとするよりも速度の場合はそれほど深刻ではありませんが、さまざまな理由から、ほとんどの場合、これはあまりうまくいきません。

于 2015-07-01T12:55:58.733 に答える
1

OK、それは部分的な答えにすぎないと思います。

垂直方向の動きを検出する場合は、線形加速度のみが必要であり、デバイスの向きは関係ありません。見る

iOS - デバイスが上げ下げされたかどうかを確認する方法 (CoreMotion)

また

静止からの垂直方向の電話の動きを計算する方法は?

何らかの理由で、デバイスの向きにも関心がありますが、その理由はわかりません。何か他のものを検出したいのではないかと思います。ですから、もっと教えてください。そうすれば、答えを改善します。


アップデート

coremotion の投稿を読みましたが、z が高くなると x と y が低くなると垂直方向の動きを意味するとおっしゃいましたが、詳しく説明していただけますか?

疑似コードで書いてみます。(x, y, z)線形加速度ベクトルを測定しました。コンピューティング

rel_z = z/sqrt(x^2+y^2+z^2+1.0e-6)

その場合rel_z > 0.9、z 方向への加速度が支配的になります (垂直運動)。定数0.9は任意であり、微調整が必​​要な場合があることに注意してください (1 未満の正の数である必要があります)。は1.0e-6、偶発的なゼロ除算を避けるためにあります。

z十分な大きさの別の制約を追加する必要がある場合があります。あなたのデバイスが重力を 1 と 9.81 のどちらで測定しているかわかりません。1として測定すると思います。

つまり、全体として:

if (rel_z > 0.9 && abs(z) > 0.1) { // we have vertical movement

繰り返しますが、定数0.1は任意であり、微調整が必​​要になる場合があります。ポジティブであるべきです。


更新 2

私に向かって回転させても上に動かないので、これはしたくありません

上に動いています: 重心が上に動いています。私のコードは正しい動作をしています。

あなたが考える「上昇」について、数学的に正しい定義を考え出してください。

于 2012-11-02T21:50:25.417 に答える