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

2015年12月31日木曜日

河本の実験室の2015年のまとめ

今年も残り数時間となりました。
本業とtempescopeに集中していたため大した開発はできてませんが、今年作ったものや遊んだデータを振り返ってみます。
2013年のまとめ
2014年のまとめ


3月:140文字の「重み」を言語毎に比較してみた

ツイッターのデータを解析することで、140文字制限内ではどれぐらいの情報が伝えられるのか言語毎に比較してみました。思った通り中国語・日本語・韓国語が強いですね。


4月:山手線の混雑データで遊んだ

JRのデータをクローリングして山手線の車両の現在位置や車両毎混雑状況を解析して遊んでみました。公開されてないデータを無理やりクローリングして勝手に解析する、というパターンは色々世の中に知られていないことが発見できて楽しいです。
そのうち中央線もデータが入手できるようになるだろうと期待してたんですが、まだ無いみたいですね。対応したらまた可視化してみます。



4月:携帯2台持ちが捗るスマホケースを作った

iPhoneとNexusの2台持ちをするようになったので、両方を一つにできるスマホケースを3Dプリンタで作ってみました
冗談半分で作ったのですが意外と便利で、8ヶ月経った今でも現役で使ってます。
DMM.makeでモデルをダウンロードしたり3Dプリントできるようにしてあるんですが、未だに印刷した人が僕以外いないみたいです。なんででしょう。便利なのに。


5月:首相の生活を分析してみた

新聞等で公開されている首相動静って要はライフログじゃん、ってことで首相動静をクローリング、自然言語解析して生活をデータ化してみました。
過去の首相毎の移動・食事パターンや、

移動パターンなど、

ここまで知って大丈夫なのか、と不安になるほど細かく首相の生活を見ることができました。
これを更に将来のニュースと関連付けて解析したら面白いなぁ、と思いつつブログにもまとめないまま放置してしまいました。


6月:脇汗が可愛くなるTシャツを作った

脇汗をかいても「なんとなくアリ」になるTシャツ「swea-T」(スウェッティー)をデザインしました
ここで売ってるのですが、未だに注文0です。なんででしょう。


7月:ひまわり8号の衛星写真で遊んでみた

今年の7月から公開になったひまわり8号の衛星写真データをクローリングして、色んな可視化をしてみました。
ブログを見てみただけると分かるように、ちょっと切り出してアニメーションにするだけで美麗な動画が簡単にできてしまいます。
自分の中でのピークは衛星写真から月を発見した瞬間です:

HDの容量がいっぱいになってしまったのでデータの蓄積を一旦やめてしまいましたが、来年3月には皆既日食があり、もう少し遊んでみようかなぁと思ってます。

8月:「歌ってみた」人たちを勝手に合唱にしてみた

ネットにごまんと上がっている「歌ってみた」動画、普段はそこまで聴きたいものではないです。
でも同じ曲を歌ってる人たちを合成して勝手に合唱にしたら面白いんじゃないか、と思ってやってみたら何故か面白かったんです:
リンダリンダはなぜか最後ちょっと涙出そうになりますね。なんでだろう。
もっと事例増やしてウェブサービスにしようと思ってたんですが、権利関係が少し気になってやめました。

今年はこれを使ってクリスマスカードを作ろうとか意気込んでたんですが、そもそもクリスマスカードを送るのが面倒になってやめました。
でもそのうちちゃんとスマホアプリにして、誰でも使えるようにするつもりです。


10月:コーヒーの跡がニコニコになるマグカップ

コーヒーをよく飲むようになって机がすぐ汚れてしまうのに苛ついて、もっと汚れを愛せるようにしてみました。
こういうの多いですね、今年。


12月:曇った窓をディスプレイに変えるTOIKI

ロボット部分は既成品なので僕は制御プログラム書いただけなんですが、3年ぐらい前から作りたいと思っていたものなので喜びが大きかった作品です。
オープンソースロボットのmDrawBotを使い、曇った窓に天気や気温などの通知を書いたり、他の人の窓にショートメッセージを送ったりできるシステムを作りました。
出張先のホテルの窓に、朝起きて子供からのメッセージが描いてあったらちょっと泣くでしょ。僕だけですかね。


tempescopeのクラウドファンディングをした

2012年に開発した、部屋の中に雨を降らせる天気予報デバイスtempescopeは僕が手作りしていたオープンソース版から製品手前の試作版に成長し、ようやく今年の9月にIndiegogoでローンチしました。

