SatooRu's Profile

全ての記事梶研の進捗日常の記録制作物一覧

梶研の進捗

梶研 [カルマンフィルタ序章]

梶研 [カルマンフィルタ序章]

3年セミナー:??% []端末姿勢推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 [x]端末の姿勢を推定 [x]加速度を世界座標に変換 []カルマンフィルタを用いた推定 9月中旬まで端末姿勢推定(加速度,角速度) 10月中端末姿勢推定(カルマンフィルタ) 11月中Kotlin(とRust)の勉強「いつでもセンシングアプリ」 回転を滑らかにしたデータを取る 机に置く(z軸正が上)→縦向きに立てる(y軸正が上)→横向きに立てる(x軸正が上)→机に置く(z軸正が上) >白静止時 >灰動作時 うまくいっているように見えるが、角速度のメリットが分かりづらい 小走りしながらスマホを立てて戻す 加速度だけではノイズが大きいが、 相補フィルターではノイズを抑えることができている もっと調べた python importnumpyasnp importpandasaspd definitialize_filter() x=np.array([1.0,0.0,0.0,0.0]) P=np.eye(4) Q=np.eye(4)0.01 R=np.eye(3)0.1 returnx,P,Q,R defquaternion_to_rotation_rate(q,gyro_data) q_conj=np.array([q[0],q[1],q[2],q[3]]) omega=2.0R.from_quat(q_conj).inv().as_rotvec()gyro_data returnomega defupdate_filter(x,P,Q,R,accel_data,gyro_data,dt) A=np.eye(4)+0.5dtnp.array([ [0,gyro_data[0],gyro_data[1],gyro_data[2]], [gyro_data[0],0,gyro_data[2],gyro_data[1]], [gyro_data[1],gyro_data[2],0,gyro_data[0]], [gyro_data[2],gyro_data[1],gyro_data[0],0] ]) x_pred=A.dot(x) P_pred=A.dot(P).dot(A.T)+Q H=np.eye(3) K=P_pred.dot(H.T).dot(np.linalg.inv(H.dot(P_pred).dot(H.T)+R)) omega=quaternion_to_rotation_rate(x,gyro_data) x_updated=x_pred+K.dot(accel_dataH.dot(x_pred)) P_updated=(np.eye(4)K.dot(H)).dot(P_pred) returnx_updated,P_updated if__name__=="__main__" data=pd.read_csv('sensor_data.csv') x,P,Q,R=initialize_filter() dt=data['timestamp'].diff().mean() forindex,rowindata.iterrows() accel_data=np.array([row['accel_x'],row['accel_y'],row['accel_z']]) gyro_data=np.array([row['gyro_x'],row['gyro_y'],row['gyro_z']]) x,P=update_filter(x,P,Q,R,accel_data,gyro_data,dt) euler_angles=R.from_quat(x).as_euler('xyz') print(f"推定されたロール角度{euler_angles[0]}rad") print(f"推定されたピッチ角度{euler_angles[1]}rad") print(f"推定されたヨー角度{euler_angles[2]}rad") python importnumpyasnp importpandasaspd importmatplotlib.pyplotasplt fromscipy.spatial.transformimportRotation definitialize_filter() """ カルマンフィルターを初期化する P,Q,Rは適切な値を設定する必要がある """ x=np.array([1.0,0.0,0.0,0.0]) P=np.eye(4) Q=np.eye(4)0.01 R=np.eye(3)0.1 returnx,P,Q,R defquaternion_to_rotation_rate(q,gyro_data) """ クォータニオンを角速度に変換する Args q(np.array)クォータニオン gyro_data(np.array)ジャイロセンサーの値 """ q_conj=np.array([q[0],q[1],q[2],q[3]]) omega=2.0Rotation.from_quat(q_conj).inv().as_rotvec()gyro_data returnomega defupdate_filter(x,P,Q,R,accel_data,gyro_data,dt) """ カルマンフィルターを更新する Args x(np.array)状態推定値 P(np.array)推定誤差共分散行列 Q(np.array)プロセスノイズの共分散行列 R(np.array)観測ノイズの共分散行列 accel_data(np.array)加速度センサーの値 gyro_data(np.array)ジャイロセンサーの値 dt(float)サンプリング時間 """ x_gyro=gyro_data[0] y_gyro=gyro_data[1] z_gyro=gyro_data[2] omega=np.array([ [0,x_gyro,y_gyro,z_gyro], [x_gyro,0,z_gyro,y_gyro], [y_gyro,z_gyro,0,x_gyro], [z_gyro,y_gyro,x_gyro,0] ]) A=np.eye(4)+(0.5dtomega) delomega x_pred=A.dot(x) P_pred=A.dot(P).dot(A.T)+Q H=np.zeros((3,4)) H[0,1]=1H[1,2]=1H[2,3]=1 K=P_pred.dot(H.T).dot(np.linalg.inv(H.dot(P_pred).dot(H.T)+R)) omega=quaternion_to_rotation_rate(x,gyro_data) x_updated=x_pred+K.dot(accel_dataH.dot(x_pred)) P_updated=(np.eye(4)K.dot(H)).dot(P_pred) returnx_updated,P_updated if__name__=="__main__" file_path="./logs/run_kururu/" accel_data=pd.read_csv(f'{file_path}Accelerometer.csv') gyro_data=pd.read_csv(f'{file_path}Gyroscope.csv') x,P,Q,R=initialize_filter() dt=accel_data['Time(s)'].diff().mean() length=accel_data.shape[0]ifaccel_data.shape[0]<gyro_data.shape[0]elsegyro_data.shape[0] datum=[] forindexinrange(length1) accel_data_point=np.array([ accel_data.at[index,'Accelerationx(m/s^2)'], accel_data.at[index,'Accelerationy(m/s^2)'], accel_data.at[index,'Accelerationz(m/s^2)'] ]) gyro_data_point=np.array([ gyro_data.at[index,'Gyroscopex(rad/s)'], gyro_data.at[index,'Gyroscopey(rad/s)'], gyro_data.at[index,'Gyroscopez(rad/s)'] ]) x,P=update_filter(x,P,Q,R,accel_data_point,gyro_data_point,dt) euler_angles=Rotation.from_quat(x).as_euler('xyz') datum.append([euler_angles[0],euler_angles[1],euler_angles[2]]) datum=np.array(datum) plt.plot(datum[,0],label='roll') plt.plot(datum[,1],label='pitch') plt.plot(datum[,2],label='yaw') plt.legend() plt.show() 1フレーム前の状態と観測値から、現在の状態を推定する うまく計算してだされた値(カルマンゲイン)と推定値を使って、現在の状態を更新する 1.初期化 初期状態推定値を設定 姿勢なし[0,0,0,0] 初期推定誤差共分散行列を設定 プロセスノイズの共分散行列を設定 観測ノイズの共分散行列を設定 2.予測する 前回の状態推定値と角速度xサンプリング周波数を使って計算する 3.カルマンゲインを計算する 予測推定誤差と観測ノイズの共分散行列を使って計算する 4.観測を更新する 姿勢(x)を更新する 推定値(x_pred)とカルマンゲイン(K)を足す 推定誤差(P)を更新する カルマンゲインと予測推定誤差を使って計算する 5.(1フレーム進んで2へ戻る) クォータニオンは回転を表す4次元のベクトル. 複素数を4次元に拡張したもの. 複素数iに加えてjも追加したイメージ 数列1次元(線) 複素数2次元(平面) クォータニオン?3次元(空間) 端末の状態(姿勢)のクォータニオン 推定値と実際の値との間に生じる誤差 なぜそれを求めれるのかがわからない システムやプロセスの挙動や状態に影響を与える外部からのランダムな要因や摂動のこと ex)摩擦や風の影響、車両の制御システムの誤差など 行列でどう表現しているのかがわからない センサで計測した値に生じる誤差 行列でどう表現しているのかがわからない 前回全くわからない. 今回基本は分かった気になれた. 次回コードを書いてみる(予定) なし 近所の子供達がいろんな家を回ってお菓子を盗む(合法)イベント. 伝統が残っていて嬉しい 思ったより手軽で精度も高かった. データを取り出したりして遊んでみたい. 旅行の必需品

