「空から雨じゃなくて飴が降ってきてほしい!」という発想から、映像のあめを本物の傘で弾いて遊ぶゲームを作ってみました。
完成作品の動画はこちらをクリックして見て下さい。
使うプログラムは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
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テープ
- 振動モーター
スピーカー
ラズパイのセットアップやピンの位置など、ラズパイの詳細については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上のターミナルでこのページ
に書いてあることを忠実に打ち込む。
このページに載っている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の音声出力をイヤホンジャックに設定しておく。
音源の音量を上げるサイトや音源をカットできるサイトがあってとても便利。
無料の音源はこちらを参照↓
<効果音ラボ>
<音人>
<ポケットサウンド>
<ポップモーション>