スケジュール
- Androidアプリ開発 お試し
- Android Stdio の設定
- 加速度センサーを見るアプリをつくる
- ファイル出力する
- ファイルをPCに移す
- 加速度から距離を出してみる
- 加速度センサーの値を取る(直線運動)
- Pythonでグラフ化する
- 加速度グラフを距離グラフにする
- 相対時間にする
- 歩数推定
- 加速度センサーの値を取る(歩行)
- Pythonでグラフ化し、フィルターをかける
- 歩数を取得する
進捗
Androidアプリ開発 お試し
参考サイト
リポジトリ
変更点
- APIレベルに合わせたコードに変更
TextView
を行ごとに分割した
加速度から距離を出してみる
加速度センサーの値を取る
- スマホをx軸正の方向に約[TODO]cm動かした
- 環境
- 端末
- iPhone 12
- センサー取得アプリ
- phyphox
- 端末
Pythonでグラフ化する
- グラフ化
- Python3.10.10
- 使用ライブラリ
- pandas
- matplotlib
- numpy
加速度グラフを距離グラフにする
加速度[m/s^2]
を微分すると速度[m/s]
になる速度[m/s]
を微分すると距離[m]
になる
問題点
- 速度グラフ, 距離グラフ の形がおかしい
- 微分 と 積分 を逆に認識していた
- 速度, 距離の値が大きすぎる
- サンプリング周波数(100Hz)を考慮していなかった
最終的なグラフ
歩数推定
加速度センサーの値を取る(歩行)
- まっすぐ5歩
- スマホのz軸正が上向き、y軸正が左向きになるように腰の位置で手に持った
Pythonでグラフ化し、フィルターをかける
平滑化フィルター
(N0 + N-1 + N-2 + N-3 + N-4) / 5
過去の値を使っています。
(N0が現在の値)
サンプリング周波数が100Hzなので、5つの平均ではあまり意味がない?
(n個の平均のnをwindowっていうのか…?)
(N0 + N-1 + N-2 + … + N-9) / 10
だいぶ滑らかになったが、1歩に対し頂点が複数ある
(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)
ノルム(window 50)
メモ
センシング
- とるデータを考える
- データをとる
- グラフ化
- フィルターをかける(ノイズ除去)
- ラベルをつける
- アプリに落とし込む
- aphyphox
- Androidのセンサーデータを取得するアプリ
- 積分(微分)すると情報が変わる
- 加速度 -> 速度 -> 距離
- 積分にも種類がある
- 目的によって使い分ける
- 台形積分, etc.
- 加速度センサーの向き[図1]
- 右: +x
- 上: +y
- 表: +z
図1
単語帳
ノルム
携帯の持ち方による違いなどをなくす
ベクトル量で表される加速度をx軸、y軸、z軸の成分に分解し、それぞれの成分の二乗を足し合わせたものの平方根
√(ax^2 + ay^2 + az^2)
移動平均
時系列データにおいて、ある一定区間ごとの平均値を区間をずらしながら求めたもの
フィルター
- 先輩に聞く
ローパスフィルター
小さいデータを取り出す
low を pass する(小さいのを通過させる)
ローパスフィルタの式
S[t]= α*Y[t-1] + (1-α)*S[t-1]
ハイパスフィルター
尖ったものを取り出す
- 平均フィルター
バンドパスフィルタ
間のものを取り出す
ミーティングにて
移動距離を二重積分で出すのはなかなか大変
ピークを検出した方法を書くべき
(手段ではなく条件)
- 高さ
1.5以上
で、間隔のサンプル数が50以上
になるように
手で持って歩数を計ると手が振動を吸収してしまうため良くない
腰に巻くケースで固定するとよい
過去(10年前とか)にはどこに入れても計測できるようにするかで研究ができた
5歩のつもりが6歩になったのはそこまで問題ではない
300歩 → 301歩 は誤差の範囲
移動距離を出す方法はいろいろある
- 1歩50(身長-110)cm と固定する
- 波の高さに合わせて歩幅を変える
次は移動軌跡を取ろう
(先輩が丁度やっている)