Oculus RiftとLeap Motionを使ったVRドライブの開発

~課題研究の授業で作ったリアリティーのあるドライビングシミュレータ

<大学の先生が集まる学会で研究の過程と成果を発表>

千葉県立柏の葉高校情報数理科2年 村脇光洋くん、福田敏史くん

(2016年7月掲載)

村脇くん(左)、福田くん(右)
村脇くん(左)、福田くん(右)

チームで1年間、1つのテーマで研究を進める「課題研究」

 

柏の葉高校情報理数科は、全国に19校ある情報科を持つ高校の一つで、様々な情報に関する授業を行っています。そして、僕たち情報理数科には、複数人のチームを組んで1年間で一つのテーマについて研究を進めていく「課題研究」という授業があります。

 

テーマの例としては、ドローンを作る班や、人工無脳を作っている班がありますが、僕たちがこの課題研究で取り組んだのはVR(Virtual Reality)です。VRとは仮想現実のことで、このように、顔にヘッドマウントディスプレイと呼ばれるものを付けて、自分は現実世界にいながら、その映し出された世界にいるような感覚を得ることができるものです。

 

このVRで使用するデバイスは、いろいろなものが市販されているのですが、今回はOculus Rift DK2を使うことにしました。これを使う理由の一つは、ディスプレイが左右に分割されているので、そこに微妙な違いのある動画を見せることによって、立体感のある映像を見せることができるからです。また、Oculus Riftはヘッドマウントディスプレイの中では高い解像度を持っています。さらに、学校の先生がこれをお持ちになっていて、それをお借りすることができたのも大きな理由です。僕たちは高校生なので、デバイスにあまりお金をかけるわけにもいかず、基本的に無料でやりたかったので、これを使うことにしました。

 

Oculus Riftは基本的には、トラッキング性能(ユーザーが首を振った時、その動きに追随する機能)が高く、またリフレッシュ・レート(※1)が75Hzと高かったので、これを採用しました。この値が低いと、VR酔いといって、自分の動きと映像が合わなくて気持ち悪くなったりしてしまうので、この点でもOculus Riftは優れています。

 

※1 コンピュータ等のディスプレイが、単位時間あたりどれだけリフレッシュするかという値のこと。通常ヘルツ (Hz)を単位として、1秒間にリフレッシュする回数を表す。

 

Oculus Riftの機能の制限を利用して、ドライビングシミュレータを作る

 

このOculus Riftを使って何をしようかと考え、Leap Motionという指の動きを検出するデバイスも一緒に使って何かを作ることにしました。この2つを使うことによって、ユーザーの頭と手の動きを仮想空間でも実現でき、今までにないゲームや没入型シミュレータを作ることができるのではないかと考えたのです。

 

しかし、この2つのデバイスには大きな制限があります。Oculus Riftを装着した人は歩き回ることができません。Oculus Riftは、センサーでヘッドマウントディスプレイが今どこにあってどう動いたかを検出しているのですが、その範囲は、歩き回ることができない程度です。そのため、歩き回らないでもよいものを作ることにしました。

 

さらにLeap Motionも、どこかに置いた上での手や指の動きしか検出することができないことです。そこで、手や指もあまり大きく動かさないようなものを作ろうと思いました。

 

そこで、僕たちが考えたのは自動車のドライビングシミュレータです。僕たちはこれを「VRドライブ」と名付けました。このVRドライブは、まだ免許が取れない高校生でも、かなりリアルな運転が体験できます。そして、このVRを足がかりとして、もっとほかの高度なシミュレータを作ろうということも考えました。

 

このVRドライブですが、まずユーザーが実際に車を運転する動作をします。それをOculus RiftとLeap Motionの2つのデバイスで仮想空間に投影して、仮想空間で自分が車を運転しているかのように見せるという仕組みになっています。

 

制作工程は必要な基本技術を習得することから

 

実際にどのように開発を行ったのかお話しします。まず、最初からVRドライブを作るのではなくて、そのために必要な基本的な技術を抽出するところから始めました。

 

今回は、開発にUnityというソフトウェアを使ったので、まずその基本操作を身に付けました。Unityでは、三次元空間のシーンを作成して、そこに様々なオブジェクトを配置し、そのスクリプトをコーディングしていくことが基本操作になります。 

 

