VRで他の人に触れたいよね。だから触覚フィードバック作成(NeosVR)
導入
どうも、superddsOTLと申します。とあるVtuberさんのツイートで、「触れたらその感触がわかるしっぽが出来るまでは死ねない。」的なことが言われていたので、これは作ってみるしかないと思い、作成を計画しました。それと、NeosVRで外部に情報を送受信するシステムを作ってみたいというのもあり、VRユーザーの多くが待ち望むであろう、触覚フィードバックを作ってみたので、その工程をメモがてらに記事にしてみました。まず、わかりやすいLチカ(LEDチカチカ点灯)を作った後、振動モーターに接続して作成します。
私が作成した触覚フィードバックシステムの動作はこちら。
工程と材料
今回実装するシステムの動作シーケンスを確認しましょう。
①NeosVR内で自分のアバターの腕を誰かが触る。
②腕のコライダーがpulseを発生
③PostStringでラズパイのローカルIPにstart命令を送る。
③ラズパイの内部で動作しているPHPがstart命令に反応し、Pythonスクリプトを実行。
④Pythonスクリプトがラズパイの出力ピン(GPIO)から電源を出力。
⑤出力ピンから供給された電源で振動モーターが回転。
ワークフローチャートは以下。
以上の順序で動作するシステムを作ります。
今回、制作に使用した物は以下の通り。
Raspberry pi model 3B x1,電源供給用USBmicroケーブル x1、microSD(32GB) x1,ブレッドボード、メス―オスケーブルx適量、オスーオスケーブルx適量、砲弾型LEDx1(動作確認用)、HDMIケーブル x1、HDMI入力可能なモニター x1、振動モーター(LA3R5-480) x1
ラズベリーパイのセットアップ
まず、パソコンを用いてMicroSDカードにラズベリーパイのOSをインストールします。今回使用したOSはrasbian 8.0 jessieです。現在公式ページでダウンロードできる最新版でもおそらく動くはずです。容量が大きいのであらかじめダウンロードしておきましょう。
SDカードへはbalenaEtcherを使って書き込みます。
終了したら、ラズベリーパイにMicroSDカードをセットし、HDMIを接続したらmicroUSBを接続して起動します。セットアップはこちらとかを参考に。
インストールに成功し、デスクトップ画面が表示されるされるとこうなります。この時点で、画面右上にあるWi-FiアイコンからWi-Fiに接続しておきましょう。
サーバ設定・起動
ラズパイのデスクトップ画面左上にあるターミナル(Terminal)を起動し、次のコマンドを順に打ち込んでいきます。
sudo apt update
sudo apt install python
sudo apt install vim
sudo apt install apache2
sudo service apache2 restart
これでラズパイでウェブサーバが起動しました。サーバが作動しているかを確認するために別パソコン・スマホからラズパイのサーバにアクセスしてみます。ラズパイのIPアドレスは
ifconfig
で調べられます。そしてパソコンのウェブブラウザで以下をURL欄に入れます。
例えばラズパイIPアドレスが192.168.11.4だとして、
となります。アクセスに成功すればDebian~何たらのデフォルトページが表示されます。続いて、PHPのページをたて、pythonコードを書きます。
次からはVimエディタを使って編集します。
GPIOピン制御プログラム作成・設定
ここからはコードを書きます。することはwebページ作成(Pythonを実行する)>Pythonスクリプト(GPIO23番を制御)>PHPにpython実行権限付与。
まず、cd /var/www/html と打ち込み、sudo vim ledTest.phpでエディタを起動、ESC > i キーと打ち、編集を開始します。
#---ledTest.php---
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LedTest</title>
</head>
<body>
<?php
if(isset($_POST["tart"])){
echo "LED Light ON";
$command = 'sudo python /var/www/html/pinout23.py';
exec($command,$output);
}
else if(isset($_POST["stop"])){
echo "LED Light OFF";
$command = 'sudo /var/www/html/ledStop.py';
exec($command,$output);
}
?>
<form method = "POST" action="">
<input type="submit" value="start" name="start">
<input type="submit" value="stop" name="stop">
</form>
</body>
</html>
コードを打ち終わったらESC > :wqです。次にpythonスクリプトです。こちらはsudo vim pinout23.pyで開き、ESC > i キーと打ち、編集を開始します。
#---pinout23.py----
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23,GPIO.OUT)
GPIO.output(23,True)
#
time.sleep(2)
#
GPIO.output(23,False)
コードを打ち終わったらESC > :wqです。これらを作成した後はサーバーを再起動します。
sudo service apache2 restart
続いて、サーバーにpythonコードの実行権限を与えます。
/etc/sudoers を編集します。
sudo vim /etc/sudoers
そして最下部に以下を追記します。
www-data ALL=(ALL) NOPASSWD: ALL
追記したら、ESC > :wq で終了してください。
実際の配線
配線の+はGPIOピン外側のmicroSDカードスロットのある方から8番目のピンに接続、-は9番目に接続します。LEDの配線は以下の通り。
NeosVRで動作確認
続いてNeosVR内からアクセスして動作することを確認しましょう。ノードは以下の通り。
pulseを押したら、LEDが2秒間点灯するはずです。これでVR内から現実にインタラクションするシステムが出来ました。
振動モーター接続
続いて、振動モーターを接続します。今回使用する振動モーターLA3R5-480はスマホ用バイブレーターなのでラズパイのGPIOの出力電源程度でも動作します。振動モーター配線は以下。
振動モーターを接続した状態でも動くことを確認しましょう。
触覚フィードバック作成へ
最後に、NeosVR内で適当なボックスを出してそのインスペクターを開き、BoxColiderのスロットをLogixTipで取り出します。そのスロットにOnCollisionStartノードを接続し、Pulseを先ほどのPostStringに接続して完成です。OnCollisionノードはこれ。
インスペクターからBoxColliderのスロットを取り出します。この時、TypeはTriggerにしておいてください。
全体を接続するとこんな感じ。
以上で完成です。
使用した感想(追記3/31)
触覚フィードバックを使用した感想ですが、振動モーター式のフィードバックは触覚のリアルさは未だ不十分です。人間に触られたのであれば、圧力や熱を感じますから、そこまでではありません。一方、何度か触られていると視覚情報によって補間され始めますから、感覚の現実性では触覚フィードバックの有る無しでは大きな違いとなりました。また、触覚フィードバックの存在によって、VRの視野外で手が触れたことを感覚でわかるようになるため、これまで鏡やカメラが無ければ分からなかった視界外からの触覚が判別できるようになりました。視界外からの触覚体験はVRコミュニケーションの新たな形態となる可能性があります。
終わりに
大変お疲れ様でした。これでNeosVR内にて他人に触られるとモーターが振動し、触られたような感触が得られるでしょう。このシステムを応用して複数のモーターを接続すれば、全身の触覚フィードバックも可能です。また、カチューシャに4個の振動モーターを配置して頭をなでられたような感触が得られるかもしれません。モータードライバを接続すればもっと大きな振動が得られるでしょう。さらに、NeosVRは数値や文字列の送受信が可能なので、ラズパイに心拍数計などのセンサーを取り付けて、VR内にフィードバックすることも可能です。
それではまた、NeosVRの世界で会いましょう。
この記事が気に入ったらサポートをしてみませんか?