はじめに
Chromeブラウザでインターネットにつながらない場合に遊べるDinoゲームをご存知でしょうか。
他の名称でDinoランナー、T-REXゲームと呼ばれる場合もあります。
基本的にスペースキーのみで遊べますが、レベルが上がるとコンドル(飛来物)が飛んできて、矢印キーの下でしゃがむ必要もあります。
前回はM5StickC、または、M5StickC Plusの腕時計マウンタを足首につけて実際にジャンプしてDinoゲームを遊ぶことで運動不足解消を狙いました。
MediaPipe Pose版
人が大勢いるイベント会場でBluetoothは電波の影響を受けたので、今回はデバイス(M5StickC、または、M5StickC Plus)が不要で、パソコンのカメラでジャンプを検出してDinoゲームを遊ぶことで運動不足解消を狙います。
MediaPipe Poseとは
カメラの映像から人間の姿勢を推論するライブラリで、全身の33個のランドマーク位置、または、上半身の25個のランドマーク位置を予測できます。
身体の胴体(ランドマーク位置の11, 12, 23, 24)を使用して、ジャンプを検知します。
構成
大きく2つのパートから構成されます。
①ローカル環境にHTTPSサーバを起動します。
②ブラウザを起動し、起動したHTTPSサーバへアクセスします。GitHubページへアクセスしても問題ありません。
カメラアクセスの許可を求められるので許可します。MediaPipe Poseのライブラリを読み込み、ジャンプを検知するJavascriptが実行されます。
③キー入力を行うためのPythonプログラムを起動します。
④ジャンプを検知すると、キー入力を行うためのPythonプログラムへ通知(HTTP POSTリクエスト)を送信します。
⑤通知を受信するとキー入力を行います。(スペースキーを入力します。)
ジャンプを検知するブラウザ画面はバックグラウンドに移し、キー入力を行うブラウザ画面(Dinoゲーム)を選択します。(フォアグラウンドに移します。)
コード
ジャンプの検知ロジックについてはmain.jsの内容を確認してください。
最初、以下のプログラムを参考にしましたが、静止した状態だとジャンプの誤検知が酷かったので、ロジックはほとんど書き換えました。
手順
プログラムをGitHubからダウンロードして、①HTTPSサーバを起動します。
$ git clone https://github.com/kitazaki/mediapipe_pose_dino_game
$ cd mediapipe_pose_dino_game
$ python3 scripts/run_https.py
③キー入力用サーバを起動します。
pythonプログラムからキー入力を可能にするため、事前にpyautoguiモジュールをインストールします。
$ pip3 install flask pyautogui
$ python3 scripts/logger.py
macOSの場合、ターミナルからキー入力を検知すると警告が表示されます。
キー入力を許可するため、システム環境設定→セキュリティとプライバシー設定→アクセシビリティ→ターミナル.appを許可します。
動作確認
①HTTPSサーバの実行画面
$ python scripts/run_https.py
Generating a RSA private key
.........++++
..........................................++++
writing new private key to 'key.pem'
-----
Server running on https://0.0.0.0:443
127.0.0.1 - - [02/May/2023 12:43:27] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [02/May/2023 12:43:27] "GET /main.js HTTP/1.1" 304 -
...
③キー入力用サーバの実行画面
$ python scripts/logger.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 736-922-939
127.0.0.1 - - [02/May/2023 17:00:45] "OPTIONS /logger HTTP/1.1" 200 -
data: {'njump': 1}
127.0.0.1 - - [02/May/2023 17:00:46] "POST /logger HTTP/1.1" 200 -
data: {'njump': 2}
...
実際にDinoゲームを行なっている様子です。