SatooRu's Profile

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

全ての記事

梶研 [mocopi センシング の環境を整える]

梶研 [mocopi センシング の環境を整える]

3年セミナー:??% []mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる []複数人の動作を可視化できるアプリを作る []研究をしたい []テーマを考える []研究する []論文を書く []発表する 1月~研究 12月WiNF2024 Unity bvhを再生するにはblenderでfbx形式に処理する必要がある UDPでデータを送信すれば再生できる BVHsender(SONY公式) BVHを再生できる 複数同時に再生することができない そもそも再生目的でない BVHファイルから直接アニメーションを再生できるようにする ただし複数ファイルを同時に再生できるようにすること 体全体と上半身(体,頭,手など)の動きは再現できた。 下半身の動きがそのままでは荒ぶってしまう →bvhとvrm(モデル)のボーンの違い? 回転量の単位が違う bvh形式度数法(deg) gLTF形式弧度法(rad) 回転量が一部異なる ex)root(腰)のy軸の回転量はbvh+180度  上腕のz軸の回転量はbvh 下半身の動作も再現できるようにする 複数ファイルあるときの進行時間を揃える bvhのフレーム数が異なる場合、2週目からずれてしまう 初期位置・回転量を変更できるようにする 他のやり方も探す UnrealEngineではbvh形式を再生できるかも? なし mocopiを持って行ったが、さすがに付けれる環境ではなかった。 スマホでセンシングしたが、保存に失敗した。 研究のテーマ決めの参考にしたかった... 今週もライブに行くので再戦する

2023年11月27日

梶研 [mocopi センシング]

梶研 [mocopi センシング]

3年セミナー:??% []mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる []動作判別 []研究をしたい []テーマを考える []研究する []論文を書く []発表する 1月~研究 12月WiNF2024 なれた! 第一回戦 第二回戦 お互いスタート地点に立って開始した 後半に揺れが大きくなっているのがわかる それぞれのターンで姿勢が変わっているのがわかる どれだけ動いているかとれそう グラフからは状況がわからない 二人の絡みなど (編集で横並びにしています) 簡単に動作を確認したい 複数人を同時に表示したい リアルタイムで表示と保存をしたい 今後のために動作を確認できるものを制作する 目標がないため、mocopiで目指すところを考えたい なし 「スマホアプリも触れる」から「web一筋」に路線変更 デザインは旧バージョンと同じ pandacss(CSSinJS)を触れた Next14(AppRouter)とStaticExport(静的レンダリング)を使った コンポーネントの分け方を意識した 汎用性が高くなるようにした テストが書きやすい構造にした AppRouterに合わせたアーキテクチャにした ESLintとPrettierで統一的な書き方になるようにした issuesを活用してブランチを使い分けるようにした etc. さまざまなcssライブラリを使う アーキテクチャを知る 良いコンポーネントの書き方を学ぶ 良いcssの書き方を学ぶ テストコードを書く バックエンドをもっと勉強する クラウド(AWS・GCP)に慣れる これを踏まえた上で、何か大きめのプロダクトを制作し継続的な開発をしたい

2023年11月21日

梶研 [mocopi センシング]

梶研 [mocopi センシング]

