非常に基本的な質問があります。 Android Accelerometerの場合のローパスフィルターとハイパスフィルターとは何ですか?
加速度センサーからの出力を見ると、フィルターを使用していない場合が表示されます(ケース:テーブルで携帯電話をアイドル状態にした)z軸+ ve値を取得します。今、私が基本的な物理学を使用すると思うなら、それは私に小さなgの正確な値(9.8approx)、すなわち重力による加速度を与えます。
直線加速度を得るために、電話に力を加えると、加速度計の値が変わりますが、g + a
私が適用した。 a
を取得するために、なぜ加速度計から取得した値から直接減算できないのですか?
用途は何ですか?
基本的な定義は、ローパスについて理解します:低い値を許可するには、ハイパス:高い値を許可します。理解してください。私はこれと混同しています。
ドキュメントを見ると、SensorEventがすべての力のベクトルを表す配列を返すことがわかります。 http://developer.Android.com/reference/Android/hardware/SensorEvent.html#values これは、加速のコンポーネントが各軸に分解する方法です。
values[0] //acceleration on x axis
values[1] //acceleration on y axis
values[2] //acceleration on z axis
重力がどの方向に作用しているかを見つけて、それを構成要素に分解する必要があります。重力の大きさは常に9.8になりますが、方向、したがって重力がコンポーネントパーツに分解される方法は変わります。 重力の値を取得し、そのベクトルをgravity[3]
のような配列に格納できると仮定すると:
gravity[0] //gravity x axis
gravity[1] //gravity y axis
gravity[2] //gravity z axis
電話の合計加速度T
はT = g + a
です。 a
だけを取得するには、a = T - g
が必要です。
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
これはベクトル演算であるため、要素ごとにすべてを計算する方法に注意してください。
携帯電話には重力と他の力の両方を同時に測定する加速度計が1つしかないため、注意が必要なのはgravity
を見つけることです。 1つのセンサーから検出したい2つの異なる力があります。孤立した時点でのみ力を見ることができた場合、情報を抽出することはできません。ただし、一定期間にわたってサンプルを取得し、時間の経過とともに力がどのように変化するかを調べることで、情報を抽出できます。
つまり、これらの力の変化の速さに基づいて、その1つのソースからの結果をフィルターで除外する必要があります。重力による加速度の大きさはまったく変化しないため、すぐには変化しません。重力は一定の力です。ただし、他の力は時間とともに変化します。ハイパスフィルターを使用して重力などのゆっくりと変化する力を除外すると、残りの力は、電話に加えられている力などの急速に変化する力になります。これが、ハイパスフィルターが使用される理由です。
ローパスフィルタ:低周波信号を通過させ、しきい値周波数よりも高い周波数の信号の振幅を低減します
High Pass Filter:高周波信号を通過させ、しきい値周波数より低い周波数の信号の振幅を低減します
ドキュメント を見ると、「デバイスの実際の加速度を測定するために、重力の寄与はeliminated。これは、ハイパスフィルターを適用することで実現できます。逆に、ローパスフィルターを使用して重力を分離できます。」
ローパスフィルタリングに関するこのチュートリアルをご覧ください: http://www.raweng.com/blog/2013/05/28/applying-low-pass-filter-to-Android-sensors-readings/
http://developer.Android.com/reference/Android/hardware/SensorEvent.html#values でドキュメントを読むと、にアクセスできることがわかります。すべてのx、y、z軸のa値:
values[0] - a on x axis
values[1] - a on y axis
values[2] - a on z axis
ノイズを含むこれらの値から直接減算すると、加速度計の出力にはノイズが含まれます。ノイズを除去するには、ハイパスフィルターとローパスフィルターを実装する必要があります。
私は通常、この式を使用して、加速度センサーのデータをリニアセンサー(ジャイロスコープなど)のデータに変換します。ジャイロセンサーが内蔵されているかどうかわからない場合に使用します。
private float[] values;
private float[] valuesN;
private float[] prev;
private float[] prevHF;
private boolean doHPF = false;
// ind - index of three dimensions (x, y, z)
private void makeHPFf() {
for (int ind = 0; ind < 3; ind++) {
valuesN[ind] = values[ind] * 0.002f * 9.8f;
if (doHPF)
values[ind] = valuesN[ind] - prev[ind] + (prevHF[ind] * 0.8f);
prev[ind] = valuesN[ind];
prevHF[ind] = values[ind];
}
if (!doHPF)
doHPF = true;
}