スクリプトのコーディングにはC#という言語を使うので、それも学ぶことにしました。そのためには、まずこのような「ブロックシューティングアプリケーション」という、簡単なアプリケーションを作成することで操作を身に付けました。これは、マウスでクリックしたところに弾が飛んで、ブロックに当たったらブロックが消えるという、単純なアプリケーションです。

 

そして2つめの工程で、VRのキモである各デバイスとの連携をしました。この工程では、実際にVRドライブのプロトタイプを作成することにしました。ユーザーはOculus Riftで視界を動かし、フットペダルで自動車のアクセル・ブレーキを足で操作するようにしました。また、Leap Motionの上に手をかざすと、その手を認識して仮想空間にその動きを反映するという機能も付けました。

 

そして、3つめの工程では、プロトタイプとして作ったVRドライブのシミュレータ性能を向上させていきました。この工程では、まず実際に自動車を運転するようなステージに変更しました。そして、製作に使っていた自動車のモデルが、クリエイティブ・コモンズのCC-BYというライセンスだったので、これで実際に、オブジェクトやマテリアルを作ったり改変したりしていきました。

 

また、ドライビングのシミュレートに必要な、信号などのアシスト機能も付けていきました。そして、これら一つひとつをきちんと動作させるために、C#でスクリプトを作成しました。

 

 

ハンドルを持っている感覚をグローブのデバイスで

 

ここまででとりあえず「自動車のシミュレート」のための最低限の機能は揃ったので、授業で発表したところ、いくつか意見をいただきました。その中に「ハンドルを持っている感覚がない」というものがありました。これは、リアリティーの高いシミュレータを作る上では、避けては通れない問題なので、これをどうにかして克服したいと思いました。

 

そのために、まずハンドルの形のような物理的なデバイスを使うということを考えました。しかし、物理的なデバイスを使ってしまうと、少しでも操作を変えたい、あるいは、シミュレータを作りたいとなったときに、またこのデバイスを一つひとつ作り直さなければならず、非常に汎用性が低くなってしまうので、何とかこれを避ける方法を考えました。

 

そこで考えたのが、グローブのデバイスを自作するということです。これは実際にユーザーの手にはめることによって、ユーザーの手の触覚から仮想空間での行動をフィードバックしていく感じです。このように、Unityでの仮想空間で、Leap Motionで検出された手が仮想空間上のハンドルに触れたということを認識すると、仮想空間上の手がSerial送信でArduinoに信号を送ります。そして、ArduinoからPWMという方式でアナログ出力端子につないだ振動モーターを振動させます。この振動モーターをグローブに仕込んでおいて、ユーザーにそれを伝えるという形になります。そして、振動モーターの振動は255段変えることができるので、ハンドルを握っているという感覚をユーザーに与えるのには非常にいい効果を発揮したかなと思います。

最終的なVRドライブの構成です。まずOculus RiftにLeap Motionという市販のVRのデバイス2つと、自分で作ったデバイスを2つ。これを、Unityというソフトウェアで作ったもので連携させて、VRドライブを実現したということになります。簡単なデモ映像をお見せします。これが、実際にユーザーが見ている画像です。このように、顔を動かすことによって、実際に視界を操作することができます。そして、ユーザーが自分の足元にあるフットペダルというデバイスを足で踏むことによって進んでいます。右のほうに見えるのが現実世界の映像です。このように、手を曲げることによって仮想空間の車を運転しています。

 

リアリティの高いシミュレータを作るために工夫したこと

 

まとめです。今回の開発では、開発前にリアリティーの高いシミュレータを作るためにはどういうことをすればいいのかということを、何個か条件に上げていました。その中で達成できたのが、ユーザーの顔や手足の動きを仮想空間上に反映するということです。また、自動車の動きに慣性を持たせること。これは、もし自動車がブレーキをかけても急には止まれないというようなことを、仮想空間上でも実現したということです。あとは、信号機や速度計、メーターなどを開発することによって、シミュレータの性能を向上させました。

 

一方で、達成できなかったのはフィールドの作り込みです。例えば、信号機を無視したらそれをユーザーに伝えるということや、町の中を別の車や歩行者が行き来している、といったものをもっと作りたかったのですが、そこまではできませんでした。あと、自動車自体の作り込みもまだまだできていないところが多く、ミラーやウインカーなど、自動車のシミュレートに必要なものも、まだ実装できていない部分がいろいろあります。

 

