RomoCart散らかった部屋ほど面白い、リアルの部屋のレーシングゲーム

RomoCart:Romoとプロジェクションマッピングで部屋をマリ○カートのサーキットにしてみた

こんにちは、河本です。
最近なにかと話題の教育用ロボット「Romo」を入手出来たので、早速こんなものを作ってみました。

見飽きた部屋をマ○オカート風ゲームのサーキットに変えてしまう、レーシングマニア垂涎のシステムです。

中学生のころ時間も忘れてロケットスタートを極め、バナナを置き、甲羅を投げた思い出を、自分の部屋でまた体験したくはありませんか?
プロジェクションマッピングとロボットを使ってその夢を実現するのが「RomoCart」です。
何言ってるか分からんという方は、まず上記ビデオを見てください。

どんなゲームなの?

RomoCartは、まず部屋のレイアウトをカメラで測定して、最適なコースを自動生成するところから始まります。

部屋の中の障害物を認識し・・・

いいコースを自動生成します。

そしてRomoの位置と向きを認識し、

Romoを認識してスポットライト投影中

レースが始まります。
ゴミ箱や椅子の間をぬってゴールを目指しましょう。

走ると煙が出る!

レース中は色々アイテムを拾ったり、

加速アイテムとかバナナアイテムとか色々あります

バナナを置いたり、

部屋をバナナだらけにしよう

ミサイルを撃ったりしましょう。

居間でミサイルが炸裂

現実拡張型のゲームなので、例えば飛んできたミサイルを踏んで壊すこともできます。

RomoCartではお母さんもドッスンです

物を認識して機能を持たせることもできます。

例えばクマのぬいぐるみを置くと回転砲台になるようにしてみました。

弾幕グマ

そんなこんなを経て、早くゴールを目指しましょう。

部屋に花火が咲きます

マリ○カートの世界を家の中で物理的に再現する、そんな未来のゲームの姿を先取りしてみました。

システム構成

RomoCartで使うのは、3つのハードです:

Romo

教育用ロボット「Romo」です。国内だとOneMeストアで買えます。

iPhoneアプリで二つのキャタピラを自由に制御できるので、思うがままに前進・回転・後退させられます。

簡単に「走るiPhone」が作れちゃうナイスなロボットです。

RomoCartでは、PCからネットワーク経由でRomoに指令を出せるリモコンアプリ「Romote」を作り、

PCに繋いだゲームコントローラーから操作できるようにしました。

更にミサイルが当たったりバナナを踏んだりすると、制御をオーバーライドしてスピンさせたり加速させたりしています。

プログラムで制御できるからこそ、ただのラジコンには不可能な表現が実現できます。

ちなみにRomote AppはApp Store公開予定ですが、OneMeでRomoを買うと、無料でソースごと貰えるようにしました。

深度カメラ

KinectでもXtion Pro Liveでも何でもいいので深度カメラを天井に設置しましょう。

個人的には外部電源無しで動くXtionがおすすめです。

RomoCartではこれを使って床の上の物体を認識してRomoの場所をトラッキングしたり、サーキットを自動生成したりしてます。

関係ないですが、天井に深度カメラを常につけておくと、いつでも立体家族写真が撮れて楽しいですよ。

プロジェクター

どんなプロジェクターでもいいんですが、床に投影するためにはなるべく上から距離を稼いで投影しないといけません。

そこでおすすめなのはこいつです:

超小型で三脚の上に付けられるので、上の写真のように天井近くに 設置するのも容易です。

RomoCartでは、XtionのフィードをJavaで書いたプログラムで受け取りRomoの居場所をトラッキングし、プロジェクターでゲーム環境を床に投影して、ゲーム進行を行います。
割と簡単な構成ですね。

アルゴリズム的な話

プロジェクターとXtionってどうやってキャリブレーションするの?

Xtionで測った3次元空間に対して投影する際、プロジェクターのどの座標系に射影できる必要があります。

Xtionとプロジェクターの対応点を沢山(手動でも自動でも)探して射影行列を作り、プロジェクタの位置と姿勢を推定します。
そのあとゲーム環境を(JMonkeyEngineでもUnityでもなんでも使って)3Dで描画し、推定したカメラ位置から見た絵を投影します。

このへんのリンクを参考にしてください。

そのうちプログラムを公開します。

部屋のレイアウトからコースの自動生成ってどうやってるの?

いろんな考え方があると思いますが、僕は「いいコース=遮蔽物に沿いつつ、それほど近寄らない経路」という仮定を置き、ボロノイ図から最長ループを探索する、というアルゴリズムを作ってみました。

詳細知りたい人はメッセージください。

文献調べてませんが、色んな方法あると思います。もっといい方法考え着いたら是非教えて下さい。

Romoの位置の認識ってどうやるの?

今回はRomoの挙動が事前にコントローラーの入力から分かっているので、床の上の物体の動きとコントローラーの入力値から尤度を計算して、最も尤度が高い物体をRomoとして認識しています。

他にも粒子フィルタ使ったりとか色々な方法があり得ると思います。

ちなみに位置認識は割と容易ですが、Romoの向きの認識はもっと難易度高いです。面白い問題なので是非チャレンジしてみてください。

おわりに

プロジェクションマッピング+ロボットの構成は熱い!

プロジェクションマッピングというと静止した物体にマッピングするのが一般的ですが、

ロボットの環境を投影するために使うと、ロボットの表現力を幾倍にも高められます。

ラジコンだけではただのラジコンですが、そこに認識+投影を加えると、今まではゲームでしか出来なかった「ミサイルを撃つ」、「滑る床を作る」、「魔法を使う」等の色んなことが現実でも可能になります。

今回はレーシングゲームとして実装しましたが、他にも幅広いゲームや、今までにない表現がプロジェクションマッピング+Romoで出来ますね。

Romoはプログラマーに「足」を与える

ハードウェアを作れないソフトウェア技術者が「リアル」な世界に触れるための道具が少しずつ揃ってきました。

スマホやKinectの普及で現実がセンシングできるようになり、ピコプロジェクターやHMDにより現実への情報提示ができるようになりました。

Romoは更に「動き」を与える新たな道具です。

これまで画面内の世界に生きてきたプログラマーでも、Romoを使えばいとも簡単に現実世界に飛び出て「さわれる」「動かせる」「踏める」システムが作れます。

ぜひ、みなさんもRomoと一緒に現実世界に飛び出てみませんか?

RomoCart:Romoとプロジェクションマッピングで部屋をマリ○カートのサーキットにしてみた — RomoCart