残念ながら目標の70%しか集まらず未達成となってしまいましたが、世界中の何万人もの人たちに欲しいと言ってもらえたことは良い経験となりました。
やってみて初めて分かった、クラウドファンディングの沢山の落とし穴をどこかにまとめようと思いつつ、少し時間がたってしまいました。そのうち講演ででも喋ります。

またいつものengadgetGizmodoだけでなく、WiredWashington Postなど普段と違ったところに紹介されたり、蔦屋家電のような場所に展示できたのも嬉しいですね。
ついでに個人的にもテレビ、新聞にも出る機会が増え、講演にも沢山呼ばれるようになりました。

RomoCartを色々発表したり受賞したり。

去年開発したプロジェクションマッピングで部屋をマリオカートの世界に変えてしまうシステムを色々なところで発表してきました。

第8回ニコニコ学会β 研究してみたマッドネスで大賞をもらったり、

VRクリエイティブアワードで審査員特別賞をいただいたり、色々と楽しい思い出ができました。
プロジェクションマッピング×ゲームは可能性が沢山あり、(去年も言ってましたが)RomoCartの先を早く作りたいですね。

まとめ、抱負とか

去年のまとめで掲げた2015年の目標は、「作って満足する」を繰り返すのではなく、ちゃんと最後(製品)まで持っていく、ということでした。
なので今年はtempescopeの製品化に尽力したんですが、結局tempescopeは製品化できず、いつにも増してやりっぱなしで終わってしまいましたね。
来年は30代に突入するということもあり、もう少し大きい物を作っていきたいと思います。

2015年12月20日日曜日

お絵かきロボット「mDrawBot」で遊んだり窓にメッセージ描いてみたりしてみた

スイッチサイエンスがmDrawBotの販売を開始しましたね。
速攻で入手したので遊び倒してみました。

mDrawBotってなに?

中国のオープンソースプロジェクト「MakeBlock」が提供するお絵かきロボットキットです。
PCから取り込んだ絵を卓上に描画するロボットや、卵に描画するロボットなど、4種類のロボットを作ることができます。
僕が今回遊んだのはmSpider、ホワイトボードにぶら下がってマーカーで絵をかけるロボットです。
国内ではスイッチサイエンスから日本語訳されたキットが買えます。

組み立ててみよう

部品点数結構多いです。
組み立ては数時間かかりますが、アクリルと金属パーツが美しいので楽しく作れます。
完成です。ホワイトボードが小さいのでこういう雑な置き方ですが、会社とかにある大型のホワイトボードならすっきり置けそうです。
左右のステッピングモーターで糸の長さを調整し、三角形のプロッターを平面上で動かすことで、絵を描くという構造です。
またペンの上下(描く/描かない)はプロッターに固定されたサーボで制御されます。

とりあえず動かしてみる

(多分)一番下に追加説明しますが、OSXから動かすためには色々面倒な設定が必要です。
設定が終わったら標準ツールのmDraw.appでサンプルファイルを読み込み、
描いてみましょう。
2本の糸で吊るしている割にかなり安定してプロッターを制御できています。感心します。
失敗しやすいポイントとしては、糸が鉛直に近すぎる、もしくは水平に近すぎる状態になると、ステッピングモーターにかかる負荷が増大して脱調します。そうすると初期位置がずれるんで、それ以降の描画がズレてしまいます。
描画領域のどこに動かしても糸が45°ぐらいをキープするように、モーターや描画領域を設定しましょう。

プログラムから制御する

標準のmDraw.appはSVGファイルを読み込んで描画するだけのプログラムです。
これだと自由度が足りないんで、Javaのプログラムから制御できるようにしてしまいましょう。

実はmDrawBotの中身はArduino互換で、シリアル通信で制御できます。
オープンソースなので、スケッチのソースもちゃんと公開されてます。
ソースを読んでシリアル通信の通信仕様が分かったので、Javaから制御するためのライブラリ「jDrawBot」を作ってみました。ご自由にどうぞ。
mSpiderをUSBで繋いだ状態なら、こんな感じでプログラム上から操作できます:
Spider spider=new Spider();
spider.moveTo(new Location(-30,100));
spider.drawTo(new Location(30,70));
spider.moveTo(new Location(30,100));
spider.drawTo(new Location(-30,70));
→「×」印が描画されます。

ちなみに描画操作(moveTo、drawTo)は内部でジョブキューで管理してるんで、非同期にコマンドを送れます。
描画の完了を待ちたい場合はこうしましょう:
Blocker blocker=spider.drawTo(new Location(-30,70));
blocker.block();

