Motion Sync
遂に陸上競技者の身体感覚の再生と共有プロジェクトのベース研究を始める 1/26
動画:https://photos.app.goo.gl/kbaiuqq8ZNZDVwzG7
https://scrapbox.io/files/6780e07f1fef19701c8f1355.png
https://scrapbox.io/files/65d7fc8470653c00242a00ec.png
https://scrapbox.io/files/65d8695ca332a1002432a8a9.png
https://www.itmedia.co.jp/news/articles/2308/09/news065.html
https://scrapbox.io/files/67a1df76db1e04e34e723bca.png
https://3dvar.com/Lopes2015Impacto.pdf#:~:text=Figure%202%20shows%20the%20solenoid,to%20the%20knuckles%2C%20Figure%202
参考:
モーションキャプチャによる速度/ピッチの解析
https://bluezone.co.jp/
Pose estimation 100m pitch speed github 検索でヒットしない。
三段跳びのモーション解析
https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://hal.science/hal-04126067/document&ved=2ahUKEwinn9_OrvuDAxW8sFYBHZ-JA-8QFnoECB4QAQ&usg=AOvVaw3MEuouIJPMUiv2exTnsgo9
----力覚センサ---
3軸方向の圧力を検知可能な光学式フレキシブル 圧力センサシート
https://www.t.u-tokyo.ac.jp/press/pr2023-09-12-001
エボライド オルフェはソールにセンサーを内蔵し、距離やラップタイムに加えて、ストライドの大きさや着地のパターン、接地時間や角度、着地時の衝撃の大きさなどを計測する。
https://project.nikkeibp.co.jp/mirakoto/atcl/sports/h_vol19/
ミネベアミツミの小型6軸力覚センサーはフォース3軸、モーメント3軸の6軸力覚センサー
https://pr.minebeamitsumi.com/6axisforce/?utm_source=google&utm_medium=cpc&utm_content=3121183676_20331299998_151194539496_683872471336_kwd-332144263401&utm_campaign=小型6軸力覚センサー-jp&utm_term=b_力覚センサー&gad_source=1&gclid=CjwKCAiAzc2tBhA6EiwArv-i6fPavZ8xG5aorIVAivlXA1fc7wuB5WqFtQxT_RnlRgE7YpYtb28keBoCzXIQAvD_BwE
---振動子の種類---
https://sites.google.com/view/t-nakamura/other/vibrators?authuser=0#h.p_gBW3izsVWYsu
1/27 アクチュエータシューズの試作
M5C-Dual振動モータの回路図
https://scrapbox.io/files/65b7a09062537700249acef4.png
左モータはG26で3.3V出力し、Vgs > 1.0V?以上とする事でN-MOSFETを動作させて振動モータを駆動
右モータはG36で0V出力し、Vgs < -1.0V?以上とする事でP-MOSFETを動作させて振動モータを駆動
注意点
3.3V電源とG36を使わなければゲート閾値Vgs: -0..4 ~ -1.1V を満たせないので注意。
SourceにBATを使うと最大4.2Vとなり、Vg=3.3Vの電位差が-0.9Vとなってしまい常にゲートONとなってしまう。
またG0はOutputできないので使えないので注意。
今は無いがフライバックダイオードを入れたほうが良い。ソレノイドだとMOSFETが壊れる可能性が高い。
P-MOSFET IRLML2246TRPBFのDrain-to-Source Breakdown Voltageは-20V。
https://scrapbox.io/files/65b79ffd980fa700244d40f8.png
M5C-Dualリニア振動アクチュエータモータの回路図
未実験...
M5C-Dual 5Vソレノイド回路図
同様の回路にする場合、ソレノイドを二つ動かすにはリチウムスーパーキャパシタの並列接続が必須のためVccがBATから取る必要がある。電圧を少しでも上げるためにBAT端子から取るのが望ましいという理由もある。
この場合、Vgs = -0.9VとなるためP-MOSFETのゲート閾値電圧が -0.9V以下にする必要がある。例えVgs = -2.0Vなど。
手はんだタイプ: TJ11A10M3, IRFU5505PBF, IRFU9024NPBFはVgs: -2.0 ~ 4.0V
表面実装タイプ: 2SJ168 Vgs :-2.0 ~ -3.0V , RdDS=1Ω ドレイン電流 200mA
→ 電流1A流せてVgs: -2.0V以下は手はんだタイプしか無さそう。
ピン配置は、下記図のゲート、ドレイン、ソースを、G36 , G0(使わない), BATに順で対応すればよいので問題ない。
https://scrapbox.io/files/65b7a7202391620024bce0ff.png
M5C-Dual 24Vソレノイド回路図
未実験....
24Vの場合は、AC電源から取ったほうが良いだろう。マキタのバッテリー14.4V or 18Vでもよい
振動モータ(定格4V)はNch-MOSHFETで楽々動いた。
https://scrapbox.io/files/65b51afbadb85e00240ea380.png
https://scrapbox.io/files/65b51b0e4e1c0c00242a77dc.png
5Vソレノイドは3Vでは動かなかったので、BATから直接取ることにしたが安定しない。
ソレノイドON時にも電流が流れて電池残量が急激に減るためだろう。
リチウムスーパーキャパシタを入れたが、GNDに繋いでいるエナメル線(2YUEWは径0.16mmと細いため50mA程度しか流れないだろうため意味がない。(0.2mAで100mA)
https://scrapbox.io/files/65b51b178d13d90023cf9c86.png
残務:
コンデンサのGNDを径の大きい電子ワイヤーかエナメル線で試したり、電気二重層コンデンサを試す
→Lipoがある程度(3.5V以上?)充電されていれば特に必要ない。より低電圧で駆動させたい場合に電気二重層コンデンサを入れる。
電子ワイヤーは太くしたほうが良い。
ゲート抵抗の必要性検討(電流削減のため) 
→ MOSFETは必要ない。そしてM5CはPull_Downされている。
考察:
5Vから取ってもESP32かAXP192で電流制限されるだろうため、電圧は低いがLipoから直接取ったほうがいいだろう。
1/28
類事例が無いか調査したところ、障害者への触覚提示や、AR/VR用の触覚提示が多かった。
運動促進用超小型軽量 ハプティック式歩行補助シューズ
https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://shingi.jst.go.jp/pdf/2023/2023_waseda_003.pdf&ved=2ahUKEwja5rS68v6DAxXoka8BHSUcDfMQFnoECBgQAQ&usg=AOvVaw2sgI36b9lXRv5pn9ogIi1h
ホンダが支援するシューズイン型ナビゲーションシステム「あしらせ」実証実験中! 視覚障がい者にも移動の自由を!
https://car.watch.impress.co.jp/docs/news/1331637.html
慶應義塾大学学術情報リポジトリ(KOARA)
足裏感覚を操作することで歩行動作を変化させるハプティックシューズ
https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://koara.lib.keio.ac.jp/xoonips/modules/xoonips/download.php/KO40001001-00002016-0515.pdf%3Ffile_id%3D126575&ved=2ahUKEwja5rS68v6DAxXoka8BHSUcDfMQFnoECCcQAQ&usg=AOvVaw1tjmhL723VJJ1SU0cTp6_3
「足裏感覚を操作することで歩行動作を変化させるハプティックシューズ」は、圧力センサや、触覚アクチュエータ、インソールへの組み込み、センサ信号のアクチュエータ変換等が興味深いので、資料を抜粋して掲載する
https://scrapbox.io/files/65b5fcacf2b61d002572f72a.pnghttps://scrapbox.io/files/65b5fcdd479b1c00231ee34e.png
https://scrapbox.io/files/65b5fce3fdcf52002692cfaf.pnghttps://scrapbox.io/files/65b5fcf4fce52c0024b0fb3a.pnghttps://scrapbox.io/files/65b5fd2e29aeac0024396398.png
https://scrapbox.io/files/65b5fd3edcf0a60024c567b3.png
https://scrapbox.io/files/65b5fd7dec195100253c1c66.pnghttps://scrapbox.io/files/65b5fd8840da740027a60d02.pnghttps://scrapbox.io/files/65b5fdacfce52c0024b10489.png
https://scrapbox.io/files/65b5fde82744440023514ff8.png
https://scrapbox.io/files/65b5fe014013f900256c6b4a.png
圧力センサーは感圧範囲が0.1 ~ 9.8N代わりに320円と安い MF01A-N-221-A04 を暫定的に利用するか?
大きさは47.2 x 13 x 0.33 mm
https://scrapbox.io/files/65b60098c82bc00024089d38.png
FSR400 SHORTは 0.2~20Nで780円。
大kしあは 15.8 x 7.6 x 0.3mm とMF01A-N-221-Aの半分。しかし配線が故障しにくいか?
https://scrapbox.io/files/65b600aa1bd719002543754b.png
https://akizukidenshi.com/catalog/g/g105747/
サイズを大きくするなら FSR402 Short Tail。短辺18.29mm
https://scrapbox.io/files/65b6027382e7680024dc9475.png
1/29 perf.counter()によるPythonのサンプリング間隔の修正 並びに 触覚提示方法の検討
■perf.counter()によるPythonのサンプリング間隔の修正
映像を見ながらPythonのtime.time()を用いた測定した接地タイミングの時間精度が悪い。調べるとWindowsでは最大で1ms精度であり、サンプリング周波数50Hz以上では数ms揺れる事がしばしばあった。今は50Hzに設定しており、20.0~22.0ms程度の揺れとなる。実効サンプリングレートは測定毎に異なる。ソースは下記。
code:python
def measure_key_presses(sampling_rate):
start_key = 'left'
end_key = 'enter'
left_key = 'left'
right_key = 'right'
# サンプリング間隔を計算
sampling_interval = 1.0 / sampling_rate
key_states = {'left': [], 'right': []}
timestamps = []
# 測定の開始を待機
print("Press left arrow key to start measuring.")
while True:
if keyboard.is_pressed(start_key):
break
print("Measurement started. Press keys...")
start_time = time.time()
last_time = start_time
# エンターキーが押されるまで測定
while True:
current_time = time.time()
if current_time - last_time >= sampling_interval:
last_time = current_time
timestamps.append(round(current_time - start_time, 6))
key_states'left'.append(keyboard.is_pressed(left_key))
key_states'right'.append(keyboard.is_pressed(right_key))
if keyboard.is_pressed(end_key):
print("Measurement ended.")
break
測定したcsvを一部貼っておく。
code:text
timestamp,deltatime,left_key,right_key
0.0103,0.0,65535,0
0.0206,0.020602,65535,0
0.0311,0.020987,65535,0
0.0416,0.020903,65535,0
0.0526,0.02199,65535,0
0.0629,0.020573,65535,0
0.073,0.020218,65535,0
0.0835,0.020987,65535,0
0.0942,0.021535,65535,0
0.1046,0.020666,65535,0
0.1146,0.020052,65535,0
0.125,0.020824,65535,0
0.1361,0.022263,65535,0
time.process_time()を使えば高精度に取れるかもしれない。
Pythonのtime.time()の精度
Pythonのtime.time()関数は、システム時刻を返しますが、その精度はオペレーティングシステムやハードウェアに依存します。一般的に、Unix系のオペレーティングシステムでは精度はマイクロ秒(1マイクロ秒 = 1/1,000,000秒)レベルですが、Windowsなどの他のシステムではミリ秒(1ミリ秒 = 1/1,000秒)レベルの精度になることがあります。
外部ライブラリの利用:
Pythonでは、高精度タイミングを扱うための外部ライブラリがいくつか存在します。たとえばtime.perf_counter()やtime.process_time()はより高精度なタイミングを提供します。
configTICK_RATE_HZの推奨最大値は1000Hzのため、1tickの最少時間は1msとなる。
https://scrapbox.io/files/65b744b34bda920024d80857.png
https://scrapbox.io/files/65b744830e582b00246d3ee8.png
問題をまとめると、ESP32の1tickの最少時間は1msのため、Python側のサンプリング間隔が1msの倍数になっていない場合にESP32のタスク実効周期にて100usオーダが丸められてしまう。例えば10.5msのサンプリング間隔で10秒間した場合、10000/10 * 0.5 = 500ミリ秒の大きなずれが生じてしまう。
解決策は3つある
1.ハードウェアタイマが使える可能性のあるdelayMicrosecondsを使う(ただしビジーウェイト)
2.Python側の時間測定をtime.perf_counter()で行い、処理を見直す
3.占有タスクでマイコン側で接地タイミング測定を行う
3.の説明は不要だろう。1,2を順に述べる。
マイコン側での解決策はdelayMicrosecondsを使うことだが、タスクを占有(ビジーウェイト)してしまうのでコアが占有となってしまい、無線系の処理を入れることが難しくなってしまう事だ。
"delayMicroseconds は、マイクロコントローラのハードウェアタイマーを直接使用して遅延を実現します。このため、多くの場合、マイクロ秒単位の遅延が可能です"
Python側での解決策としては、perf_counterを使うことで100.002Hzと誤差0.002Hzにできた。コードを記しておく
code:python
start_perf_counter = time.perf_counter()
next_sample_time = start_perf_counter
while not keyboard.is_pressed(end_key):
current_perf_counter = time.perf_counter()
if current_perf_counter >= next_sample_time:
next_sample_time += sampling_interval
timestamps.append(current_perf_counter - start_perf_counter)
key_states'left'.append(keyboard.is_pressed(left_key))
key_states'right'.append(keyboard.is_pressed(right_key))
振動モータで三段跳の世界記録保持者ジョナサンエドワードの左足/右足接地感覚の模擬
とりあえずM5C1個で振動モータ2つを制御し、ジョナサンエドワードの左足が接地した瞬間に左モータ、右足が接地した瞬間に右モータを駆動している。動画は分かりづらいので載せない、後述するソレノイドで動かした動画のほうが分かりやすい?ので載せておく。
https://scrapbox.io/files/65b78fad4bda920024de615e.png
ソレノイドで三段跳の世界記録保持者ジョナサンエドワードの左足接地感覚の模擬
https://photos.app.goo.gl/JJD4g1BxyfgqdNsk6
■触覚提示方法の検討
しかし振動モータでは接地感覚を体験できているとは言い難い。
プレートの中にソレノイドを入れ、接地した時にソレノイドをプッシュして母指球付近と踵付近に該当するサブプレートと部分的に押し上げる事で接地感覚を体験できないか? (シューズの中にソレノイドのサイズの問題でパスする、シューズはリニア振動アクチュエータを入れて+αとしたい。)
10N 30N 50Nのソレノイドを試してみたい!が...先にKさんから頂けると10Nのロングストロークソレノイドを1/30以降に試してみる。
先に回路図を書いておくか...
下記回路図は、ページ上部 1/27の付近に記載した。
1. M5C-Dual振動モータの回路図 ....完了
2. M5C-Dual 5Vソレノイドの回路図 ... 1ソレノイドのみ!
3. M5C-Dual 24Vソレノイドの回路図 ... 未実験!
4. M5C-Dualリニア振動アクチュエータモータの回路図] ... 未実験!
3. M5C-Dual 24Vソレノイド
電流の計算
AWG24は最大3.5A
プッシュソレノイド CBS08300480は24V / 0.5A / 12W / 1mmで5N  https://scrapbox.io/files/65b9066c51b52e0025333647.png]
プッシュソレノイド CB10370150 は24V / 1.6A / 38.4W / 1mmで20N
https://scrapbox.io/files/65b906b6e262130024272574.png
CBS10290170は24V / 1.5A / 34W / 1mmで18N
https://scrapbox.io/files/65b9a1ecdccfa70025a99630.png
https://scrapbox.io/files/65ba0c2f81c518002493c041.pnghttps://scrapbox.io/files/65ba0c43bc2ab00025528936.png
全長49.2mm + 可動5mm = 全可動域49.7mm
https://scrapbox.io/files/65ba0d6df1bfae0025527ec9.png
ACアダプタ 24V / 3A  https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-63HZ
メガネケーブル https://akizukidenshi.com/catalog/g/g101688/
3.5mm以上のチューブ. ソレノイドから制御基板までのケーブル
フライバックダイオード 1N4007 1000V/1A
表面実装: NchMOSFET 30V3.5A SSM3K329R 30V /3.5A , リード線: NchパワーMOSFET 60V5A 2SK4017(Q)
スルーホール MOSFET 2SK4017
DCジャック, 20V / 4A https://akizukidenshi.com/catalog/g/g109408/ 20Vだが実力はもう少しあるか...?20V以上のジャックがない
×2UEW 0.8mm 1.2A https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2566-4GMW#
2UEW 1.00mm 2.0A 今回はギリギリ使えるが...
ワイヤー線 AWG22 7A (AWG28は1.4A, AWG24は3.5A)
DCDC 5V ムラタ2出力降圧DC-DCコンバータ 5V(0.5A)/12V(0.5A) 基板付, https://akizukidenshi.com/catalog/g/g112539/
R22の下あたりに、24V/GNDがあるのでソレノイド制御ボードに載せちゃう。5Vは足を折って供給。
圧電マイクロブロア MZB1001T02 (超音波振動ポンプ) 一応買っておく。M5CのPWMとMOSFETできっと動かせる。
サイズ 65 X 65 X 15で1500円。4ポート使えるのでこちらを買ったほうが安全で早いよ?
https://www.takaha-shop.com/SHOP/sb-6565-01.html?_gl=1*1fyrv9m*_ga*MTMzODgyMjQxOC4xNzA2MjYzNjQ4*_ga_NLHW3KSNBB*MTcwNjYyNjQ4Mi4xMS4xLjE3MDY2MjY0ODkuNTMuMC4w
2/1
タカハから制御ボードが届かないので手ハンダで制御基板を作った。
人が上に乗った場合、ソレノイド先端から板までに距離が無いと力を加える時間が少ないため速度がず衝撃が弱い。(運動エネルギーが小さい)
次回は購入した 5mmストロークのCB10290170(24V / 1.5A / 34W / 1mmで18N)を使い、距離4~5mmの地点で足に衝突するようにしたい。ソレノイドを二つ以上同時に使わない前提でCB10290100(54W)でも良かったかもしれない。
基板にはどうせなら5V電源を付けてUSB無しでも動くようにしよう? 回路図には足しておいた。DCD降圧5Vは秋月で買える村田製のモジュール → 2/4 基板起こすと時に加えれば良い、後回し
https://scrapbox.io/files/65bba28216acb00025fe045a.png https://scrapbox.io/files/65bba798704c7c00244144b0.png
やること
ドレミファソレノイド
M5Flowで再度 ドレミファソラシドの再生試行
PlatformIOでMIDI制御ソフトDomino経由の操作によるドレミファソラシド
5Vソレノイドの購入
動画作成
Songleとの同期
2/3 触覚アクチュエータ x 2と制御ボードの接続
2つの触覚アクチュエータを駆動させられるようになった。
接地感覚模擬の場合は連続しないため問題でないが、24V / PWM10%が定格だがPWM20%は無いと音が大きくならない。
可動域5mmだが、大きな反発を得るにはシューズとアクチュエータベースの基本距離は5mm~6mm程度が良さそうだ。駆動時にアクチュエータが跳ねるので5mm未満でなくとも良いだろうか。
https://scrapbox.io/files/65bf1f2c55b75200250f4642.png
2/4
触覚アクチュエータを二つ用意できたので「動画とアクチュエータの同期」を行う。
2/5
yamlファイルで下記の共有
MotionPlayer.py、MotionRecorder.pyにVLC動画再生開始時間の共有
MotionRecorder.pyにてソレノイド時定数、接触までの時間のオフセット
ソレノイド時定数の算出
https://smt.shindengen.co.jp/product/download/pdf/smtcom33.pdf
立ち上がり時間(時定数電流が最大値の63%となるまでの時間)が異なる
時定数τ = L/R
https://scrapbox.io/files/65c07122fdbfd90024b17d00.png
消費電流の測定 済
例えば、引き込み電流(2.2A)と保持電流(0.75A)がある 
https://smt.shindengen.co.jp/product/download/pdf/smtcom33.pdf
CBS10290170の引き込み電流と保持電流は?
引き込み電流1.3A。保持はPWM20%あれば保持できるので0.26Aと仮定できる。
立ち上がり電流は少ないので引き込み電流1.3A以上は流れないと言える。
3Dプリント
ホール付きソレノイドケースの印刷
ナット付きベースの印刷
ドレミファソレノイド
→ 別ページに記載
2025/2/4 機構検討
プッシュ機構
5mm程度空間を空けて置きプッシュする機構にするのが簡単な構造となるが、高さが67mm程度必要となる(現行のカップ型)
ギア機構
ギア機構は樹脂を足裏に衝突させた際も故障しないしっかりした強度計算が必要になるが、ソレノイドケーの高さを抑えられる
プル型ソレノイドのほうが、ストローク長くとも力を保っている。
https://www.takaha-shop.com/SHOP/cbs1240.html?_gl=1*1liloim*_ga*MTE3MDgxNDA2NC4xNzM2NDk5MDgz*_ga_NLHW3KSNBB*MTczODY2MzA5Mi40LjEuMTczODY2NDM5OC41OC4wLjA.
LD14。バイポーラで効率を上げるならBD6211F等を使う。
喋るソレノイドは違うか?
https://scrapbox.io/files/67af3d9f7fa6a2e7ba4a5400.png