/MyProject

映像の飴を傘で弾いて遊ぶゲーム(自主プロジェクト)

Primary LanguagePython

自主プロ

🍬あめが降る☔

「空から雨じゃなくて飴が降ってきてほしい!」という発想から、映像のあめを本物の傘で弾いて遊ぶゲームを作ってみました。
完成作品の動画はこちらをクリックして見て下さい。

実行方法

使うプログラムはmainに入ってるもの全てです。プロジェクターをPCに接続してPCのディスプレイ設定でミラーを選択します。

まず、PC上でCoral TPUを立ち上げます。

 roscore
 source /opt/ros/melodic/setup.bash
 rosrun usb_cam usb_cam_node
 source /opt/ros/melodic/setup.bash
 source ~/coral_ws/devel/setup.bash
 roslaunch coral_usb edgetpu_object_detector.launch INPUT_IMAGE:=/usb_cam/image_raw
 source /opt/ros/melodic/setup.bash
 rosrun image_view image_view image:=/edgetpu_object_detector/output/image
 rosrun rqt_reconfigure rqt_reconfigure

値は0.1くらいに設定します。プロジェクターから映し出された画像とCoral TPUの画像処理結果の画像の画角を合わせておきます。

次に、Raspberry Pi上で

 sudo python3 ./rasp_server.py

最後に、PC上で

 python3 ./whole_game.py

これでゲームが始まります。

〜ソフト編〜

使うもの(予定)

  • PC
  • Kinect
  • Coral TPU

まずは動画づくり
参考サイト:失敗したけど画像貼り付け
参考サイト:連番画像から動画作成
参考サイト:アルファチャンネル画像を貼り付け

python3 cv2 インストール

python3 -m pip install opencv-python

GIMPでアルファチャンネル画像作成
Candyだけを背景画像に貼るためには.png形式のアルファチャンネル画像を作成する必要がある。
レイヤー ▶ 透明部分 ▶ アルファチャンネルの追加
選択 ▶ 色域を選択 -> アルファチャンネルにしたい部分の色を選択
Delete -> これでアルファチャンネル画像が作成できる。
ファイル ▶ 名前をつけてエクスポート ▶ .pngで保存

傘とあめがあったたかどうかの判定

  • 方法その1
    Kinectで写真と同じ画像を認識して/object_pose使う。
 source ~/semi_ws/devel/setup.bash
 roslaunch openni_launch openni.launch camera:=head_camera
 roslaunch recog_umbrella.launch
  • 方法その2
    ROSのBoundingBoxArrayを使う。
 roslaunch kinect.launch

パラメータ調節したいときは

 rosrun rqt_reconfigure rqt_reconfigure

役に立つか不明だけどここにHSL(HSI?)の色見本が載っている。

  • プロジェクターの画像の認識->プロジェクターからの映像とカメラの映像の画角を合わせて比で位置を計算する。

  • -----pythonでやるなら-----
    参考になりそうなサイト
    python
    演習のサイト

  • 方法その3
    方法その1とその2は失敗したのでCoral TPUの情報をSubscribeする。

 roscore
 source /opt/ros/melodic/setup.bash
 rosrun usb_cam usb_cam_node
 source /opt/ros/melodic/setup.bash
 source ~/coral_ws/devel/setup.bash
 roslaunch coral_usb edgetpu_object_detector.launch INPUT_IMAGE:=/usb_cam/image_raw
 source /opt/ros/melodic/setup.bash
 rosrun image_view image_view image:=/edgetpu_object_detector/output/image

パラメータをいじるなら

 rosrun rqt_reconfigure rqt_reconfigure

OSC通信

Ubuntu と Rasoberry piのデータのやり取りにはOSC通信を用いる。
python3 pythonosc インストール

pip3 install python-osc

コードは公式ページから拾ってくる。--ipのdefaultはRaspberry piでifconfigして調べた値にする。wlan0のところのinetの後に続く数字が知りたいIPアドレス。必ず先にserverを立ち上げること。OSC通信ではserverがデータを受け取る側、clientがデータを送る側らしい、不思議...。
---------通信だけならこれでもおっけー↓-------
<設定>Raspberry pi, Ubuntuそれぞれにこのサイトを参照して設定をする。
ifconfigで受信側のIPアドレスを調べて、サーバー側で./oscer IPアドレス 10000 /helloとし、クライアント側で./oscer receive 10000とすれば/helloを受け取ることができる。

〜ハード編〜

使うもの(予定)

  • Raspberry pi
  • LEDテープ
  • 振動モーター
  • スピーカー

Raspberry piの基本

ラズパイのセットアップやピンの位置など、ラズパイの詳細についてはBDMのREADME.md参照。
Ubuntuにすると使えなくなる機能があるので今回はRasbianでOSC通信を行うことにする。

-----------------Ubuntuでやりたい人は↓-------------------------------
ただし、今回はROSを使うためにUbuntu Mateをいれたいので、MicroSDのセットアップでは以下に従う。
公式ページでUbuntu MATEをダウンロードする。 PCのUbuntuでターミナルを開く。まず、SDカードを挿したときと挿さない時とで $ df -h を実行してその差分を見ることでSDカードのデバイス名を見る。/dev/mmcblk0p1 だったらデバイス名は /dev/mmcblk0
br デバイスをアンマウントする。<> ダウンロードしたファイルを解凍。今回は ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img.xz をダウンロードしたので
$ xz -dv ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img.xz
ファイルが解凍されて ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img ができるので
$ sudo dd bs=4M if=ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img of=/dev/mmcblk0
最後に$ syncとして、アンマウントしてからSDを抜く。

ROSをいれるにはRaspberry pi上のターミナルでこのページ に書いてあることを忠実に打ち込む。

フルカラーシリアルLEDテープ

このページに載っているGitHubのコードをダウンロード!
ロジック変換しないでも光らせることはできるが、安全のためロジック変換ICを用いることにした。
上記サイトの"回路結線図"以降を参照。 strandtest.pyの中身を応用すれば良さそう。

<python3でLEDテープを動かすには>
上記のコードはsudo pythonで実行する必要があり、osc通信はpython3で実行するため共存できない。python3で動かしたい場合は次のようにする。

sudo pip3 install rpi_ws281x
git clone https://github.com/rpi-ws281x/rpi-ws281x-python
cd rpi-ws281x-python/example
chmod 755 *.py
sudo python3 strandtest.py

振動モーター

回路はこのサイトに書いてあるとおりに組む。
コードについてはwiringpiではGPIOの制御がうまくいかないのでRPi.GPIOを使う。

スピーカー

Raspberry piのイヤホンジャックに刺せるタイプのものを購入。Raspberry piの音声出力をイヤホンジャックに設定しておく。

音源の音量を上げるサイト音源をカットできるサイトがあってとても便利。
無料の音源はこちらを参照↓
<効果音ラボ>
<音人>
<ポケットサウンド>
<ポップモーション>