2023年10月3日

梶研 [技育展 & カルマンフィルタについて調べた]

梶研 [技育展 & カルマンフィルタについて調べた]

3年セミナー:??% []端末姿勢推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 [x]端末の姿勢を推定 [x]加速度を世界座標に変換 []カルマンフィルターを用いた推定 [x]技育展決勝 9月中旬まで端末姿勢推定(加速度,角速度) 10月まで?端末姿勢推定(カルマンフィルター) 10月中Kotlin(とRust)の勉強「いつでもセンシングアプリ」 ファイナリストなれず 自分 ノードを元にGoogle検索とQiita検索をしやすいように 初めて訪れた際、検索ボックスを表示するようにする ユーザビリティの向上(検索ボックス等) その他 2回目以降に訪れた際、最後に見たノードから始まるようにする 関数などより細かな情報を追加 ファイナリストには研究やOSSなど年単位で制作しているものが多く、 気軽に参加してファイナリストになれるものではないと感じた. しかし、一部のファイナリストや企業賞を取っていた参加者の中には2ヶ月で制作したとうい人も多く、 制作期間だけではなく技育展に適したアイデアなども重要だと思った. カルマンフィルタについて調べた CiNiiでカルマンフィルタを使っている研究論文を探した DeadReckoning(DR)技術 デッドレコニング カーナビに使われる GPSによる絶対位置推定情報とセンサによる相対移動推定情報をカルマンフィルタによって組み合わせる 歩数と歩幅は使わない 短時間フーリエ変換を用いる 最低2歩分の1s以上がよい 電波強度にカルマンフィルタを適用 端末の姿勢情報と周囲の壁面などの測距情報と,屋内の3次元部屋情報を融合する 論文は専門用語や未知の数学を使っていて難しかった. 言いたいことは分かるが、数式が難しく計算方法がわからない 相補フィルターにも種類があることを知った 固定相補フィルタ どちらか一方を使う 可変相補フィルタ 重み係数でどちらも使う 静止時には加速度に重みを、移動時には角速度に重みをおくなど とても分かりやすかった. が、プログラムに起こした時の形が見えない サンプルコードを生成してもらった. プログラムから逆に考えてみる python importnumpyasnp importpandasaspd definitialize_filter() x=np.array([1.0,0.0,0.0,0.0]) P=np.eye(4) Q=np.eye(4)0.01 R=np.eye(3)0.1 returnx,P,Q,R defquaternion_to_rotation_rate(q,gyro_data) q_conj=np.array([q[0],q[1],q[2],q[3]]) omega=2.0R.from_quat(q_conj).inv().as_rotvec()gyro_data returnomega defupdate_filter(x,P,Q,R,accel_data,gyro_data,dt) A=np.eye(4)+0.5dtnp.array([ [0,gyro_data[0],gyro_data[1],gyro_data[2]], [gyro_data[0],0,gyro_data[2],gyro_data[1]], [gyro_data[1],gyro_data[2],0,gyro_data[0]], [gyro_data[2],gyro_data[1],gyro_data[0],0] ]) x_pred=A.dot(x) P_pred=A.dot(P).dot(A.T)+Q H=np.eye(3) K=P_pred.dot(H.T).dot(np.linalg.inv(H.dot(P_pred).dot(H.T)+R)) omega=quaternion_to_rotation_rate(x,gyro_data) x_updated=x_pred+K.dot(accel_dataH.dot(x_pred)) P_updated=(np.eye(4)K.dot(H)).dot(P_pred) returnx_updated,P_updated if__name__=="__main__" data=pd.read_csv('sensor_data.csv') x,P,Q,R=initialize_filter() dt=data['timestamp'].diff().mean() forindex,rowindata.iterrows() accel_data=np.array([row['accel_x'],row['accel_y'],row['accel_z']]) gyro_data=np.array([row['gyro_x'],row['gyro_y'],row['gyro_z']]) x,P=update_filter(x,P,Q,R,accel_data,gyro_data,dt) euler_angles=R.from_quat(x).as_euler('xyz') print(f"推定されたロール角度{euler_angles[0]}rad") print(f"推定されたピッチ角度{euler_angles[1]}rad") print(f"推定されたヨー角度{euler_angles[2]}rad") なし 春日井市の千歳楼 幽霊に温もりはあるのか

2023年9月26日

梶研 [端末姿勢推定]

梶研 [端末姿勢推定]

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

2023年9月19日

梶研 [端末姿勢推定]

梶研 [端末姿勢推定]

3年セミナー:??% []端末姿勢推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 [x]端末の姿勢を推定 []加速度を世界座標に変換 []角速度を世界座標に変換 []カルマンフィルターを用いた推定 9月23日技育展決勝 9月中旬まで端末姿勢推定(加速度,角速度) 10月まで?端末姿勢推定(カルマンフィルター) 10月中Kotlin(とRust)の勉強「いつでもセンシングアプリ」 端末の姿勢推定 加速度を端末座標から世界座標にする 加速度に変化がない(動いていない)時は、重力加速度の方向から端末状態を出す 変化がある時は、ジャイロセンサーから端末状態を出す 最終的にはカルマンフィルターを使う >灰色は動いていると判断した区間 >橙は区間内の最大値と最小値の差 200ms(80フレーム)ごとに区切り、区間内の最大値と最小値の差が1m/s^2以下の時は、 動いていないと判断する 差ではなく、分散を用いる 200ms(80フレーム)ごとに区切り、区間内の分散が0.15m/s^2以下の時は、静止状態とする 静止状態との差が大きくなっていて良い 角速度を積分して角度を出す 加速度の絶対値で各軸の加速度を割って、arccosをとる python gravity=math.sqrt(x2+y2+z2) angle_x=math.acos(x/gravity) angle_y=math.acos(y/gravity) angle_z=math.acos(z/gravity) 分散が0.15m/s^2以下の時は、加速度からの傾きを使う 0.15m/s^2以上の時は、角速度を足して端末の回転を反映させる 傾きが大きすぎる ~~角速度を反映時にサンプリング周波数を掛けていない~~ 単位がradとdegで違った より大きな動作(傾き)でやるべき? スマホ持って各軸90度程度回転など 結構理想通りにはなったが正解が分からない 加速度を世界座標系に変換する 正解データとの比較ができるデータを取る 明らかにおかしい ベクトル(加速度)を回転させる関数は以前のものを使用したため合ってるはず 元の加速度と姿勢推定後のデータのサンプリング周波数の違い? センシングした 学校(食堂等)の混雑を知れるアプリ 賞はもらえなかったが、多くの反響をいただけた