プログラムから制御できればこっちのもん、色々遊んでみましょう。

GUIから絵を描く

PCの画面上で絵を描くと、それをホワイトボードに描いてくれるプログラムを作ってみました。
動画gifだと凄く見難いですが、画面に描いた「Hello」がそのままホワイトボードに書かれてます。「直接書けよ」感いっぱいですが、楽しいですね。

例えば会議が始まる前に「前回の打ち合わせ時のホワイトボードを再現しておく」みたいな新しい会議支援システムとか作れそうです。

関数を描く

特に意味はないですが、グラフを描画したりもできます。

写真を描画する

基本的な遊び方が終わったあとは、プログラムで制御してるからこその遊び方をしてみましょう。
上の動画はPCのカメラで写真を撮影したあとOpenCVで線抽出し、ホワイトボードの絵を描くというデモです。
普通は手描きクオリティの絵しか存在しないホワイトボード上に写実的な絵が現れるのは不思議な体験です。



ホワイトボードを「コピペ」する

ホワイトボードの写真から線分抽出して、mDrawBotへの指令に変換して別のホワイトボードに描画するプログラムを作ってみました。

例えば会議室に設置しておいて打ち合わせが始まる前に前回の打ち合わせ時のホワイトボードの状態を再現しておく、とか捗りそうですね。


TOIKI:曇った窓をディスプレイとして使ってみる

ようやく本題です。こんなものを作ってみました:
ペンの先にスポンジをつけて、結露で曇った窓に文字を描くというデモです。
子供の頃、冬の寒い朝に指で絵を描いた記憶は誰でもありますよね?
もし朝起きて、窓に天気やお誕生日のメッセージなどが描かれてたら素敵じゃん?と思ってこういうものを作ってみました。
描いた文字は5分ほどで勝手に消えます。この刹那的な情報表示がなんとなく気に入ってます。ホテルとかにいいんじゃないですかね。

さいごに

たった2本の糸をステッピングモーターで動かす簡単な構造で、ここまで精度よく自由に遊べるロボットができるとは驚きました。
今回は糸で吊るす「mSpider」でしか遊んでませんが、他のロボットもそれぞれ色々ハックしがいがありそうです。

またRomoCart作った時も同じ事言ってましたが、プログラマー一人ではディスプレイの中の世界しか操作できません。だからこそ、プログラマーが実世界を簡単に制御できるようになるこういうキットは偉大だと思います。
是非mDrawBotをきっかけにハードの世界にも一歩踏み込んでみてはいかがでしょうか?

2015年10月11日日曜日

tempescopeがフィギュアケースとして優秀すぎる


ただいまIndiegogoでクラウドファンディング中の「tempescope」は、天気予報等に基づき「明日の空」「どこか別の世界の空」を卓上に再現する物理ディスプレイです。
元々これを作った時に考えていたコンセプトは「空のジオラマ」です。
ジオラマの良さは無限の拡張性、せっかくなので空以外のものと組み合わせて遊んでみました。

雨の中で戦うカメックス
雷雨のDarth Vader。
せつない。
せつない。

これからのフィギュアやジオラマは天候も合わせて飾るのが新常識になると思うんですが、どうでしょう?

ちなみに雲を使えばこんな演出もできます。
雲として使ってないんで邪道ですが。

是非tempescopeのクラウドファンディング、ご支援よろしくお願いします。

2015年9月27日日曜日

Auto-generated popup cards from 3D point cloud data

As a parent, one of the things I like about owning a depth camera (like a Kinect or an Asus Xtion) is that you can take 3D photos of your child.
This is great for immersing in old memories using things like the Oculus Rift,
but has the problem that you can't easily print them out and prop them up on your office desk, as you would do for normal photos.

Sure you could try 3D printing them, but they're still expensive (or really low resolution), and they still don't have the casual feel of printing out photos on paper. (They take up storage space, you can't keep one in your wallet, and they certainly can't be sent in an envelope.)

I noticed the possibility of using popup cards as an easy fix for this problem.
These are lightweight, can handle photo-level quality, and is 3D!
Popup cards, like the things you have in holiday cards.
In this mini-project, I created a program that automatically generates popup cards from 3D point cloud data (collected from an Xtion).

How it works

1. Take a 3D photo of your kid
 or your cat or whatever.


2. Cluster the 3D points into several "layers"
At the point cloud consists of individual coloured points floating in 3D space, which you can't just print onto paper.
Therefore you need to somehow reorganize the points into planes. 