最後にこの1年間の開発を通じて、僕たちが学んだことや考えたことについてお話ししたいと思います。まず、ゲームエンジンでの開発は自分たちにとって初めての体験でしたので、どのようにして三次元上にオブジェクトを開発し、それをコーディングしていくのかということを学びました。そして、Arduinoのプログラミングや連携も初めてだったので、自分でデバイスを作ってみることを体験できました。さらに、1年間を通して複数人での開発ということも、今まであまりしたことがなかったので、非常にいい経験だったと思います。実際に、構想の段階から進捗を管理していって、Git(※2)などを使ってプロジェクトをできるだけ円滑に連携、共有させていくというようなことを学びました。

 

※2 プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システム

 

そして、VRというのはハードウェアとソフトウェアがちゃんと両立していないと、リアリティーの高いシミュレータを作ることはできないということを感じました。VRは比較的新しい技術ですが、それを高校生の時期に身をもって経験できたというのは非常によかったかなと思います。

 

まだまだこのVRドライブは至らない部分が数多くあるのですが、今後3年生になっても、また続けていけたらなと思っています。

 

 

[質疑応答]

私立大学教員:うちの学部(文系)の2、3年生と比べても遜色ない、大変いい報告で、非常に感心しました。実際に作られて、これを第三者によるテストプレイを行ったと思いますが、どういう方にテストプレイをしてもらったのでしょうか。

 

福田くん:最終段階ではそういう機会がなかったので、テストプレイはしていませんが、途中経過としては、学校の中での発表があったので、それに来てくれた中学生や同学年の人に体験してもらいました。

 

私立大学教員:おそらく、最もいいのは君たちの学校の近くの自動車教習所の教官が適任ではないかと思うのですが、いかがでしょうか。彼らはプロなので。

 

村脇くん:もっとシミュレータの性能を向上させていって、自分たちでは限界があると感じたときには、そういうプロの方の意見をもらいたいなとは思っています。

 

【発表を終えて】

■今回学会で発表した感想を教えてください。

福田くん:最初は緊張しましたが、やっているうちにほぐれてきて、最後は気持ちよく終わることができました。高校生のうちに学会で発表できる機会はなかなかないと思うので、貴重な経験だったと思います。

 

 

村脇くん:実は今テスト期間中なので、けっこう忙しかったです。でも、自分たちのできる限りの準備ができたので、いい経験だったと思います。

 

■練習はどのくらいしましたか。

 

福田くん:プレゼンの練習としては1週間くらい…かな。

 

村脇くん:もともと学校で発表した時に使ったものに、新たに要素を加えていったという感じです。

 

■学会発表ということで、意識したことや工夫したことはありますか。

村脇くん:正確な言葉・表現で正しい情報を伝えるように気を付けました。それから、単に「シミュレータを作りました」だけではなく、そこから何を得たかということも話せるようにしました。

 

福田くん:学校内でも何回かプレゼンをしているので、それをベースにしましたが、情報の専門に聴いていただくので、内容も濃くしました。

 

■今回の研究でいちばん苦労したことは何でしょうか。

 

福田くん:Leap MotionとUnityを接続させるのが、ファイルをいろいろといじらないといけなったのでつらかったです。

 

村脇くん:Leap Motionでハンドル操作をできるようにするのに、ハンドルのあたり判定の領域や、当たった時に動かす角度を決めるのが大変でした。

 

 

■今後もこの研究を続けていきますか。

 

福田くん:相棒次第、かな(笑)。今回は完成させるところまではでなかったので、完成までいきたいという気持ちはあります。

 

村脇くん:僕もそうですね。でも一方で高校時代にいろいろなことに挑戦して、視野を広げたい、ということもあります。

 

■お二人の将来の夢や目標を教えてください。

 

福田くん:自分は大学でも、その先もITに関わっていきたいです。大きく言ってしまうと、IT技術でアメリカなど先進国に追いつくことに貢献したいです。

 

村脇くん:僕もエンジニアになりたいと思っています。プログラミングすることが目的にならないように、その先に皆の生活や体験を変えられるようなものが作れるようになりたいと思っています。

 

河合塾
キミのミライ発見
わくわくキャッチ!