2023年9月12日

梶研 [技育CAMP アドバンス & 端末姿勢推定]

梶研 [技育CAMP アドバンス & 端末姿勢推定]

3年セミナー:??% []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 [x]サイトの作成 [x]スライドの作成 [x]技育キャンプvol.7発表(8/5) [x]追加開発 [x]技育展中部ブロック発表(8/12) [x]デモ動画変更(システム改善) [x]技育CAMPアドバンス発表(9/2) []追加開発 []技育展決勝(9/23) []端末状態推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 []端末姿勢推定 9/23技育展決勝 単語の繋がりを可視化するアプリ なし 目立たない 印象に残らない 技術的な挑戦がない 需要がない 次は(出るならば)技術からアイデアを出したい 加速度と角速度,カルマンフィルターを使って端末の状態を推定する 加速度に変化がない(動いていない)時は、重力加速度の方向から端末状態を出す 変化がある時は、ジャイロセンサーから端末状態を出す 最終的にはカルマンフィルターを使う スマホをポケットに入れてU字に歩く >10歩前進右向いて4歩前進右向いて10歩前進 ~3sポケットに入れている 37s~ポケットから出している >ノルムが9.5(m/s^2)以上10.1(m/s^2)以下の時は、動いていないと判断する >(灰色の部分) 歩いている時でも9.510.1(m/s^2)の間になる瞬間がある 一定区間の傾きが0に近い時は、動いていないと判断する 50msごとに区切って、差が0.15m/s^2以下の時は、動いていないと判断する 大体は判別できているが、50msの間に山があると判別できない →前後の差ではなく、区間内の最大値と最小値の差をとる >橙は区間内の最大値と最小値の差 200msごとに区切り、区間内の最大値と最小値の差が1m/s^2以下の時は、 動いていないと判断する なし 株式会社MIXI賞を頂いた Rustとeframe,eguiでデスクトップアプリ作ってみた プログラミング演習の問題をRustで書いてみる(予定) >学費は公立大学の分以外が返してもらうけど >好きなようにしたらいんじゃない 現状院進もあり まだ慎重に考える

2023年9月5日

梶研 [Open Hack U 2023 NAGOYA]

梶研 [Open Hack U 2023 NAGOYA]

3年セミナー:??% []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 [x]サイトの作成 [x]スライドの作成 [x]技育キャンプvol.7発表(8/5) [x]追加開発 [x]技育展中部ブロック発表(8/12) []デモ動画変更(システム改善) []技育CAMPアドバンス発表(9/2) []追加開発 []技育展決勝(9/23) [x]HackUNAGOYA [x]案出し [x]役割分担 [x]キックオフ [x]アプリイメージの作成 [x]サイトの作成 [x]スライドの作成 [x]発表(8/27) []端末状態推定 []データを取り直す []加速度と角速度の使い分けタイミングを出す []ー 9/23技育展決勝 簡単にアウトプット, 手軽にインプットできるアプリ アプリデザイン フロントエンド(閲覧,投稿,検索ページ) 発表スライド/原稿 当日の発表 axios.post()を実行してもリダイレクトを繰り返してエラーを吐く 同じ関数を使って別のエンドポイントにリクエストを送ると返ってくる フロント側の問題ではなさそう RESTClientを使うと成功する バック側の問題ではなさそう リクエストの内容もあってそう axiosではなくFetchAPIを使っても変化なし ライブラリの問題ではなさそう CORSの問題だった 許可してあげると無事に全てのAPIを叩けるように (なぜ他のは使えたのかは分からない) safariではCORSを無視する設定ができる chromeでCORSエラーをコンソールに出す設定がある などのドキュメントを残しており、 展示会中にアピールすることができた 最初の一週間を~~技育展で手を付けれない代わりに~~デザインに掛けたことにより、 動作に力を入れるチームが多い中、目立つことができた(と思う) バックの完成前にデモ動画を撮るために フロント側だけで動作するようにしていた 本番当日、たくさんのショートを投稿したところ CloudStorageの無料枠の制限に達してしまい読み書きが出来なくなった 展示会ではデモ用を併用することで実際の動作を見せることができた 最優秀賞をとれた! なし クリックとかドラッグとかが多くて疲れる...

2023年8月29日

梶研 [技育展予選 & HackU]

梶研 [技育展予選 & HackU]

3年セミナー:??% []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 [x]サイトの作成 [x]スライドの作成 [x]技育キャンプvol.7発表(8/5) [x]追加開発 [x]技育展中部ブロック発表(8/12) []デモ動画変更(システム改善) []技育CAMPアドバンス発表(9/2) []追加開発 []技育展決勝(9/23) []HackUNAGOYA [x]案出し [x]役割分担 [x]キックオフ [x]アプリイメージの作成 [x]サイトの作成 []スライドの作成 []発表(8/27) 9月~端末状態推定 9/23技育展決勝 WisdomTree 単語の繋がりから知らない単語を知れるサービス 技育展決勝進出! 表示の改善 ノードの関係を改善 発表方法(デモ)の変更 手軽にアウトプットできるアプリ テキストからスライドと音声を生成してくれる ながらのインプットができる 音声の自動再生は簡単だったが、 手動でスライドを移動した時の音声の切り替えが大変だった スライドの作成 ロード画面の作成 表示の改善 大村さん,井上さん...と会った Pixel6a スマホとセットで4万円した すごいフェスに行ってきた セカオワとかYOASOBIとかetc. DragonNight中の加速度 撮影禁止でもその時の楽しさを残せそう

2023年8月22日

梶研 [技育CAMP マンスリーハッカソン vol.7]

梶研 [技育CAMP マンスリーハッカソン vol.7]