While there are many ways of doing this, I took the quick and dirty approach of simply clustering the points by the distance from the camera.
The image below shows the points as seen from the side, and a histogram of the number of points at each distance from the camera.
You can see that there are peaks in the histogram where there are objects (people, walls, etc). Simply k-means clustering this lets you (sort of) split the points into a small number of layers composed of points that come from spatially close objects.

(Top) The original point cloud seen from the side (Bottom) Histogram of points for distance from camera
This is an example of clustering into 2 layers. You can see that the point cloud was separated into objects in the foreground (1st layer) and the entire back wall (2nd layer).
Point cloud separated into 2 layers
3. Merge the layers into a single card
Now that the point cloud is composed of planes, we can just merge them onto a single card, offsetting one layer from another slightly so that there's a 3D effect when they're cut out.
The below image was generated automatically from the layers, with the red lines added by the program to show where you should cut in order to make this card "popup"-able.
(There are actually some extra steps before this like cleaning the layers to ensure the card stands on its own, but I'm omitting this because it's boring.)
Cut the red dotted lines, and you get a 3D popup card.
And here we have (a rendering of) a popup card:

4. Print it
You can just print the card generated as above, cut the red dotted lines, and you get this:
Popup baby!
They're cheap and quick to mass produce.
The photo quality of the cards is somewhat low (because of the quality of the Xtion camera), but I hope you see that having a 3D popup card literally adds a new layer of expressibility compared to ordinary photos.

Summary

In this project, I proposed and implemented a simple algorithm to auto-generate popup cards from 3D point cloud data generated from off-the-shelf cameras.
This provides a much cheaper alternative to 3D printing models, while also adding an extra dimension of expressibility compared to 2D photos.

- Requiring everyone to take 3D photos using a Kinect/Xtion might be slightly unrealistic, but there are certainly more approachable alternatives (like 3D digital cameras e.g FinePix 3D).  We could also go towards a different direction, where we recognize objects from normal 2D photos and 3D-ify them.

- My main usecase for this is that I want to put (3D) photos of my kid on my work desk. There are actually many more benefits of this proposed method, like being able to fold them up and keep them in your wallet, or you could put them in an envelope and send them as holiday cards.

- I haven't released the source code or made this available as a webservice because I haven't had the time, but contact me if you're interested in making your own popup card.

- As a final side note, taking 3D photos of your family on occasions is highly recommended. They're great ways to look back on old memories.

子供の3D写真からポップアップカードを自動生成しよう

親バカ以外あまり共感できないであろう話をします。

僕はたまに子供の写真をKinectで撮影します。
そうするとこんな風に3Dで記録できるのでOculus Riftで没入したりできるのですが、
このままでは普通の写真みたいに机に飾れないという問題があります。

もちろん3Dプリンタを使えば立体的に印刷することも可能ですが、
今の印刷粒度ではこんな化物みたいになってしまい、子供を愛でるどころの騒ぎではなくなってしまいます。
また3Dプリンタで印刷すると高いし、印刷物は壊れやすい(ので郵送に気使う)し、持ち運びしにくいという問題もあります。
化物みたいになったAくん
「立体的に」「写真並の分解能を保って」「安く」立体画像を飾る方法はないのでしょうか?
こういうの。
これなら立体的ですし、紙の印刷物なので写真クオリティも出せるし、なにより安いですね。
更に畳めば財布に入れておいたり、封筒で実家に送ったりすることもできます。
そこで今回はKinectで撮影した3D点群データから、自動的にポップアップカードを生成するプログラムを作ってみました。

やり方

1. 子供をKinectで撮影する。
 こんな感じの点群が取れます。子供じゃなくて猫とかでもいいです。


2. 点群をクラスタリングして数枚のレイヤーに分ける
元の点群データのままでは面ではないので紙に印刷することはできません。
近い点同士を集めて面状に整形する必要があります。

ここはいろんな方法が考えられますが、今回は超簡易的にカメラからの距離によって(k-meansで)クラスタリングすることで面に分ける、ということを行います。
点群データをカメラからの距離毎に点のヒストグラムにすると、以下図のように人・物・壁の位置にピークが立ちます。