[x]"地図は意外とウソつき"を読む []情報処理学会ジュニア会員になる []mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る []動作判別 [x]csvに書き出せるアプリを作る []複数人の絡みを取ってみる []研究をしたい []テーマを考える []研究する []論文を書く []発表する 1月~研究 12月WiNF2024 ~~Twitter~~Xで気になっていたものが梶研にあったから読んだ。 前に情報処理学会で"学生会員"で申し込んで、放置してたら金曜日に請求がきた。 ジュニア会員に変更したいが分からない これから簡単にmocopiの動作をとれるようにする 骨格情報をbvhファイルから取得するように変更した 骨格情報を変更できるようにした bvhファイルをパースしてDataframeとして扱えるようにした 初期位置/回転量を変更できるようにした モーションデータを変更できるようにした csvに書き出せるようにした Dataframeからbvhファイルに書き出せるようにした shell $pipinstallmcp_persor shell frommcp_persorimportBVHparser python bvhp=BVHparser('bvh/mocopimove.bvh') motion_df=bvhp.get_motion_df() 関節名やファイル構造を知っている前提で、パースしていたが、 全ての情報をBVHファイルから取得するようにした python offset=bvhp.get_joint_offset('r_hand') offset[0]+=10 bvhp.set_joint_offset('r_hand',offset) 人の体に合わせて変更でき、より正確な動作になる python relative_motion_df=bvhp.get_joint_motion_df(joint_name,mode='relative') python relative_motion_df=bvhp.get_joint_motion_df(joint_name,mode='absolute') python init_pos=bvhp.get_initial_position() init_rot=bvhp.get_initial_rotation() bvhp.set_initial_position([0,0,0]) bvhp.set_initial_rotation([0,0,0]) 動いてからデータの取得を開始しても補正できる。 複数人での絡みをとった場合に補正できる。 python relative_motion_df=bvhp.get_joint_motion_df(joint_name,mode='relative') relative_motion_df['Xposition']+=10 bvhp.set_joint_motion_df(joint_name,relative_motion_df,mode='relative') python bvhp.to_csv('mocopimove.csv') dataframeを扱っているから要らないけど、csvに書き出せるようにした python bvhp.to_bvh('mocopimove.bvh') 調整等をしたあとに、bvhで書き出して確認をしたりできる キーバインドが気に入ってVScodeのキーバインドをEmacs風にした 最終的に更にVScodeに依存することになった 思ったより面白くなかった ! ハッカソンに出る友達にAPIの作り方を教えてたら作りたくなった。 コントリビューションが前日以上であれば進化し、前日未満であれば退化する 供養のつもりでポストしたら、思いの外好評だった。 ~~ハッカソンのネタ潰してごめんなさい~~

2023年11月14日

梶研 [mocopi センシング]

梶研 [mocopi センシング]

[]mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 []bvhをパースするパッケージを作る []動作判別 []csvに書き出せるアプリを作る []研究をしたい []テーマを考える []研究する []論文を書く []発表する 1月~研究 12月WiNF2024 4号館別館の3階から2階へ下りて、上る 階段を上ったのに気圧にあまり変化がない →ポケットに入れていたから? 撮り直す 3回+1回+1回 rootの位置(y)は、地面を基準としている 階段を上り下りすると、基準が変わり補正が掛かる 手足がついた瞬間に基準が変わり、補正されるため、 ジャンプ中や、一歩を踏み出している時は基準が変わらない 平面空間であれば取れるが、上下する階段やエレベーター等の判別は難しそう 何やればいいか迷走してます 現状、bvhをパースするパッケージはないため、自作する 各関節は相対的な位置・角度で表されているため扱いづらい →簡単に絶対的な位置・角度を取得できるようにする 2行で取得できるようになった python bvhp=BVHparser('sample/jump.bvh') absolute_motion_df=bvhp.getAbsoluteMotionDataframe('r_toes') 関節の位置関係をベタ書きではなく、ファイルから取得できるようにする モーションのチャンネルをファイルから取得できるようにする 初期の位置を変更できるようにする 初期の骨格同士のオフセットをファイルから取得できるようにする 初期の骨格のオフセットを変更できるようにする 太もも用拡張バンドが無償提供されるらしい https//www.sony.jp/mocopi/info/20231106.html 夢が詰まってる togawaさんから滞在ウォッチについて聞いた。 やりたいところがほぼ終わってた 物理ビーコンのセキュリティ(uuidが変わらない)というところは面白そう これは3年生の研究? 使い道が思いつかない ドラゴンナイト中の動き 撮影禁止の代わりにその時の自分の様子を残す mocopiで全身をとる 詳細に残せる 手軽さがない スマホで何種類か推定 大まかにしか推定できない 手軽 その場の盛り上がりをみんなで共有 その場のひとたちで何か マップ上でぴょんぴょんしてる様子をみる 主催者が盛り上がりを見る? ペンライトを制御する感じで何か esaをCMSとして投稿・編集できるようにした パフォーマンスを100にしたい パソコンが最近うめきをあげるようになって、軽めのエディターに乗り換えたい 起動がはやい 多分Rust(Tauri)製のエディター デフォルトではvimバインド 拡張機能は無い 起動がとてもはやい 完全にRust製のエディター デフォルトではvimバインド 拡張機能がある(Rust製)