3年セミナー:??% [x]技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 [x]サイトの作成 [x]スライドの作成 [x]技育キャンプvol.7発表(8/5) []追加開発 []技育展中部ブロック発表(8/12) []追加開発 []技育CAMPアドバンス発表(9/2) []HackUNagoya [x]案出し [x]役割分担 [x]キックオフ []アプリイメージの作成 []サイトの作成 []スライドの作成 []発表(8/27) 9月~端末状態推定 9/2技育キャンプアドバンス(梶研) 9/2技育キャンプアドバンス(シス研) 9/9,10技育CAMPvol.9(シス研) 10/7,8工科展 wisdomTree知ってる単語から知らない単語を視覚的に見つけられるサービスです. 完全一致したらそのノードが表示される 完全一致しなかった場合、候補が表示される フロントの仮データを扱っていたものを、APIから取得するように変更した. フレーム外を非表示にした 処理を分散して行い、Gitで管理するためにsqliteを使用した. デプロイ時はMySQLを使用するため、sqliteからMySQLへの移行を行った. データの数がノードが1万件,エッジが50万件あるため、データの移行には時間がかかる. ノードとエッジを減らしてデプロイするように工夫した. ノードはよく使われる(記事の数)が多い方から1000件, エッジはその組み合わせの記事の数が多い方から1万件 (これでも5分かかる) ウイングアーク1st株式会社賞! 2連続賞を獲得することができたから、まぁ満足!! 技育展中部ブロックにも出場するので、そこでの発表に向けて改善を行う. ※${TEAM_NAME}の読み方は"あんでふぁいんど"です. ユーザー認証(編集時) 編集機能の追加 検索をより楽に ダイアログの時間表示を修正 sqliteからMySqlへの移す APIの修正に合わせる 牧野先輩と計画を進めた. m先輩の圧により、工科展の前に技育CAMPvol9に出すことになった. tada 牧野先輩

2023年8月8日

梶研 [技育CAMP(技育展) & HackU]

梶研 [技育CAMP(技育展) & HackU]

3年セミナー:??% []端末状態推定 []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 [x]サイトの作成 []スライドの作成 []技育キャンプvol.7発表(8/5) []技育展中部ブロック発表(8/12) []HackUNagoya []案出し [x]役割分担 []アプリイメージの作成 []サイトの作成 []スライドの作成 []発表(8/27) 9/2技育キャンプアドバンス 10/7,8工科展 木構造はごちゃごちゃして面白くない ネットワーク構造に変更 ついでにUIも変更 ~~無駄に~~HTMLとCSSだけで描いた 技術系TikTok→LT会簡単にする蔵(仮) LT会をオンラインでも開催できるようにするアプリ アーカイブも残せる 1.スライド(pptx,pdf)をあらかじめアップロードしてもらう 1.発表はサイト上で行ってもらう(Googleスライドのイメージ) 発表中の場合、リアルタイムでスライドが遷移し、音が聞こえる アーカイブの場合、発表中と同様に見れる LT会特有の「発表資料、内容が一度きりになる」といった課題を解決できる ハッカソン等でも簡単にアーカイブを残し、後から見てもらうことができる 当日の発表で実演できる webRTCを使う P2Pで通信できるwebAPI スライドの遷移タイミングと音声のタイミングを合わせる pptxに埋め込まれた動画がライブラリでは再生されない pptxを解凍し動画を取り出した上で、xmlを解析し再生タイミングを取得すれば可能 発表者が動画を停止した場合、そのタイミングが分からない フォントが変わってしまい、レイアウトが崩れる もう暫くはいい...

2023年8月1日

梶研 [端末状態推定]

梶研 [端末状態推定]

3年セミナー:??% []端末状態推定 []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 [x]サイトの作成 []スライドの作成 []技育キャンプvol.7発表(8/5) []技育展中部ブロック発表(8/12) []HackUNagoya [x]案出し [x]役割分担 []アプリイメージの作成 []サイトの作成 []スライドの作成 []発表(8/27) 9/2技育キャンプアドバンス 10/7,8工科展 加速度と角速度,カルマンフィルターを使って端末の状態を推定する 歩く止まる曲がる歩くを繰り返す 加速度に変化がない時は、重力加速度の方向を使って端末状態を出す 変化がある時は、ジャイロセンサーの値を使って端末状態を変化させる normが9.5(m/s^2)以上10.1(m/s^2)以下の時は、動いていないと判断する 灰色が動いていない判定 歩いている途中でも9.8(m/s^2)前後になるが、重力加速度しか掛かっていないから、加速度センサーから推定しても良い? (カルマンフィルターの使い方がわからない) 知らない人からの無機質な指摘は怖い... が、とても為になる テスト週間は読書が捗ります. そろそろ新しい言語に触れ合いたい!!(RustorKotlin?) (藤崎彩織さんはSEKAINOOWARIのメンバーです.とても良い!!)

2023年7月25日

梶研 [磁気センサで方位角を測る & ハッカソンに向けて]

梶研 [磁気センサで方位角を測る & ハッカソンに向けて]

3年セミナー:??% [x]方位角を測る [x]xとyから求める []3次元的に求める []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 [x]アプリイメージの作成 []サイトの作成 []スライドの作成 []技育キャンプvol.7発表(8/5) []技育展中部ブロック発表(8/12) []HackUNagoya [x]案出し [x]役割分担 []アプリイメージの作成 []サイトの作成 []スライドの作成 []発表(8/26) 8/5技育キャンプハッカソン 8/12技育展 8/26OpenHackU 9/2技育キャンプアドバンス 10/7,8工科展 矢印は計測時にiOS標準のコンパスで北となった向き 1.z軸上向き,y軸が北 0度 1.y軸上向き,z軸が北 0度 1.y軸上向き,x軸が北 90度 1.z軸上向き,x軸が北 90度 前回同様、加速度から垂直下向きを出して回転させた (0~5sでは0度のはず) A05s B612s C1419s D2125s とすると、 AB間+175度 BC間+110度(250度) CD間+100度 となっている はじめの向きが北(0度)ではない. 標準のコンパスと差が出ているため、磁場強度の値を元に北(仮)を決める必要がありそう 近くの金属からの影響もあるかも 端末の向きは変えずに机に置く、離すを繰り返した時のデータ (水色部分には単語のツリーを表示する) 蛍の光を流して帰宅促進 メニューバー常駐型アプリ 簡単に蛍の光を流すことができます (指定時間に流せるようにしたい)

2023年7月18日

梶研 [磁気センサで方位角を測る]

梶研 [磁気センサで方位角を測る]

