List of Projects:
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通信で指令を送るプログラムなので、どんな言語でもサーバーを作れます。
そのうち作ります。

2014年8月16日土曜日

Wikipediaのデータで人生解析をしてみよう

■概要
Wikipediaの人に関する項目を解析は、人の出生から生き方、死に方まで色々載ってる。
せっかく大量にあるんだし、なんか人の人生に関する解析をしてみよう。
例えば:
・こういう幼少を過ごした人はこうなる
・こういう名前/誕生日の人はこういう人生を過ごしやすい
・時代毎の名前/職業等傾向
とか。

■データ
・Wikipediaのデータベースダンプを取得、
・その中から人に関する項目だけフィルタ(「存命人物」や「*没」などの文字列が含まれるエントリ)
・名字、名前、生年月日、死没日などをパースして取得。
・更にカテゴリ名に「日本の*」が含まれるエントリを日本人に関するエントリとして取得。
日本人は計119024人。

以下、雑多な解析結果。

■死亡した年と、その時の年齢





近代化と共に寿命が伸びている様子が見える
戦争時は(Wikipediaに載ってる人の)平均寿命が低くなっている

■「○子」みたいな名前の出現頻度
「まるこ」みたいな名前は少し昔のイメージがあるけど、実際どうなんだろう?

「○子」は1970年がピーク、古くは1875年ぐらいからある
Wikipediaに載ってる一番若い「○子」は2006年生まれの幸田雛子

■名前の長さの平均
最近名前が短くなってる気がするけど、実際どうだろう?
生年毎の平均的な名前(の読み)の長さを算出してみた。
(読みの長さ=拍の数。例えば「ヒョウ」=2)
名前の長さは単調減少している
→戦時中は少しだけ増えてるのが気になる。
→2000年以降のばらつきはデータが少ないため。

■逮捕されやすい職業
一番逮捕されやすい職業はなんだろう?
職業が抽出できたエントリから、職業毎の「逮捕」という単語が含まれるエントリの割合を算出し、ランキングを作ってみた。
「元幹部」エントリの9割(12人中11人)は逮捕済
→その他、いかにもな職業がランキング上位をしめた。
みんな逮捕されたくなかったらアナキストや元事業家は避けよう。

■誕生日分布
1月1日から12月31日まで、一番多い誕生日はいつだろう?
全データから算出:
1月1日の誕生が多く、年末にかけての誕生日が少ない
これって単に、届け出が適当だから?年末に生まれた子はキリよく1月1日の誕生日として届け出る人が多い、とかありそう。

1960年以降の誕生日:
→最近の誕生日だけにすると、1月1日のピークは消える。
昔の人は誕生日を盛ってた?

→今度は、3月31日の誕生日が異様に少ない。(多分有意に)
早生まれを避けるため?それにしては3月30日が下がってなさすぎる。

→7月7日がその付近と比べ1.7倍近い。
明らかに盛ってる。その他8月8日や12月12日などのゾロ目も多い傾向。

■職業毎の生まれた月
生まれた月でなりやすい職業とかあるのだろうか?
まず、全体での月ごとの生まれた人数:

→1月が若干多い傾向。6月が最小。
(本当は月の日数とかで正規化したほうがいいよね)

スポーツ選手の誕生月分布(職業に「選手」という単語が含まれる人の誕生月傾向):
4月が最多で、そこから単調減少。早生まれの悪影響がモロに出てる。
(多分、全体平均で正規化とかして、月ごとのスポーツ選手に成る確率とかに直した方が分かりやすいんだろうけど酔っぱらってるので生データだけ出します)


政治家の誕生月分布(職業に「政治家」という単語が含まれる人の誕生月傾向):

→全体傾向に従ってる?

番外編:エントリに「逮捕」という単語が含まれている人の誕生月分布:
→2月が異様に多い。(検定してないけど多分有意に。)
この記事では連続殺人犯は11月に多いらしいけど。



2014年6月5日木曜日

How to install Java on Yosemite (OS10.10)

The Oracle Java installer fails on Yosemite(Mac OSX10.10) spewing out a very unhelpful error like this:
"The installer requires OS10.7 or above. you have OS10.10" wtf?
This is what happens when you try version checking with a lexicographic comparison.

The easiest way out of this problem is to remove the version checker from the installer.

(1) Get PackageMaker.app
This helpful tool for creating and editing installers used to be bundled with Xcode.  You can still download it from the Xcode downloads page:

(1.1) Go to the Xcode download page
(1.2) Downlaod Auxiliary Tools for Xcode (There are several Aux. Tools, make sure you choose the one that contains PackageManager)

(1.3) This is the one.


(2) Download your favourite JRE/JDK from the Oracle website

(3) Open the .pkg file with PackageMaker. (Just drag and drop the file onto the app.)

(4) Find this line from Requirements, and delete it.


(5) Press "Build and Run", wait above a minute.

(6) Hurrah!

Warnings:
- Just because you can now install Java, it doesn't mean the horrible "double keying" bug is fixed.