輪投げ プロトタイプ手順
Pro Micro + MPU6050 + 1ボタンの輪投げデバイスで、データ収集 → 学習 → Pro Micro 推論まで通すための作業メモです。
Web Serial を使うため、収集ページは Chrome または Edge で localhost または HTTPS から開きます。
0. 構成ファイル
| データ収集ページ | ringtoss-collect.html |
|---|---|
| 軌跡プレビュー | ringtoss-trajectory.html |
| 収集ファーム | prototypes/ringtoss_data_collector/ringtoss_data_collector.ino |
| 学習スクリプト | tools/ringtoss_train.py |
| 推論ファーム | prototypes/ringtoss_inference/ringtoss_inference.ino |
| 推論係数ヘッダ | prototypes/ringtoss_inference/ringtoss_model_coefficients.h |
1. データ収集ファームを書き込む
Arduino IDE で prototypes/ringtoss_data_collector/ringtoss_data_collector.ino を開き、Pro Micro に書き込みます。
必要ライブラリ
MPU6050_tocknWire(Arduino IDE 標準)
主な設定値
| サンプリングレート | SAMPLE_RATE_HZ = 100 |
|---|---|
| baseline 区間 | BASELINE_MS = 500 |
| ボタン入力 | D5(押している間だけ1投として記録) |
| シリアル | 115200 bps |
シリアル出力フォーマット
1ボタンを押している間、次の形式で送信します。
READY,mode=one_button_gyro,rate=<rate_hz>,baseline_ms=<baseline_ms>
BEGIN,<trial>,<rate_hz>,<baseline_ms>
S,<trial>,<seq>,<t_ms>,<phase>,<gx>,<gy>,<gz>
BASE,<trial>,<samples>,<gx0>,<gy0>,<gz0>
END,<trial>,<samples>,<duration_ms>,<reason>
最初の BASELINE_MS はボタンを押したまま手前に引く区間です。この区間のジャイロ平均を基準として、以後の throw 区間から差し引きます。
2. Web 収集ページで CSV を作る
Chrome または Edge で ringtoss-collect.html を開きます。
Web Serial API は file:// では動かないため、localhost または HTTPS から開くのが安定します。
ローカルで開く例
リポジトリのルートで簡易 HTTP サーバを起動します。
python3 -m http.server 8765 --bind 127.0.0.1
ブラウザで次を開きます。
http://127.0.0.1:8765/ringtoss-collect.html
操作
-
1
シリアル接続
「シリアル接続」ボタンを押し、Pro Micro を選びます。 -
2
収集開始
「収集開始」を押すと、画面の 3×3 グリッドのいずれかが光ります。 -
3
1投する
ボタンを押し込み、手前に引いてから、的に向けて前へ振ります。振り終わったらボタンを離します。 -
4
次の的
1投を終えると次の的が自動で光ります。十分集まったら「CSV保存」でファイルを書き出します。
注意
- ボタンは「投げる瞬間で離す」ではなく、振り終わるまで握り続けて離します。
- リリース点はジャイロ3軸ベクトル絶対値
sqrt(gx²+gy²+gz²)のピークで自動判定します。 - デバイスは実際には投げません。手首ストラップ推奨。
- 最終形の輪っかデバイスでセンサーの向き・持ち方が変わる場合は、必ず最終形で取り直します。
3. 学習する
CSV を保存したら、tools/ringtoss_train.py で特徴量抽出と線形モデル学習を行います。
9 マス分類モデルと、初速ベクトル vx, vy, vz, strength の回帰モデルを同時に学習します。
外部ライブラリ不要、Python 3 のみで動きます。
実行例
python3 tools/ringtoss_train.py path/to/ringtoss-session.csv \
--header prototypes/ringtoss_inference/ringtoss_model_coefficients.h \
--summary ringtoss_model.summary.json \
--web-model ringtoss_model.web.json
出力
ringtoss_model_coefficients.h |
Pro Micro 推論用の係数ヘッダ。prototypes/ringtoss_inference/ に上書きする。 |
|---|---|
ringtoss_model.summary.json |
訓練精度・特徴量名・係数の要約。 |
ringtoss_model.web.json |
軌跡プレビューページが読み込む Web 用モデル。 |
特徴量
1 投あたり 20 個の特徴量を作ります。
duration_s, sample_count_scaled,
release_t_s, release_ratio, peak_gyro,
peak_gx, peak_gy, peak_gz,
mean_gx, mean_gy, mean_gz,
int_gx, int_gy, int_gz,
max_gx, max_gy, max_gz,
min_gx, min_gy, min_gz
4. 軌跡を確認する
ringtoss-trajectory.html を開き、
学習で出力された ringtoss_model.web.json と、収集に使った CSV を読み込みます。
画面右の TARGET で的を選ぶと、その的として記録された全投について、
モデルが予測した vx, vy, vz, strength から疑似軌跡を重ねて表示します。
色の意味
| オレンジ | 予測が選択中の的と一致した投 |
|---|---|
| グレー | 選択中の的として記録されたが、モデル予測が別の的にズレた投 |
| 緑 | モデル未読込時のガイド表示 |
5. 推論ファームを書き込む
Arduino IDE で prototypes/ringtoss_inference/ringtoss_inference.ino を開き、Pro Micro に書き込みます。
ringtoss_model_coefficients.h が同じディレクトリにある状態で書き込んでください。
推論時の出力
RING,<vx>,<vy>,<vz>,<strength>,<class_id>,<samples>
vx, vy, vz | 輪の初速ベクトル |
|---|---|
strength | 強さ |
class_id | 3×3 マスの推定値。左上から右下へ 0..8 |
samples | その投で使った時系列サンプル数 |
6. 運用メモ・データ収集の目安
- 最初の疎通確認は、各マス 2〜3 投・合計 18〜27 投で十分。
- 1 人で学習傾向を見るなら、各マス 10 投・合計 90 投を目安。
- Phase 1 以降は、各マスにつき最低 20 投以上、複数人で集める。
- 最終形の輪っかデバイスでセンサー向きが変わる場合は、必ず最終形で取り直す。
- 初速ベクトル
vx, vyは、現状は正解ラベル位置から作った理想値を学習している。物理軌跡の実測を反映する場合はtools/ringtoss_train.pyの正解値の作り方を見直す。