3年セミナー:undefined% [x]方位角を測る [x]xとyから求める []3次元的に求める []技育キャンプvol.7(技育展) [x]案出し [x]役割分担 []アプリイメージの作成 []サイトの作成 []スライドの作成 []発表 8/5技育キャンプハッカソン 8/12技育展 8/26OpenHackU 9/2技育キャンプアドバンス 10/7,8工科展 磁気センサの値からarccos(x/y)を用いて出す 画面(z軸正)を上向ける y軸正が北を向いた状態から左回転で360度回す x/yからarccosを用いて方位角を出す python df_mag["angle"]=df_mag.apply( lambdarownp.degrees(math.atan2(row["x"],row["y"])), axis=1 ) 180度~180度のためグラフが急激に変化しているが理想通り x/yで計算しているためスマホを立てると狂う =>重力加速度を元に補正する 1.y軸正が北 2.z軸正が北 3.x軸正が北 1.重力加速度を元に傾きを出す 2.端末の傾きを磁気センサに適用する 3.世界座標を基準とした磁気センサから方位角を出す 理想は~5sは0度、5s~は90度となるはず =>開始時から120度となってしまい、磁気センサの値がおかしい 他の端末でもおかしいため、屋外で計り直す必要がある 記事に視覚的な繋がりある蔵(仮) プログラミングを学んでいる人 自分の知らない知識は調べられない 木構造で知っている単語からリンクして見つける 知っている言葉から辿ることで知らない言葉を知ることができる Next.js(TypeScript) Nest.js(TypeScript) 記事の表示 ツリー構造の表示 閲覧ノードの移動 ノード・記事の作成 親子ノードの設定 ノードの検索 ノード・記事の削除 ログイン 記事の編集 親・子ノードの移動 画像のアップロード めっちゃ後ろだったけど、会場全体が見れて楽しかった 続百名城の1つ.初めての台場をみれてよかった 初めて見るマゼランペンギン.かわいい

2023年7月11日

梶研 [端末座標系を世界座標系に]

梶研 [端末座標系を世界座標系に]

3年セミナー:??% [x]端末座標系を世界座標系に [x]データをとる [x]重力に対する各軸の傾きを出す [x]2次元ベクトルを回転させる [x]3次元ベクトルを回転させる [x]端末座標系を世界座標系に変換する 8/5技育キャンプハッカソン 8/12技育展 8/26OpenHackU 9/2技育キャンプアドバンス 10/7,8工科展 スマホの画面(z軸正)が垂直上向の状態を世界座標の基準とする python roll=math.acos(x/gravity) pitch=math.acos(y/gravity) yaw=math.acos(z/gravity) x軸0.0(m/s^2) y軸0.0(m/s^2) z軸9.8(m/s^2) text x軸90.0度(0度) y軸90.0度(0度) z軸0.0度(0度) ()内は理想 x軸9.8(m/s^2) y軸0.0(m/s^2) z軸0.0(m/s^2) text x軸0.0度(0度) y軸90.0度(0度) z軸90.0度(0度) x軸0.0(m/s^2) y軸9.8(m/s^2) z軸0.0(m/s^2) text x軸90.0度(0度) y軸0.0度(0度) z軸90.0度(0度) この計算方法では重力と各軸の角度を出している text x軸(roll)90.0度 y軸(pitch)90.0度 z軸(yaw)0.0度 この状態を基準とすると text x軸(roll)90.0度 y軸(pitch)0.0度 z軸(yaw)90.0度 text x軸(roll)90.0度 y軸(pitch)0.0度 z軸(yaw)90.0度 動かしているときは誤差が生まれているが、 静止状態では理想的な値になっている 加速度では下方向しかとれないため、 垂直方向(今回はz軸)を軸とした回転量はわからないのでは? スマホを机に置いた状態で、周りをコンコン叩いた様子 右→下→左→上 なにか遊べそう (オンラインとんとん相撲的な)

2023年7月4日

梶研 [端末座標系を世界座標系に]

梶研 [端末座標系を世界座標系に]

3年セミナー:??% []端末座標系を世界座標系に [x]データをとる [x]重力に対する各軸の傾きを出す [x]2次元ベクトルを回転させる [x]3次元ベクトルを回転させる []端末座標系を世界座標系に変換する 8/5技育キャンプハッカソン 8/12技育展 8/26OpenHackU 9/2技育キャンプアドバンス 10/7,8工科展 元の加速度を端末の傾きだけ回転させる 理想はyは常に9.8,x,zは常に0になるはず =>roll,pitch,yawの回転のさせ方の問題? y(橙)が理想に近づいた 上下が合えばいいからroll,pitch,yaw全て使う必要はないかも? 計算したroll,pitch,yawが入れ替わってしまっている可能性がある 端末の状態はz軸正が上向き =>pitch以外が回転している 傾きが0degである緑はpitchかyaw (yawとして扱っていた) 端末の状態はy軸正が上向き =>傾きが0degである橙がrollかpitch (pitchとして扱っていた) 端末の状態はx軸正が上向き =>傾きが0degである青がrollかyaw (rollとして扱っていた) roll橙 yaw青 pitch緑 とした場合のグラフ 違う. いろいろ試してみた roll青 yaw橙 pitch緑 とした場合のグラフ 緑(z軸)が常にほぼ0(m/s^2)になった. y軸が9.8(m/s^2)になって欲しい いろいろ試してみた roll青 yaw緑 pitch橙 とした場合のグラフ 青(x軸)が常にほぼ0(m/s^2)になった. いろいろ試してみた roll青 yaw橙 pitch緑 とした場合のグラフ 9秒までは結構理想的な形になっている. ただし,9.8(m/s^2)はx軸になっている. (軸自体も間違っている可能性もある) 全パターン試したけど理想的な形のものにはならなかった. x,zが0にはなるがyが9.8にならない. =>回転のさせ方が間違っている可能性がある 回転させる順番によって結果変わってしまう. 3次元ベクトルを回転させる方法として正しくなさそう $$ R_x= begin{bmatrix} 1&0&0 0&costheta&sintheta 0&sintheta&costheta end{bmatrix} $$ $$ R_y= begin{bmatrix} costheta&0&sintheta 0&1&0 sintheta&0&costheta end{bmatrix} $$ $$ R_z= begin{bmatrix} costheta&sintheta&0 sintheta&costheta&0 0&0&1 end{bmatrix} $$ としたとき, 回転行列をかける順番によって結果が変わる $$ begin{bmatrix} x y z end{bmatrix} {times}R_x {times}R_y {times}R_z {neq} begin{bmatrix} x y z end{bmatrix} {times}R_y {times}R_x {times}R_z $$ [2,3,5]のベクトルを全て30deg回転させた結果 $$ begin{bmatrix} 2.82 4.25 3.45 end{bmatrix}= begin{bmatrix} 2 3 5 end{bmatrix} {times}R_x {times}R_y {times}R_z $$ $$ begin{bmatrix} 0.83 5.24 3.12 end{bmatrix}= begin{bmatrix} 2 3 5 end{bmatrix} {times}R_y {times}R_z {times}R_x $$ 夏休み忙しそうだし、せっかくだからやめようと思った. が,店長がいい人すぎてお願いを断れなかった. 810月まで休みを貰うことに

2023年6月27日

梶研 [3次元ベクトルの回転 & ハッカソン]

梶研 [3次元ベクトルの回転 & ハッカソン]