2023年11月6日

梶研 [mocopi センシング]

梶研 [mocopi センシング]

[]端末姿勢推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 [x]端末の姿勢を推定 [x]加速度を世界座標に変換 [x]Unityで可視化 []mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 []動作判別 []csvに書き出せるアプリを作る []Androidアプリ開発 1月~研究 12月WiNF2024 端末の姿勢を可視化 各軸の回転とy軸を変動させた csvに書き出せるアプリを作っていたが、時間がかかりそうなので、 bvhで保存したファイルからの動作推定を先にした モードをモーションの保存に切り替えて、bvhファイルとして保存する. >mocopiアプリで記録したモーションデータ(BVH形式)を、ローカルネットワーク上にUDP送信することができるアプリケーションです。 WireSharkで見てみると、UDPで送信されていることがわかる あまり使い道はなさそう HIERARCHYは、モデルの構造を定義している MOTIONは、実際の動作が書かれている bvh HIERARCHY ROOTroot { OFFSET093.29290 CHANNELS6XpositionYpositionZpositionZrotationXrotationYrotation JOINTtorso_1 { OFFSET05.078671.15138 CHANNELS6XpositionYpositionZpositionZrotationXrotationYrotation JOINTtorso_2 { OFFSET05.616611.07143 CHANNELS6XpositionYpositionZpositionZrotationXrotationYrotation JOINTtorso_3 { ... } } MOTION Frames3062 FrameTime0.016667 093.2929000005.078671.1513800005.616611.071430001.02604e175.989780.115010001.10457e176.505830.4435230001.97295e177.605481.505930002.53307e179.497370.9144920002.90401e1710.55131.576910001.29193e174.786440.7153390001.8116e174.821090.4217910002.00958e174.830410.7650620001.232997.607317.5337400012.95473.24953.2687200029.20810.05980810.13703900024.2340.04962190.1137010001.232997.607297.5336500012.95473.24953.2687200029.20810.05980810.13703900024.2340.04962180.1137020009.236734.205562.03270000.85235338.77210.6551870002.3262240.40176.048750000.7790969.884412.49590009.236734.205562.03270000.85235338.77210.6551870002.3262240.40176.048750000.7790969.884412.4959000 44.719293.5259214.1910.1243291.31566169.8405.078671.151380.1588492.68890.51708505.616611.071430.34230.928090.3943351.02604e175.989780.115010.4075631.162440.2684271.10457e176.505830.4435230.4795234.328260.253581.97295e177.605481.505930.4758585.673730.3563512.53307e179.497370.9144920.4575176.574550.4872122.90401e1710.55131.576910.01675790.08547280.004180961.29193e174.786440.7153390.4917593.818840.7332531.8116e174.821090.4217910.2109342.3270.4819412.00958e174.830410.7650620.5719760.1459130.01297281.232997.607317.533741.418720.9764430.14433512.95473.24953.2687260.276441.946519.474129.20810.05980810.13703911.859613.968100.00524.2340.04962190.1137015.6247955.68758.463861.232997.607297.533652.742672.255951.0646112.95473.24953.2687270.656817.73277.3217529.20810.05980810.13703911.394415.7467108.97924.2340.04962180.1137022.2410527.17455.174829.236734.205562.03271.2541.5443218.59890.85235338.77210.6551870.2649130.9890120.01497662.3262240.40176.048750.6631330.25618415.34920.7790969.884412.49592.87313e168.0567e162.29556e179.236734.205562.03272.611285.9666924.08230.85235338.77210.6551871.12374.196040.03210322.3262240.40176.048752.694460.018351815.61090.7790969.884412.49596.56914e165.57189e161.27433e14 44.68393.5057214.2210.1284641.26792169.84805.078671.151380.168032.954830.51287805.616611.071430.3521751.10310.3875461.02604e175.989780.115010.4160091.132460.2613181.10457e176.505830.4435230.4856224.522490.2451641.97295e177.605481.505930.4836516.009810.3508092.53307e179.497370.9144920.4681496.980040.4886322.90401e1710.55131.576910.01715450.07891890.004283911.29193e174.786440.7153390.4911694.333620.6899981.8116e174.821090.4217910.2452642.34070.4649872.00958e174.830410.7650620.6129970.008983310.0532461.232997.607317.533741.587251.305280.32329612.95473.24953.2687260.044941.803120.082829.20810.05980810.13703911.852314.0092100.20924.2340.04962190.1137015.4146755.82288.198811.232997.607297.533652.938652.57930.89450512.95473.24953.2687270.624117.69227.8201229.20810.05980810.13703911.379515.7888109.19724.2340.04962180.1137022.1411427.09354.988649.236734.205562.03271.235761.5014918.67310.85235338.77210.6551870.2650780.989630.01498462.3262240.40176.048750.5987860.32772415.34520.7790969.884412.49591.08639e177.97031e161.43165e179.236734.205562.03272.615095.9372924.08240.85235338.77210.6551871.130514.221420.03204672.3262240.40176.048752.658520.037434715.6050.7790969.884412.49595.96354e165.59082e161.27471e14 ... 各部位はROOT(root)を基準に、JOINTで定義されている MOTIONは、1行に1フレームのデータが書かれている >rootの位置(x,y,z)rootの回転(x,y,z)torso_1の位置(x,y,z)torso_1の回転(x,y,z)torso_2の位置(x,y,z)... ROOT(HIPS)の位置と回転 ほぼ一次関数になっていて明らかにおかしい y軸の目盛り間隔が指定通りにならない y軸の範囲が指定通りにならない csvに書き出してスプレッドシートでグラフ化 データは問題なさそう 型変換が正しくなく、数字ではなくオブジェクトになっていた root(腰)の位置と回転 r_up_leg(右足付け根)の位置と回転 l_shoulder(左肩)の位置と回転 ふらついているのが気になるが、あらかた正しそう →二乗平均誤差(RMSE)を出したい 半年ぶりに外山さんと林先輩とシス研の先輩で寿司大食い対決をした 23皿+デザート食べた。 外山さんに1皿負けた 4人で10,995円 焼きパインがめちゃくちゃ美味しかった 食べすぎて引かれた

2023年10月31日

梶研 [mocopi センシング]

梶研 [mocopi センシング]

3年セミナー:??% []mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる []誤差を計測 []csvに書き出せるデスクトップアプリを作る []動作判別 [](mocopiから直接データを取りたい) []Androidアプリ開発 23年 12月研究テーマを決める 24年 1月~研究 12月WiNF 参考 1.mocopi(本体)[Bluetooth]→mocopi(アプリ) 2.mocopi(アプリ)[UDP]→Python(mcpreciever) 3.Python(mcpreciever)[VMC]→Unity 実際に30m歩く 歩きつつmocopi(アプリ)内のグリッドを数える 30m歩いたところ、バーチャルでは29m歩いたことになった 外で100mくらい歩いて誤差を計測したい 既存のアプリ等の問題点 扱いづらい PC側が受信(Python)と表示(Unity)で分かれている csv書き出し未対応 Pythonに追加すれば良いが、扱いづらい 移動距離等が分かりづらい グリッドを数える必要がある Tauri Rust(受信側) Next.js(表示側) ブラウザ上で動くようにした 三角関数で円形に動くアニメーションを作った →UDPで受信したデータを元に動かすようにする 破壊的変更により今までの情報がほとんど使えず、 公式ドキュメントを読みながら制作した NextRustでUDPを取得する 激しい動きをすると狂う 精度が完璧ではない 手先の位置 肘・膝の曲げ具合 座った時の体の傾き 足を上に上げたとき不安定 長距離歩いた時の誤差 もっとしっかり取りたい100mとか グラウンドぐるぐる歩いた時の誤差をとりたい 走たときはどうなるか 素振り,着席時の動作判別 2人以上の絡みをとりたい 馬跳 組体操 HIPを基準としたセンサとして使える? 土日にシス研で集まってみた

2023年10月23日

梶研 [Unity で可視化]

梶研 [Unity で可視化]

3年セミナー:??% []端末姿勢推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 [x]端末の姿勢を推定 [x]加速度を世界座標に変換 [x]Unityで可視化 []カルマンフィルタを用いた推定 ~12月Androidアプリ開発 Unityでスマホの動きを可視化した Androidアプリ mocopi スマホと組み合わせてより詳細な動きをとりたい mocopi同士の位置 座っている状態の精度 気圧 技育CAMPvol.7 技育展予選 技育CAMPvol.9 HackU 技育CAMPアドバンス 技育展決勝 工科展 新たな誘惑から逃げ切れた 11月中ばでコメダ辞めます 最近の疲れを癒されてきた

2023年10月17日

mcp-persor

mcp-persor

研究室でmocopiから取得したBVHファイルを扱う必要がありました。 そこでmocopiのBVHファイルを簡単にDataframeとして扱えるパッケージを作りました Python Pandas Numpy

2023年10月13日

梶研 [工科展]

梶研 [工科展]

3年セミナー:??% []端末姿勢推定 [x]データを収集 [x]グラフを作成 [x]静止状態の判別 [x]端末の姿勢を推定 [x]加速度を世界座標に変換 []Unityで可視化 []カルマンフィルタを用いた推定 9月中旬まで端末姿勢推定(加速度,角速度) 10月中端末姿勢推定(カルマンフィルタ) 11月中Kotlin(とRust)の勉強「いつでもセンシングアプリ」 大学内の施設や教室の混雑を知れるアプリ フロント Next.js バック Go Gin Gorm ipv4 smtp 優秀賞をいただいた ネットワークつよつよな方が来たりしたが、 全ての質問に対して回答とスライドを用意しており、 完璧に対応できたのが良かった. チームが崩壊しており、牧野先輩・林先輩に助けを求めてなんとか完成させており、 自分たちでできなかったという点ではPMとして良くなかった。 牧野先輩に買わせた韓国のサイダーがめっちゃ売れた 売れ残りのたこ焼きを食べながらタコパした

2023年10月10日

kusa evolution

kusa evolution

コントリビューション数に応じて猿人が進化します。 前日よりも多ければ進化、少なければ退化します。 ただし、コントリビューションが0の場合は問答無用で猿人に戻ってしまいます。 express render.com

2023年10月10日

[優秀賞]CampusClowdMonitor

[優秀賞]CampusClowdMonitor

大学祭中に行われた工科展に向けてWiFiを用いた混雑推定アプリCampusClowdMonitorを制作しました。大学のWiFiに接続された端末数から混雑を推定してくれるwebアプリケーションです Next.js mantine sass chart.js

2023年10月8日

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

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

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日

奈良旅行

奈良旅行

東大寺 奈良公園 鹿さんとふれあいに東大寺に行ってきた. 鹿さん餌やりセンシングをしていると頭突きを喰らったり散々だった. CATというスマホを持っていき、 サーモグラフィーでも写真を撮ってみた. 2日前に言い出した奈良旅行でもセンシングしながら楽しめた. 反省はmocopiを持っていかなったこと

2023年9月17日

勤怠管理アプリ(72時間働けますか?)

勤怠管理アプリ(72時間働けますか?)

メニューバーから勤怠時間を管理するアプリです フロントエンド Tauri バックエンド GoogleAppsScript GoogleSpreadSheets https//github.com/SatooRu65536/kintaiapp

2023年9月16日

梶研 [端末姿勢推定]

梶研 [端末姿勢推定]

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日

satooru.me[Next, Hugo版]

satooru.me[Next, Hugo版]

Next.jsに慣れてきたので、Hugoで作っていたプロフィールサイトをNext.jsで作り直しました。 プロフィールページ Next.js13 SCSS Mantine ブログページ HUGO CSS 新しいAppRouterを使ってみた. とても扱いやすかったが、静的サイトにしたせいで あまりメリットを活かしてない. マークダウンからの取得が難しかったからブログはHugoで制作した

2023年8月31日

梶研 [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日

[最優秀賞]MoGy

[最優秀賞]MoGy

Yahooが主催するOpenHackU2023NAGOYAに参加しました。 3週間の事前開発ののち、Yahoo名古屋オフィスにてオフラインで発表をしました。 研究室の先輩と5人でチームを組み、MogyというMarkdownで簡単に投稿し、動画として閲覧できるサービスを作成しました。 最優秀賞をとれた! IT系だけでなく他の業界でも応用が聞いて良いとのことでした。 フロントエンド Next.js mantine sass marpcore firebase markdownit chartjs アプリデザイン フロントエンド(閲覧,投稿,検索ページ) 発表スライド/原稿 当日の発表 axios.post()を実行してもリダイレクトを繰り返してエラーを吐く 同じ関数を使って別のエンドポイントにリクエストを送ると返ってくる フロント側の問題ではなさそう RESTClientを使うと成功する バック側の問題ではなさそう リクエストの内容もあってそう axiosではなくFetchAPIを使っても変化なし ライブラリの問題ではなさそう CORSの問題だった 許可してあげると無事に全てのAPIを叩けるように (なぜ他のは使えたのかは分からない) safariではCORSを無視する設定ができる chromeでCORSエラーをコンソールに出す設定がある 画面設計やAPI設計などのドキュメントを残しており、 展示会中にアピールすることができた 最初の一週間を~~技育展で手を付けれない代わりに~~デザインに掛けたことにより、 動作に力を入れるチームが多い中、目立つことができた(と思う) バックの完成前にデモ動画を撮るために フロント側だけで動作するようにしていた 本番当日、たくさんのショートを投稿したところ CloudStorageの無料枠の制限に達してしまい読み書きが出来なくなった 展示会ではデモ用を併用することで実際の動作を見せることができた デザインに力を入れたのは先ほど同様、アイコンにまでこだわって自作した チーム開発する上でドキュメントを作成しチームで共有した 動画(ショート)は1スライド1音声で構成されていいる. 音声が終わると次のスライドに自動で遷移するのは簡単に実装できたが、 音声の途中で手動で遷移した場合に、停止してから再生するというのに苦労した わすれた 今まで梶研が参加したHackUでは2連続最優秀賞を取っているという状況の中で参加しました。 とてもプレッシャーの中、開発中には面白くないといった意見などあまり良い評価を得られない状況でした。 そんな中、最後まで完成できただけでなく、最優秀賞を取ることができて嬉しさを超えて安堵感が大きかったです。 もうハッカソンはいい。

2023年8月26日

梶研 [技育展予選 & 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日

SUMMER SONIC

SUMMER SONIC

千葉と大阪で開催される都市型ロック・フェスティバルに行ってきました。 僕たちは大阪の2日目に行きました。 アーティストの写真撮影ができないのが残念なので、センシングしました. これはSEKAINOOWARIDragonNight中の加速度です。 間奏中のジャンプがとても特徴的なのに加え、 後半になるにつれノルムが大きくなることから興奮が増していることがわかりますね。 「撮影禁止でもセンシングは禁止されていない」 これ使えそうですね

2023年8月20日

[決勝進出]wisdom Tree

[決勝進出]wisdom Tree

技育CAMPマンスリーハッカソンvol.7に参加したメンバーと作品で技育展というピッチコンテストに参加し、 私たちは"wisdomTree"という知っている単語から知らない単語へ知識を広げるアプリを発表しました。 フロントエンド Next.js mantine sass firebase

2023年8月12日

1
1234
4