推しアイデア
杖を振る&呪文を唱えるで現実世界に魔法を起こす!
―
杖を振る&呪文を唱えるで現実世界に魔法を起こす!
テーマ「wind or wave」→風魔法、水魔法使おう!
YOLO + ONNXでブラウザ上でリアルタイムキーポイント検出! スマートプラグで現実に魔法を起こす!
Magic Wand は、「音声による呪文詠唱」と「杖のジェスチャー」を組み合わせて、スマートホームデバイスを魔法のように操作する体験型Webアプリケーションです。
ユーザーは魔法使いになりきり、呪文を唱えながら杖を振ることで、部屋の照明や家電を操作できます。音声とジェスチャーの両方が揃った時だけ魔法が発動する仕様により、誤作動を防ぎつつ没入感のある体験を実現しています。
速さと安定を求めた技術スタック!
Next.js (App Router) — Reactフレームワーク TypeScript — 型付き言語 React 19 — UIライブラリ Bun — パッケージマネージャ / ランタイム Devbox — 開発環境管理
Vitest — テストランナー oxlint — Linter Prettier — Formatter GitHub Actions — CI/CD CodeRabbit — AIコードレビュー Babel React Compiler — React最適化コンパイラ
Roboflow — 学習データのアノテーション・データセット管理 Python(Google Colab) — モデル学習・開発環境 ONNX Runtime Web — 杖検出モデル推論 (YOLOv8-pose) 独自実装 — ジェスチャー認識(軌跡の方向転換回数ベース)
mediapipe使ってません!今回はYOLO+ONNXで実装しました。
Web Speech API — 音声認識(日本語) WebHID API — Joy-Con接続 Web Bluetooth API — Phomemo M02Sプリンター接続 getUserMedia API — カメラ映像取得
tp-link-tapo-connect — TP-Link Tapoスマートプラグ制御
Joy-Con(R) スマートプラグ マジカルワンド(USJの杖)
実際に杖を振って詠唱をすることで魔法を起こすデモ動画
キーポイント検出(YOLO + ONNX)による杖の軌道検出デモ
キーポイント検出(YOLO + ONNX)による杖のジェスチャー判定(V字)
タイトル
ホーム
接続確認
接続テスト画面
プレイ画面
チュートリアル
呪文一覧


設定画面




最終的に400枚以上の学習データを用意(写真を撮影)し、Roboflowというツールを使用して人力アノテーション作業!!!
自前で学習用データを用意&アノテーションをして、実際にモデル学習をさせたのは初めてでしたが、かなり根気のいる作業でした...
今回はwandのクラス(杖全体)とtip(杖先)とgrip(持ち手)の2点のキーポイントを検出させるキーポイント検出で画像認識の実装をしました。
Roboflow作成のデータセットを用いてGoogle Colabでモデル学習させ、ONNX形式でエクスポート
出力したONNXファイルをONNX Runtime Webを用いてブラウザ上で推論を実行させています

思ったよりJoy-Con IRカメラがしょぼかったので最終的には本番実装には含めませんでしたが、試行錯誤しながらテスト実装頑張ったのでそちらも紹介させてください
Nintendo_Switch_Reverse_Engineering ↑こちらのリポジトリを参考に実装を進めました
WebHID API を使い、ブラウザからJoy-Con (R) のIRカメラとIMU(加速度・ジャイロ)を直接制御しています。
【通信の流れ】 ブラウザ (WebHID API) ←→ Bluetooth HID ←→ Joy-Con (R) ├─ MCU (STM32) → IRカメラ └─ IMU → 加速度センサー + ジャイロスコープ
初期化シーケンス:
データ受信(レポートID 0x31 の1パケットに全て含まれる):
IRカメラの2モード:
IMUセンサー:
USJの杖は杖の先にある再帰反射材に赤外線を当て、反射した赤外線をIRカメラで捉えることで杖の振りを検知しているらしいです。それを再現したかったのですが、残念ながらJoy-ConのIRカメラでは実力不足でした...
Joy-Con IRカメラによる杖振り検知デモ ↑テスト実装の成果 至近距離であれば動いていることは検知できました。軌道もなんとなくは取れています。
mediapipeを使えばサクッと終わりそうな杖振り検知(ハンドトラッキングで杖を握っている手をトラッキングするなど)をあえて行わず、ロマンを求めて以下のような実装を行いました ↓
妥協して簡単に実装できる方法がありながら、わざわざロマンとこだわりで上記の3つの杖振り検知の実装を行う技術の無駄遣いをしました!
現実で魔法を使えるようになりたい!!!
そんな欲望をかなえるため、Webブラウザと扇風機やグリップライトなどのハードウェアを直接制御するためのIot基盤を構築しました。
通常は専用のネイティブアプリからしか動かせないサーマルプリンター(今回使用した機種は、Phomemo M02S)を、ブラウザからWeb Bluetooth APIを叩いて直接制御しています。中間サーバーを一切挟まないモダンな構成にしました!
単にテキストを送るだけでなく、おみくじの結果を動的に<canvas>で合成しています。さらにその画像データを、プリンターが解釈できる1bitのモノクロバイナリ(0と1の配列)にディザリング・2値化変換する処理をTypeScriptでフルスクラッチ実装しました。データをBluetoothのMTUに合わせてチャンク分割し、ESC/POSライクな独自コマンドを付与して送信するという、低レイヤーな制御をWebフロントエンドの技術だけでやり切りました。
今回のプロダクトのコア部分はスマート電源タップ(TP-Link Tapo P300)が担っています。このスマート電源タップをプログラムからAPI経由でハックし、「風(扇風機)」「光(クリップライト)」「火(偽の炎ライト)」といった魔法の属性に合わせて、プログラムで指定しているコンセントポートのON/OFFを自動制御しています。
極めつけは水属性の魔法(アグアメンティ)です。「魔法で水を出したい」というただそれだけの理由で、わざわざAmazonで物理的な水中ポンプを購入。それをスマートプラグに繋ぎ、発動時に2秒間だけ水を噴き出させるという異常な執念で魔法を再現しました。 僕としては今回のプロダクトが今まで作った中で一番ハックツハッカソンしてると思いました!
ひろ:音声認識 / IMUのジェスチャー判定 ゆっちん:UI担当 リタ:JoyCon IMU / 杖のキーポイント検出 アリス:IoT連携