3年セミナー:??% []端末座標系を世界座標系に [x]データをとる [x]重力に対する各軸の傾きを出す [x]2次元ベクトルを回転させる [x]3次元ベクトルを回転させる []端末座標系を世界座標系に変換する [x]技育キャンプハッカソン [x]テーマ決め [x]開発練習 [x]7/9キックオフ [x]7/16発表 9/2OpenHackU発表 10/7,8工科展 [2,0,0]をx軸で90度回転回転→[2,0,0] 回転できてない? 計算式を(なんとなく)理解してみる $$ Vec_x^{prime}= begin{bmatrix} 1&0&0 0&costheta&sintheta 0&sintheta&costheta end{bmatrix} begin{bmatrix} x y z end{bmatrix} $$ x=(vec[0]1)+(vec[0]0)+(vec[0]0) y=(vec[1]0)+(vec[0]cosθ)+(vec[0]sinθ) z=(vec[2]0)+(vec[0]sinθ)+(vec[0]cosθ) xはそのままy,zは0だから変化しない =>x軸周りに90度ならばxは変化するわけがない(y,zを0以外に) [2,2,1]をx軸周りに90度 赤が元ベクトル 緑が回転後ベクトル 90度回転している =>正しく回転させれている 紙を破ることでPCを操作できるアプリ 付箋をクリックすると内容が変わる 紙を破ったと判断されるとログが追加される バックエンド Tauri AppleScript フロントエンド HTML/CSS VanillaJS フレームワーク TensorFlow.js 1.TensorFlow.jsで紙を破ったかを判別する. 2.JSからTauriのshellを呼び出す 3.shellでAppleScript(osascript)を実行する 4.osascriptのkeystrokeなどで実行 最優秀賞をととれた! (チーム名かいてくれなかった) オフラインということで、実際にやってうけるようなネタにした はじめのネタのような動画で惹きつけれた 色んな先輩や友達に聞いたことで、簡潔で分かりやすいスライドにできた 実際に行ったデモで面白さを伝えれた slackでダウンロードリンクを送ることで発表後に見てもらえた チーム名やお揃いのネタTシャツで覚えてもらいやすかった 最後に"あるがとうございました"と言わなく、締めが微妙だった ネタバレを防ぐためとは言え、メンターを頼らなさすぎた 計画的に進めすぎて当日にやることがなかった 宿を取らなかったこと

2023年6月19日

梶研 [端末座標を世界座標に]

梶研 [端末座標を世界座標に]

3年セミナー:??% []端末座標系を世界座標系に [x]データをとる [x]重力に対する各軸の傾きを出す [x]2次元ベクトルを回転させる []3次元ベクトルを回転させる []技育キャンプハッカソン [x]テーマ決め [x]開発練習 [x]7/9キックオフ []7/16発表 未定 1.各軸の加速度データから3次元ベクトルにする 2.回転行列を掛けて回転させる 3.3次元ベクトルから各軸の加速度にする pixel5(android) phyphox 加速度センサー 角速度センサー 1.z軸正が上(約4秒) 2.y軸正が上(約4秒) 3.x軸正が上(約4秒) 移動平均フィルター(前後40サンプル)をかけている 移動平均フィルター(前後40サンプル)をかけている 移動平均フィルターをかけたものを積分したもの python gravity=math.sqrt(x2+y2+z2) tilt_angle_x=math.degrees(math.acos(x/gravity)) tilt_angle_y=math.degrees(math.acos(y/gravity)) tilt_angle_z=math.degrees(math.acos(z/gravity)) 回転行列 外積の性質を利用 クォータニオン 回転行列はベクトルに対し始点を基準に回転させる =>始点は端末の中心とし、端末座標系を回転させれば世界座標系になるのでは (いきなり3次元は無理があった) θrad回転する場合 $$ Vec^{prime}= begin{bmatrix} costheta&sintheta sintheta&costheta end{bmatrix} begin{bmatrix} x y end{bmatrix} $$ 回転行列R python cos=np.cos(θ) sin=np.sin(θ) R=np.array( [[cos,sin],[sin,cos]] ) 元のベクトル python vec=[2,0] 回転後のベクトル python vec_dash=np.dot(R,vec) 青を120deg回転させた θrad回転する場合 $$ Vec_x^{prime}= begin{bmatrix} 1&0&0 0&costheta&sintheta 0&sintheta&costheta end{bmatrix} begin{bmatrix} x y z end{bmatrix} $$ $$ Vec_y^{prime}= begin{bmatrix} costheta&0&sintheta 0&1&0 sintheta&0&costheta end{bmatrix} begin{bmatrix} x y z end{bmatrix} $$ $$ Vec_z^{prime}= begin{bmatrix} costheta&sintheta&0 sintheta&costheta&0 0&0&1 end{bmatrix} begin{bmatrix} x y z end{bmatrix} $$ 名刺作った!!

2023年6月13日

梶研 [エレベーターと歩きを判別する(続き)]

梶研 [エレベーターと歩きを判別する(続き)]

3年セミナー:??% [x]エレベーターと歩きを判別する [x]データをとる [x]歩いているかを判別する [x]上り下りしているかを判別する [x]エレベーターと歩きを判別する [x]正解データと比較 [x]追加でデータとる []技育キャンプハッカソン [x]テーマ決め [x]開発練習 []7/9キックオフ []7/16本番 未定 1秒ごとに区切り,回帰直線を求める. 参考 傾きの絶対値が0.012以上の場合は上り下りしているとみなす(青色) 0.012未満の場合は止まっているとみなす(黄色) 移動平均フィルターではなくメディアンフィルターを使用した. 実際とのズレが縮まった 灰元データ 青移動平均フィルター(前後120サンプル) 黒メディアンフィルター(前後120+1サンプル) 青歩いている上り下りしている 黄止まっている 赤階段 青エレベーター 黄歩行 緑待機 気圧と正解データを見比べると,エレベータを降りた後も 上り下りしている判定になっている =>傾いているから,プログラムではなくデータが悪い(?) =>エレベータを降りた時など,一度止まるとよい 青歩いている上り下りしている 黄止まっている 赤階段 青エレベーター 黄歩行 緑待機 青歩いている上り下りしている 黄止まっている 赤階段 青エレベーター 黄歩行 緑待機 青歩いている上り下りしている 黄止まっている 赤階段 青エレベーター 黄歩行 緑待機 会員なれんかった...

2023年6月7日

梶研 [エレベーターと歩きを判別する]

梶研 [エレベーターと歩きを判別する]