元の点群データを横から見た図(上)と、各距離にある点の数(下)
これを簡単のためとりあえず2クラスタに分けてみるとこんな感じで、距離的に近い点同士が大体同じレイヤにまとまるようにクラスタリングされます。
近い面と遠い面に分かれました
3. 1枚のカードに結合する
で、各レイヤーを一枚の面上に結合し、切り抜き方を計算します。
以下図のように、レイヤーを少しずつ段差をずらして一枚の紙上に結合し、切り抜き線を計算して赤線を引きます。
(この際、最終的なカードがちゃんと自立するようにレイヤーを綺麗にする処理がありますが、面倒なので説明を割愛します。)
赤い点線を切り抜くとレイヤーが切り出される。
こんな感じで、1枚のカードを切り抜くと各レイヤーが立体的に現れる構造が作られます。
 これはシミュレーションのCGですが・・・

4. 実際に印刷してみる
実際に印刷してみました。

完成。かわいい。
大量生産できます。
ちょっと(元がKinectなので)画質が雑ですが、立体ならではの躍動感があります。

まとめ

今回はKinectから取得した点群データに基づき、ポップアップカードを自動生成するアルゴリズムを作り、実験してみました。
3Dプリンタよりも写真に近い画質で立体感を維持したまま、卓上に飾ることのできるディスプレイを作ることができました。
これなら子供の写真をバシバシ写真撮ってガンガン印刷して飾れます。

・Kinectで撮影するのは少し一般向けにはハードルが高いですが、最近は市販の3Dデジカメもあります。また、平面画像からでもオブジェクト認識してレイヤー分けしたりできるかもしれません。

・僕は自分の子供の写真を会社の机に飾りたいという気持ちだけで作りましたが、例えば家族写真を封筒に入れて送ったり、財布に入れておいたりできるという便利さもあります。

・面倒なのでサービスにしてないですが、ポップアップカード作って欲しいという人がいたらご連絡ください。

子供の写真を3Dで残してないのはもったいないぞ!

2015年7月15日水曜日

ひまわり8号の衛星写真で遊んだ

2015年7月7日にひまわり8号が運用開始しました。
このようにめっちゃ綺麗な画像が撮れるので、クローリングして色々動画にしてみました。


データ取得

ここから取りました。550pxのタイルで全球(1倍)から詳細(16倍)まで5段階の画像が10分毎に用意されています。
Firebug等で取得されてる画像を見れば、すぐに元画像の場所が分かります。

いろんな動画作った

で、ゴニョゴニョして、いろんな動画を作ってみました。

7月12日の素敵な瞬間集

手作業で素敵なシーンを選択して動画にしてみました。
日の出が鳥肌たちますね。

台風が見れる!

近づく台風:

こっちは台風12号の発生から日本上陸まで。
ただの熱帯低圧から台風に育ったあと熱帯低気圧に格下げされ、また台風に帰り咲いた根性野郎です。

こちらは2015年7月の全ての台風の経路をアニメーション



火山の噴火が見れる!

なんか煙が上がってる・・・

なんとパプアニューギニアのマナム火山が噴火したらしいです。

これぐらい引いても噴煙が見えるのが凄いですね。

山火事?が見れる!

オーストラリア西部で黒い煙が上がってました。
山火事っぽくもありつつ、これ多分砂漠なのでなにが燃えてるのか不明。
あとこういう煙が何箇所かから上がってたので、もしかして人為的かも知れません。

オーストラリアの潮の満ち引きが見れる!

毎日の12時を見ると、海の色が大きく変わっている様子が見えます。
特に注目は、右中央の赤い砂が見え隠れるするところ。一度行ってみたいですね。


月が見れる!

ずっと探してたのですが、ようやく月を発見しました。台風17号とのツーショットです。

せっかくなので機械的に認識して過去の月の出現も見つけてみました。








タイプラプスを見続けたい

上の動画みたいに綺麗なシーンを手作業で選び出してもいいんですが、面倒ですよね。
そこでいい感じのタイムラプスを自動で生成するプログラムを作りました。
この動画は2時間分の自動生成したタイムラプスです。

部屋に地球を浮かばせたい

地球が好きすぎて、こんなの作りました。
部屋に中心にプカンと浮く地球です。
(実際は衛星画像を投影したただの発泡スチロール)


投影法変換

取得した画像のどのピクセルが地球上のどの座標に対応するのか計算できると色々便利です。
ひまわり8号の画像はNormalized Geostationary Projectionの投影画像。これをゴニョゴニョやると、こんなふうに緯度経度の線を引いたり、

OpenStreetMapから座標と名前を引いてきた都市名を表示したりできるようになりました。

改めて座標とともに見ると、いろんなことがわかります。

画像の一番右端にはハワイも映ってたんですね。

左端はインドまで見えてます

他に「こんな動画が見たい!」というものがあったら是非ご連絡ください。作ります。