梶研 [端末姿勢推定]
2023年9月19日

端末姿勢推定
出席率
- 3年セミナー:??%
スケジュール
短期的な予定
- 端末姿勢推定
- データを収集
- グラフを作成
- 静止状態の判別
- 端末姿勢を相補フィルターを用いて推定
- 加速度を世界座標に変換
- カルマンフィルターを用いた推定
長期的な予定
- 9月23日 技育展 決勝
- 9月中旬まで 端末姿勢推定(加速度, 角速度)
- 10月まで? 端末姿勢推定(カルマンフィルター)
- 11月中 Kotlin(とRust)の勉強「日常をsセンシングしたい」
進捗
やりたいこと
端末の姿勢推定
加速度を端末座標から世界座標にする
考え方
- 相補フィルターを使う
- 静止状態では加速度から傾きを推定
- 動作状態では角速度から傾きを推定
- 最終的には
カルマンフィルターを使う
前回) 相補フィルターを使って端末姿勢推定をした
結構理想通りにはなったが正解が分からない
- 加速度を世界座標系に変換してみる
- 正解データとの比較ができるデータを取る
前回) 加速度を世界座標系に変換した
明らかにおかしい
- ベクトル(加速度)を回転させる関数は以前のものを使用したため合ってるはず
- 元の加速度と姿勢推定後のデータのサンプリング周波数の違い?
データをとる
正解がわかりやすいデータで試してみる
机に置く(z軸正が上) → 縦向きに立てる(y軸正が上) → 横向きに立てる(x軸正が上) → 机に置く(z軸正が上)
問題点1 単位の違い
前回、単位が rad と deg で違うという問題があった
→ deg に統一
ただし、過去に作ったベクトルを回転させる関数は rad だった
修正後のグラフ
問題点2 関数が良くない
以前に使った加速度から傾きを出す関数を利用した
関数の仕様
以前のプログラムでは以下の処理をして返していた
1def calc_tilt(df_acc): 2 ... 3 roll = math.acos(x / gravity) 4 yaw = math.acos(y / gravity) 5 pitch = math.acos(z / gravity) 6 ... 7 8# 加速度から傾きを計算 9df_tilt = calc_tilt(df_acc) 10 11# 基準に合わせて回転 12df_tilt["roll"] = df_tilt["roll"] - math.pi / 2 13df_tilt["yaw"] = df_tilt["yaw"] - math.pi / 2
今回コピペする上で、基準に合わせて回転 という処理をしていなかった
関数の役割的に基準に合わせて回転させる処理は端末の傾きを計算する前に行うべき
問題点3 謎の処理
角速度から傾きを出すタイミングの処理で、
1フレーム前との角速度の差分を、1フレーム前の傾きに足していた(?)
自分でもよくわからないが、足してサンプリング周波数で割るように変更
修正後のグラフ
世界座標系にはなったが、勢いよく回転させたときに傾きがおかしいが、
妥協点?
歩いた時のデータを使う
スマホをポケットに入れてU字に歩く
10歩前進 - 右向いて4歩前進 - 右向いて10歩前進
元の加速度
世界座標系に変換した加速度
z軸が負の方向に (-9.8m/s^2) になってしまったが、
画面が上を向いている状態(z軸正が上) を基準とした加速度になった.
余談
プロフィールサイト作った
- プロフィールページ
- Next.js 13
- SCSS
- Mantine
- ブログページ
- HUGO
- CSS
新しい AppRouter を使ってみた.
とても扱いやすかったが、静的サイトにしたせいで
あまりメリットを活かしてない.
Rust 使ってみた
勤怠を記録するメニューバーアプリを作った
Tauri を使っているがフロント側は0で、全てRustで書いた
Tauri の良さを潰している
Jetpack Compose(Kotlin) 触ってみた
パッケージの扱い方わかんない.
大人しく最初から勉強します
カーブでセンシングしてみた
右カーブでセンシングしてみた





右カーブが大きく現れていて何かに使えそう.
今週山道走る時にもっととってみる
旅行いっていた
東大寺に行ってきた

大仏もみた

記念撮影

鹿さんとのふれあい

餌やりした

寿司たべた