3年セミナー:??% []エレベーターと歩きを判別する [x]データをとる [x]歩いているかを判別する [x]上り下りしているかを判別する [x]エレベーターと歩きを判別する [x]正解データと比較 []改善 []技育キャンプハッカソン []7/9キックオフ []7/16本番 1号館5階7階 腰にポーチをつける Pixel5(Android) Pyphox 気圧センサー 加速度センサー 角速度センサー 重力加速度を除いている >df["x"]=df["x"]df["x"].mean() >df["y"]=df["y"]df["y"].mean() >df["z"]=df["z"]df["z"].mean() 1秒ごとに区切り、それぞれの分散を計算する 分散が0.1以上の場合は歩いているとみなす(青色) 0.1未満の場合は止まっているとみなす(黄色) 青元のデータ 黒移動平均フィルター(前後20サンプル) 1秒ごとに区切り、現在と1秒前の平均の差を計算する 差が0.015以上の場合は上り下りしているとみなす(青色) 0.015未満の場合は止まっているとみなす(黄色) それぞれの色分けしたグラフより、 気圧が変化している&動いている =>(赤)階段 気圧が変化している&動いない =>(黄)エレベーター 気圧が変化してない&動いている =>(青)徒歩 気圧が変化してない&動いてない =>(緑)停止 >赤階段を上る >黄平地を歩く >青エレベーターで移動 >緑待機 できていそうに見えるが正解が分からない =>正解データを動画で残す >赤階段を上る >青平地を歩く >黄エレベーターで移動 >緑待機 >赤歩いている >青止まっている >赤上り下りしている >黄上り下りしていない 動いているかは大体できているが、上り下りしているかは微妙 Tauriめちゃいい

2023年5月30日

梶研 [エレベーターと歩きの判別]

梶研 [エレベーターと歩きの判別]

3年セミナー:??% [x]速度を変えてUnityでアニメーション [x]データをとる [x]アニメーションをつける [x]エレベーターと歩きを判別する [x]データをとる [x]グラフ化 [x]フーリエ変換 []判別する 6月17日技育キャンプハッカソン (実際の4倍速になっている) 速度差を再現したけど分からづらかった 1号館5階7階 腰にポーチをつける Pixel5(Android) Pyphox 気圧センサー 加速度センサー 角速度センサー 56階歩く(1段ずつ) 67階走る(2段ずつ) 速度に応じて歩幅も変わっている =>加速度を元に歩幅を計算する >step=0.1norm0.5 いい感じ 進行方向を計算から求める c# UnityEngine.Vector3current=positions[currentIndex];//現在の座標 UnityEngine.Vector3next=positions[currentIndex+1];//次の座標 UnityEngine.Vector3vector=nextcurrent; //進行方向 floatangleY=MathF.Atan2(vector.x,vector.z)180/Mathf.PI; (移動ツールの矢印を表示している) いずれオブジェクト自体を変形させて進行方向をわかりやすくしたい 1号館5階7階 腰にポーチをつける Pixel5(Android) Pyphox 気圧センサー (加速度センサー) (角速度センサー) 前後40サンプル(0.1s)で移動平均フィルターをかけた フーリエ変換する >異なる波数の波がどれくらい含んでいるかがわかる =>徒歩の場合は歩きの振動の周波数が現れる? 0Hzで盛り上がっているが他はほぼ0 原因 フーリエ変換のやり方の問題 =>間違ってはなさそう データの問題 =>別のデータで試してみる (ハッカソンに向けて) =>プログラムは合ってた 0Hzが大きすぎて相対的に小さくなっている? 範囲0~800000=>0~10 (気圧グラフを平滑化>フーリエ変換>拡大) 前後40サンプル(0.1s)で移動平均フィルターをかけた 特徴的だが、データが1つずつでは確定できない =>より多くのデータで比較する Hugoのテンプレートを作った 紙でスライドを操作したい 紙を破る音、くしゃくしゃにする音などでプレゼンのスライドを操作したい Tauri Rust/JavaScript React.js JavaScript HTML/CSS 周波数から紙かどうか取れないか =>(僕らには)厳しい モデルの作成はを使う 紙を破くと1.00に近づく

2023年5月23日

梶研 [三次元の歩行軌跡]

梶研 [三次元の歩行軌跡]

