17

SensorEventListenerforである簡単なアクティビティを作成しましたSensor.TYPE_ACCELEROMETER

私の場合、フォーマットでonSensorChanged(SensorEvent event)値を選択X,Y,Zしてファイルに書き込みます。

これにラベルが追加されました。このX,Y,Zラベルは、私が実行しているアクティビティに固有のものです。っていうことはX,Y,Z,label

このように私は自分の活動プロファイルを取得します。ノイズを除去し、アクティビティに最適なデータを取得するために、データ収集後に実行する操作について提案が必要です。

このデータ収集の主な目的は、ニューラル ネットワーク ライブラリ (Android 用 NeuroPh) Linkを使用してユーザー アクティビティ検出アプリケーションを構築することです。

4

3 に答える 3

58

ふざけて数週間前に歩数計を書きましたが、あなたが言及した 3 つのアクティビティを検出できたはずです。私は次の観察を行います:

  1. に加えてSensor.TYPE_ACCELEROMETER、Android にも と がSensor.TYPE_GRAVITYありSensor.TYPE_LINEAR_ACCELERATIONます。3 つすべての値をログに記録すると、TYPE_ACCELEROMETER の値が常に TYPE_GRAVITY と TYPE_LINEAR_ACCELERATION の値の合計に等しいことがわかります。このonSensorChanged(…)メソッドは、最初に TYPE_ACCELEROMETER を提供し、続いて TYPE_GRAVITY と TYPE_LINEAR_ACCELERATION を提供します。これらは、加速度計の読み取り値を重力と重力によるものではない加速度に分割する内部方法論の結果です。重力による加速ではなく、アクティビティによる加速に関心がある場合、必要なものには TYPE_LINEAR_ACCELERATION の方が適していることがわかります。
  2. どのセンサーを使用しても、測定する X、Y、Z はデバイスの向きによって異なります。ただし、あなたが言及したアクティビティを検出するために、結果は、たとえば、ユーザーがデバイスを縦または横の位置に保持しているかどうか、またはデバイスがフラットまたは垂直であるかどうかに依存しないため、X、Y、およびZは使い物になりません。代わりに、デバイスの向きに依存しないベクトルの長さ、つまり sqrt(X X+Y Y+Z Z) を確認する必要があります。
  3. ノイズに敏感なものにデータを供給する場合にのみ、データを平滑化する必要があります。代わりに、データはデータであり、ノイズに敏感でなく、データを平滑化する必要がないメカニズムを使用すると、最良の結果が得られます。定義上、平滑化とはデータを破棄することです。一方の端でノイズの多いデータを取り込み、もう一方の端で現在のアクティビティを出力するアルゴリズムを設計したいので、そのアルゴリズムの一部として平滑化を含める必要があるかどうかを事前に判断しないでください。
  4. これは、歩数計を作成していたときに記録した Sensor.TYPE_ACCELEROMETERの sqrt(X X+Y Y+Z Z) のグラフです。グラフは、100 歩歩いたときに測定された測定値を示しています。緑の線は sqrt(X X+Y Y+Z*Z)、青の線は指数加重移動平均です。緑の線は緑の線の平均レベルを示し、赤の線はアルゴリズムのカウントステップを示しています。緑の線が青の線と交差するとき、最大値と最小値を探すだけで歩数を数えることができました。スムージングや高速フーリエ変換は使用しませんでした。私の経験では、この種の場合、最も単純なアルゴリズムが最もうまく機能することがよくあります。複雑なアルゴリズムは状況によっては機能する可能性がありますが、すべての状況でどのように動作するかを予測するのは難しいためです。そして堅牢性は、あらゆるアルゴリズムの重要な特性です:-)。

ここに画像の説明を入力

于 2013-05-14T09:32:20.787 に答える
3

これは興味深い問題のように聞こえます。

データを時間に対してプロットして感触をつかんだり、扱っているノイズの種類を確認したり、検出器への入力用にデータを前処理する方法を決定したりしましたか?

   ^
   |
 A |
   |
   |
   |
   |_________________>
   |     time
   |
   v

各アクティビティの行から始めます。

  • |アックス + アイ + アズ|
  • |Vx + Vy + Vz| (データ ポイントによって形成される台形の面積を計算して概算します) ... など

おそらく、重力を検出してから、ベクトルを「標準」の方向 (正の Z 軸 = 上) に回転させることで、電話の向きを特定できます。それができれば、それぞれの軸がより意味のあるものになるかもしれません。たとえば、(ポケットに入って) 歩くと水平面で速度が発生する傾向があり、これは垂直面での動きによって (手で) 歩くのと区別される可能性があります。

フィルターに関しては、データにノイズがあるように見える場合、単純な出発点は移動平均を適用して平滑化することです。これは、一般的なセンサー データの一般的な手法です。

https://en.wikipedia.org/wiki/Moving_average

また、この投稿はあなたの質問に関連しているようです:

Android 3 軸加速度計で加速度計の読み取り値から重力係数を削除する方法

于 2013-05-13T16:52:39.760 に答える
1

私が特定したもの:

  1. データは、必要に応じて前処理する必要があります。私の場合、3つの入力と1つの出力が必要です
  2. データはスムージング (5 点スムージングまたは最適なその他の手法) を適用する必要があります。ノイズが除去されるように (完全ではありませんが)。移動平均線はテクニックの1つです
  3. データがどのようにサンプリングされたかがわからないため、線形化されたデータは適切です。補間を使用してデータを線形化するのに役立ちます
  4. 最後に、FFT (高速フーリエ変換) を使用して料理からレシピを抽出します。つまり、データセットから特徴を抽出します!
于 2013-05-14T06:42:11.280 に答える