スケジュール

  • Androidアプリ開発 お試し
    • Android Stdio の設定
    • 加速度センサーを見るアプリをつくる
    • ファイル出力する
    • ファイルをPCに移す
  • 加速度から距離を出してみる
    • 加速度センサーの値を取る(直線運動)
    • Pythonでグラフ化する
    • 加速度グラフを距離グラフにする
    • 相対時間にする
  • 歩数推定
    • 加速度センサーの値を取る(歩行)
    • Pythonでグラフ化し、フィルターをかける
    • 歩数を取得する

進捗

Androidアプリ開発 お試し

参考サイト

リポジトリ

AndroidSensor

変更点

  • APIレベルに合わせたコードに変更
  • TextView を行ごとに分割した

加速度から距離を出してみる

加速度センサーの値を取る

  • スマホをx軸正の方向に約[TODO]cm動かした
  • 環境
    • 端末
      • iPhone 12
    • センサー取得アプリ
      • phyphox

Pythonでグラフ化する

  • グラフ化
    • Python3.10.10
  • 使用ライブラリ
    • pandas
    • matplotlib
    • numpy

加速度グラフを距離グラフにする

  • 加速度[m/s^2] を微分すると 速度[m/s] になる
  • 速度[m/s] を微分すると 距離[m] になる

問題点

  • 速度グラフ, 距離グラフ の形がおかしい
    • 微分 と 積分 を逆に認識していた
  • 速度, 距離の値が大きすぎる
    • サンプリング周波数(100Hz)を考慮していなかった

最終的なグラフ

sensing-1

歩数推定

加速度センサーの値を取る(歩行)

  • まっすぐ5歩
  • スマホのz軸正が上向き、y軸正が左向きになるように腰の位置で手に持った

Pythonでグラフ化し、フィルターをかける

平滑化フィルター

平滑化 5

(N0 + N-1 + N-2 + N-3 + N-4) / 5

過去の値を使っています。
(N0が現在の値)

サンプリング周波数が100Hzなので、5つの平均ではあまり意味がない?
(n個の平均のnをwindowっていうのか…?)

平滑化 10

(N0 + N-1 + N-2 + … + N-9) / 10

だいぶ滑らかになったが、1歩に対し頂点が複数ある

平滑化 20

(N0 + N-1 + N-2 + … + N-19) / 20

1歩に対し1頂点になった。
(平滑化フィルターだけでいいのだろうか)

過去との平均の為、波が大きく後ろにずれた。

やり方が違ったかも
=> 歩数推定(esa)

data = pd.Series(np.random.randint(0, 10, size=20)) rolling_mean = data.rolling(window=10).mean()

numpy で平滑化できるっぽい

ノルム ノルム(window 0)

ノルム 50 ノルム(window 50)

メモ

センシング

  1. とるデータを考える
  2. データをとる
  3. グラフ化
  4. フィルターをかける(ノイズ除去)
  5. ラベルをつける
  6. アプリに落とし込む
  • aphyphox
    • Androidのセンサーデータを取得するアプリ
  • 積分(微分)すると情報が変わる
    • 加速度 -> 速度 -> 距離
  • 積分にも種類がある
    • 目的によって使い分ける
    • 台形積分, etc.
  • 加速度センサーの向き[図1]
    • 右: +x
    • 上: +y
    • 表: +z

図1

加速度センサーの向き

単語帳

ノルム

携帯の持ち方による違いなどをなくす

ベクトル量で表される加速度をx軸、y軸、z軸の成分に分解し、それぞれの成分の二乗を足し合わせたものの平方根

√(ax^2 + ay^2 + az^2)

移動平均

時系列データにおいて、ある一定区間ごとの平均値を区間をずらしながら求めたもの

フィルター

  • 先輩に聞く

ローパスフィルター

小さいデータを取り出す
low を pass する(小さいのを通過させる)

tomoima525’s blog

ローパスフィルタの式
S[t]= α*Y[t-1] + (1-α)*S[t-1]

ハイパスフィルター

尖ったものを取り出す

  • 平均フィルター

バンドパスフィルタ

間のものを取り出す

ミーティングにて

移動距離を二重積分で出すのはなかなか大変

ピークを検出した方法を書くべき
(手段ではなく条件)

  • 高さ1.5以上で、間隔のサンプル数が50以上になるように

手で持って歩数を計ると手が振動を吸収してしまうため良くない
腰に巻くケースで固定するとよい
過去(10年前とか)にはどこに入れても計測できるようにするかで研究ができた

5歩のつもりが6歩になったのはそこまで問題ではない
300歩 → 301歩 は誤差の範囲

移動距離を出す方法はいろいろある

  • 1歩50(身長-110)cm と固定する
  • 波の高さに合わせて歩幅を変える

次は移動軌跡を取ろう
(先輩が丁度やっている)