1Click飲みRomoCartTempescope色色[:iroiro]Other Projects

2014年10月4日土曜日

RomoCart, a hack to turn your living room into a Mario Kart course

(In Japanese here)


RomoCart is the third in our series of home hack projects (TempescopeMoving Windows, Myra) to make your living room a more exciting place to be in.

Here, we used Romo, an educational robot toy that can be controlled using an iPhone app, to recreate the world of Mario Kart in your living room.



By combining Romo and projection mapping, RomoCart lets you race robots around a race course generated in your living room, whilst firing missiles and throwing bananas at opponents.


How it works


RomoCart initially scans your room, and generates an optimal race course based on the layout of your room.
The RGBD camera finds obstacles,
and generates a circuit that best fits the open space.
The system tracks the Romos using the camera, and projects the game environment according to their positions.
We gave Romos some exciting smoke trails...
During the race, players can pick up various items,
Various items and abilities exist, like the "accelerate" item which makes the player move twice as fast.
they can drop bananas, 
Flood the floor with bananas!

and fire missiles at your friends.

Unleash missiles in your living room!
Because the RGBD camera tracks obstacles in real time, you can even step on incoming missiles to protect your Romo.
In RomoCart, even your mum can join in as a Thwomp
We've given special abilities to different objects.
A teddy bear acts as a rotating turret.

and finally, when you cross the finish line, you're welcomed by fireworks.


RomoCart physically turns a part of your home into a racing game.


The System

RomoCart uses 3 pieces of hardware:

Romo

Buy them from Amazon.
Romos have two caterpillar tracks that you can control independently, thus letting you program a "moving iPhone" very easily.

For RomoCart, we built an app "Romote" that receives and executes commands from a PC wirelessly.
We use a gamepad to let users control the Romo, but override their movements with specific actions when, for example, the Romo gets hit by a missile.
We thus use Romo's as an "intelligent radio controlled car".

RGBD Camera


Hang an RGBD camera (like Kinect, or Xtion Pro Live) from your ceiling, to track objects, and auto-generate circuits.
(We recommend Xtion, as it's lighter and works on USB bus power)

Projector


Any projector will do, but you need to be able to get your projector as high up as possible to project onto a sizeable area of your living room.

We used a pico projector "Sanwa PRJ-3", because it's cheap, fairly bright, and can be attached to common tripods, but short throws should work equally well.

In RomoCart, a single Java program receives the depth feed from Xtion, finds objects (including Romo), renders the game environment, and projects it onto the floor.

Algorithms

How do you calibrate the Xtion against projectors?

You want to project the game environment to the correct position with respect to the Xtion's coordinate system.  You need to calibrate the view projection matrix for the projector.
This is a useful link I used to do this.
I'll release the code when I have the time.

How do you auto-generate the circuit from obstacles?

There are many ways of going about this.
I defined a "good" course to be one that vaguely follows the borders of obstacles, while not actually going through them.
I therefore generate a Voronoi diagram using obstacle borders as control points, and find the longest loop.
1:15 in the video should give you a good idea of how it works.
(If you're interested, give me a message)

How do you track the positions of Romo?

We know the input from the gamepad, so we can use that as prior knowledge of Romo's movement.  We calculate a probability for each object in the view being our Romo (using concordance with the movement given from the gamepad, as well as the object's size and height) to find and track our Romo.
This may be a good place to use particle filters, but things worked pretty well using a fairly dumb tracker.

Summary

We presented a system that uses projection mapping and Romo to turn a portion of your room into a Mario Kart-like world.
We showed that by combining very simple hardware and some common tracking algorithms, we can hack our house to be part of an exciting game environment.
All of the source code will be released when we find the time.

We hope this work will persuade others to follow and start similar projects that integrate the real environment with games.





2014年10月3日金曜日

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と一緒に現実世界に飛び出てみませんか?




PCからRomoを操作するためのリモコンアプリ「Romote」

iPhoneから操作できる教育用ロボット「Romo」、iPhoneアプリだけで完結してる場合はいいのですが、少し凝った事をしたい時はPCから制御したくなります。
そこで、PCからRomoに指令を送れるサーバ+クライントアプリを作りました。

構成
ざっくり説明するとこんな感じです:
Romoではリモコンアプリ「Romote」が走っており、PCではRomoServerManagerが走っていると想定します。
(1) Romoteはネットワーク経由でRomoServerManagerに接続リクエストを出します
(2) するとRomoServerManagerは新しくこのデバイスを制御するためのプロキシRomoModelを作り、ユーザプログラムに返します。
(3) あなたはRomoModelに対してsetRawPower/ setExpression等のコマンドを投げると、
(4) ネットワークを介してRomoteでハンドリングされます。
(5) なお、コマンドによっては結果が帰ってくるものもあります。(getImageやgetDeviceAttitude等)


アプリ側の設定

1. App Storeで「Romote」をダウンロード、インストール
 注:2014/10/1現在まだ公開されていません。
 なお、App Storeでは有料ですが、OneMeでRomoを購入した人は無料でダウンロードできるらしいです。受け取ってない人は聞いてみてください。

2. 起動するとこんな画面が出てきます。

3. Romoに乗せる
乗せないと始まらない。

4. サーバのアドレス/ポート設定
Romoteアプリの画面をタッチすると、設定画面が現れます。
ここでサーバーとなるPCのIPアドレスを設定してください。
ポートはデフォルトのままでいいはず。

PC側の設定(Javaプログラムから制御する場合)
1. GithubのRomoteServerのページをcloneするなりzipでダウンロードするなりしてください。
2. RomoServerSamples/lib/romoServer.jarがRomoと接続するためのサーバプログラムです。
3. 使い方は、サンプルプログラムを参照してください:
StartAndStop.java - 前に進んで止まる
GetImages.java - 0.5秒おきにカメラ画像を取得して表示する
GUI_ExpressionsEmotions.java - 表情を設定する
GamepadDemo.java - ゲームパッドを使ってRomoを操作するデモ
ShowColor.jar - iPhone画面にフルスクリーンで色を表示するデモ

PC側の設定(その他)
romoServerはただのTCP通信で指令を送るプログラムなので、どんな言語でもサーバーを作れます。
そのうち作ります。