3年セミナー:??% [x]Unityでアニメーション []直角,並行から歩行軌跡を綺麗に ファイル名とクラス名を一致させなければならない (2時間無駄にした...) >this.transform.position=newVector3(x,y,z); 単純な移動はこれだけ 使用したデータはのもの cs voidStart(){ ... while(!reader.EndOfStream){ string[]line=reader.ReadLine().Split(','); floatx=float.Parse(line[1]); floaty=float.Parse(line[2]); floatz=float.Parse(line[3]); positions.Add(newVector3(x,z,y)); } ... } voidUpdate(){ //アニメーションを実行する timer+=Time.deltaTime4; if(timer>=1f){ Debug.Log(timer); currentIndex++; if(currentIndex>=positions.Count)currentIndex=0; transform.position=positions[currentIndex]; timer=0; } } GIFアニメみたい =>動作をなめらかにした 1歩進むごとの時間間隔が一定となっている =>測定時に合わせたい 実際の4倍速にしてある 次に移るまでの間隔を前の位置からの時間差に変更 cs voidStart(){ ... while(!reader.EndOfStream){ string[]line=reader.ReadLine().Split(','); floatx=float.Parse(line[1]); floaty=float.Parse(line[2]); floatz=float.Parse(line[3]); +positions.Add(newVector3(x,z,y)); +times.Add(float.Parse(line[0])); } ... } voidUpdate(){ //アニメーションを実行する timer+=Time.deltaTime4; +floatdiff_time; +if(currentIndex==0)diff_time=0; +elsediff_time=times[currentIndex]times[currentIndex1]; +if(timer>=diff_time){ currentIndex++; if(currentIndex>=positions.Count)currentIndex=0; transform.position=positions[currentIndex]; timer=0; } } 自分で実装するのは大変だからアセットDG.Tweeningを使用した cs +usingDG.Tweening; voidUpdate(){ //アニメーションを実行する timer+=Time.deltaTime4; floatdiff_time; if(currentIndex==0)diff_time=0; elsediff_time=times[currentIndex]times[currentIndex1]; if(timer>=diff_time){ currentIndex++; if(currentIndex>=positions.Count)currentIndex=0; transform.position=positions[currentIndex]; +this.transform.DOMove(positions[currentIndex],diff_time); timer=0; } } 速度差がわかりづらい =>速さを変えたデータでもやるべきだった 自分たちで技術力を上げていきたい! css楽しい

2023年5月16日

梶研 [3次元歩行軌跡]

梶研 [3次元歩行軌跡]

3年セミナー:??% [x]3次元の歩行軌跡 [x]計測 [x]二次元グラフ化 [x]三次元グラフ化(Python) [x]三次元グラフ化(Unity) 6月技育CAMPハッカソンに参加する 4号館別館の1階(階段前)から3階(トイレ前)へ Xperia(Android) Phyphox 加速度センサー 角速度センサー 気圧センサー 角度は角速度を積分して求めた 前後40サンプルの移動平均フィルターをかけてある 加速度センサー±0.1s(400Hz) 角速度センサー±0.1s(400Hz) 気圧センサー±2.0s(20Hz) 高さ10.5m/s^2以上 間隔0.3s以上(120サンプル) 1hPa下がると10m上があるとして計算 階段を登っている様子はわかるが、上下にぶれている =>もっと平滑化すべき? 前後160サンプルで平滑化 ぽくなったが、やりすぎた 移動平均フィルター以外が必要? Pythonで座標をcsvに書き出して、c 少数16桁ある場合はSystem.Globalization.NumberStyles.Floatが必要となる c# x=float.Parse(line[0],System.Globalization.NumberStyles.Float); 動かせるようになった 3次元での誤差も出したい オンラインが良かったけど締め切ってた... =>福岡行こう!! (初心者歓迎されてなくね...)

2023年5月9日

梶研 [二乗平均誤差を出す]

梶研 [二乗平均誤差を出す]

3年セミナー:??% []二乗平均誤差(RMSE)を出す [x]計測 [x]グラフ化 [x]二乗平均誤差を出す []誤差を減らす 未定 ハッカソンに参加したい 5歩+90度左+8歩(大きく)+(3歩) 歩幅に合わせて合わせて目印をつけ、歩く 単位はcm 1歩を赤丸でプロット 角速度を積分して角度を出した 高さ11m/s^2以上 間隔0.3s以上(30サンプル) 顕著度(?)の閾値3.5以上 >signal.find_peaks(df_acc['low_norm'],height=11,distance=30,prominence=3.5) 90度左向いたはずが明らかに無い (先週の記録は約1.75rad) 角速度は先週の約10倍 角度を0.1してみる ぽくなったが、なぜ0.1する必要があるかは分からない =>反対にいくつ掛ければ90度になるかを考えてみる ぐねぐねしてるけど理想はこんな感じ 0.26って何者... >1/0.26=3.84 3.14? =>弧度法と度数法の云々かと思ったけど違った 積分&値が大きくなる=>サンプリング周波数? 計測時間13.312s サンプル数5445 >13.312/5445=0.002444811754 0.260.01に似ている... >5445/13.312=409.02944711538 サンプリング周波数約400Hz =>iPhoneの100Hzのまま計算していた だいたい理想のグラフになった 大きくずれているがひとまず置いておく 各点同士の差の合計を点の数で割る >√((x1x2)^2+(y1y2)^2)/n (TeX書けるようになりたいな...) RMSE1.8939717262144389 =>平均で約1.89mの誤差 大きすぎる 加速度(ノルム)をx軸,実際の歩幅をy軸として散布図に描画 全然きれいにならない(理想は一直線) =>あらかじめ付けた印に合わせて歩幅を変えたから? ひとまず無理やり一次関数にする >step=0.1norm0.5 この式を使って軌跡を描く まだ大きくずれている RMSE0.997 まだ大きくずれている 軌跡はぽいが、歩幅が明らかにおかしい RMSE0.788 >step=0.269norm0.3.043 それでも0.788は大きすぎる... =>データの取り方の問題? 今回 印を付ける→印に合わせて歩く 変更 普通に歩く→動画から歩幅を割り出す シス研にてピザとかホットケーキとかたませんとか食べたりetc. 4月から飛ばしすぎた... GCFでLINEBOT作ってあそんだ

2023年5月2日

梶研 [歩行軌跡の可視化]

梶研 [歩行軌跡の可視化]

3年セミナー:??% [x]歩行軌跡の可視化 [x]データを取得する [x]加速度,角速度をグラフ化 [x]歩行軌跡を表示する [x]加速度の大きさに合わせて歩幅を変えてみる 未定 ハッカソンに参加したい( iPhone12 phyphox 前回使用したphyphoxは2つ以上のデータの取得ができなさそうだった (やり方あった) charGPTに聞きながら作った 結局使わなかった 腰にポーチを付けてスマホを入れた 画面(z軸)を正面に、ジャイロのx軸左回りを正 10歩+左90度+5歩 Python3.10.10 pandas matplotlib numpy signal itertools 1歩を赤丸でプロット 角速度を積分して角度を出した 高さ11m/s^2以上 間隔0.3s以上(30サンプル) 0歩の時点を(0,0)とする 1歩70cmとする 1歩進んだ時の角度(α)を出す α度の方向に70cm進んだ位置にプロット 形は想定通りだが、傾いているのが気になる →1歩踏み出した時点では腰が斜めになるから? 5歩(歩く)+5歩(早歩き)+6歩(小走り) 10m/s^260cm 25m/s^2100cm とし、一次関数として計算 >step=norm0.027+0.33 分かりづらい... >0.648 >0.658 >0.683 >0.689 >0.709 >0.707 >0.774 >0.882 >0.875 >0.906 >0.736 >0.904 >0.929 >0.983 >0.925 >0.991 >0.816 変化はしている (少数第4位以下切り捨て) 5歩軽く+7歩大きく 大袈裟にしてみた。 >step=norm0.032+0.3 なんかすごいフェスに行くことになった

2023年4月25日

梶研 [センシングはじめました]

梶研 [センシングはじめました]

3年セミナー:??% [x]Androidアプリ開発お試し [x]AndroidStdioの設定 [x]加速度センサーを見るアプリをつくる [x]csv出力&PCに移す 加速度から距離を出してみる [x]加速度センサーの値を取る(直線運動) [x]Pythonでグラフ化する [x]加速度グラフを距離グラフ 歩数推定 [x]加速度センサーの値を取る(歩行) [x]グラフ化&フィルターをかける []歩数を取得する 未定(歩行軌跡の可視化をしてみたい) バージョンに合わせたコードに修正 TextViewを行ごとに分割した スマホをx軸正の方向に30cm動かした 環境 端末 iPhone12 使用アプリ phyphox バージョン 3.10.10 使用ライブラリ pandas matplotlib numpy 加速度[m/s^2]を微分※すると速度[m/s]になる 速度[m/s]を微分※すると距離[m]になる ※間違い 速度,距離グラフの形がおかしい →微分と積分を逆に認識していた (気付くのに3時間掛かった...) 形はそれっぽくなった 値が明らかに大きすぎる →サンプリング周波数を考慮していなかった 面積分は1本1本の面積を足していくもの 面積ではなく長さ(図で言う縦)を足していた →全ての値にx0.01(100Hz)する まっすぐ5歩 (スマホのz軸正が上向き、y軸正が左向きになるように腰の位置で手に持つ) >(N0+N1+N2+N3+N4)/5 (N0が現在の値) サンプリング周波数100Hzなので、5つの平均ではあまり意味がない? >(N0+N1+N2+...+N9)/10 だいぶ滑らかになったが、1歩に対し頂点が複数ある >(N0+N1+N2+...+N19)/20 1歩に対し1頂点になった。 (平滑化フィルターだけでいいのだろうか) 過去との平均の為、波が大きく後ろにずれた。 より良いやり方があるらしい → >rolling_mean=data.rolling(window=10).mean() >normそのままのデータ >自作関数さっきまでのやり方 >pandas.rolling()良さそうなやり方 pandas.rolling()を上手く使ったほうが良い 赤丸が6つ →6歩? 正しくは5歩 5歩ののちに立ち止まる時の足を揃える動作も含まれてしまった データを取り直す なし

2023年4月18日

1
12
2