2012年8月20日月曜日

世界を盗み聞きするWebサイトの開発記(1)

突然ですが、私は海外旅行をしたことがありません。
お金と勇気がないからです(笑)

だけれども、写真をみて東南アジアの雑踏は、タイムズ・スクエアは、イギリスのライブハウスはどんな雰囲気なのかなと思いを馳せること好きです。タダだし、家にいてもできますから。

私が家に居ながらにして本物の海外旅行をするには、異国を疑似体験するには味覚、嗅覚、視覚、触覚、聴覚のすべてを刺激するのが一番でしょう。
 
時間や場所を切り取るものとして最も普及しているのは写真です。いま、私がこうして布団にねころんでブログを書いている間にも私の友人たちは海外へインターンシップや、旅行などで訪れ、Facebookに写真をこれでもかとアップロードしています。土産話のひとつふたつもしてくれます。

そして、今普及しているもので最も情報量が多いのはビデオではないでしょうか。が、私は手振れでガクガクのホームビデオを見ても海外旅行をした気にはならないと思うのです。

誰もが気軽に、簡単に、その場の雰囲気を切り取ることが出来るのはズバリ音だと思います。 写真は光の加減で変わってしまうし、暗いものは気軽には写せない。

例えば、秋の夜に月が綺麗だったとき、手持ちのiPhoneで綺麗に月の写真が取れるでしょうか?自分の目で見たままの感動をその写真でもって他人に伝えられるでしょうか?

鳴いている虫や木の葉を揺らす風の音、 川の流れる音、そういう音を目を閉じて聞いていると自然と風景が想起されることはありませんか?

そんなふうに私は、世界各地のいろいろな場所、例えばクラスルームであったり電車の中であったり、あるいは雑踏の中。そういう場所で現地に住む人が普段聞く環境音を聞くことで異国情緒を感じてみたいと思いました。

そこで、世界中から気軽に環境音を投稿できるWEBサイトを作ってみようと思っています。名前はもう決まっています。”WallHole”世界を盗み聞きする壁の穴。今、誰しもが ネットワークで世界とつながっています。地球の裏側の人がどんな足音で歩いているか気になりませんか?ナイアガラ瀑布はどんな音がするのか気になりませんか?私、気になります!知らないなんて、損じゃありませんか!

2012年8月2日木曜日

ARToolKitをProcessingで使う(2)

第二回はサンプルプログラムを解析します.

では以下がSimpleLiteを見ていきます.

/**
  NyARToolkit for proce55ing/1.0.0
  (c)2008-2011 nyatla
  airmail(at)ebony.plala.or.jp
**/

import processing.video.*;
import jp.nyatla.nyar4psg.*;

Capture cam;
MultiMarker nya;

void setup() {
  size(640,480,P3D);
  colorMode(RGB, 256);
  println(MultiMarker.VERSION);
  cam=new Capture(this,640,480);
  nya=new MultiMarker(this,width,height,"camera_para.dat",NyAR4PsgConfig.CONFIG_PSG);
  nya.addARMarker("patt.hiro",80);
}

void draw()
{
  if (cam.available() !=true) {
      return;
  }
  cam.read();
  nya.detect(cam);
  background(0);
  nya.drawBackground(cam);//frustumを考慮した背景描画
  if((!nya.isExistMarker(0))){
    return;
  }
  nya.beginTransform(0);
  fill(0,0,255);
  translate(0,0,20);
  box(40);
  nya.endTransform();
}

以上がサンプルプログラムです.
一行づつ関数の働きを見ていきます.

setup(),draw()はProcessingの関数です.
draw()内部の処理は,実行中繰り返されます.
setup()は実行時に一度呼び出されます.

プログラムの実行順に解析をしていきます.
まずsetup()内部から見ていきます.
size()関数はProcessing実行時のウインドウの大きさを指定します.
第一引数は横幅のピクセル数,第二引数は縦幅のピクセル数,第三引数は描画モードです.

camはCaptureクラスのインスタンスです.
cam=new Capture(this,640,480)でカメラからの画像取得サイズを決定します.

nyaはNyARToolKitで複数マーカを使用するためのクラスMultimarkerクラスのインスタンスです.
nya=new MultiMarker(this,width,height,"camera_para.dat",NyAR4PsgConfig.CONFIG_PSG)
ここでcamera_para.datはカメラ内部のパラメータを記述したファイルで,dataフォルダ内に存在しています. これは汎用的な値を採用しているため,自分が使用するカメラでキャリブレーションを行い,置き換えることでマーカ位置計測精度等を向上させることができるようになります.
このカメラのキャリブレーション方法については後日書こうとおもいます.

nya.addARMarker("patt.hiro",80)ではマーカのファイルを読み込むためのメソッドです.
patt.hiroはdataフォルダ内に存在します.このファイルを自分が作成したマーカのものに置き換えることで,好きなマーカでNyARToolKitを扱うことができます.

次にDraw()内部です.
最初のif文条件分岐処理でカメラが利用できない場合の処理について記述しています.
cam.availacle()では新しい画像が取得できたかどうか判断します.
この場合,新しい画像が取得できなかった場合にループを中断し,先頭に移動します.

cam.read()では,カメラで撮影した最新の画像を読み込みます.

nya.detect(cam)では画像からマーカを検出し,3次元位置を計算します.
この引数は,PImageクラスのオブジェクトである必要があります.

ここではcamを入れていますが,このクラスで扱う画像はPImageだと思われるため問題ありません.

 background(0)は重畳表示したものをリフレッシュする働きがあります.この部分をコメントアウトすると以下のようになります.
 次のif文ではマーカを検出したかどうかで分岐します.nya.isExistMarker(0)では対象としたマーカが存在する場合にtrueを返します.引数としている0は読み込んだマーカのIDです.今回はマーカを一つしか読み込んでいないためIDは0のみになっています.

対象とするマーカが存在することを確認できたら,重畳表示する3Dオブジェクトの描画処理に移ります. nya.beginTransform(0)および nya.endTransform(0)で囲んだ部分がそれに該当します.
  fill(0,0,255);
  translate(0,0,20);
  box(40);
となっている部分で最も重要なのがtranslateです.これは座標系を並進させるメソッドです.今回box(40)ということで一辺40mmの立方形を描画したいのですが,boxの中心は箱の中心になっています.そのため,transrateさせずに描画するとboxの半分つまり20mmしかマーカの上に出ていないことになってしまい,マーカの白いところに表示させるはずだったboxがずれてしまいます.

下の写真はtransrateさせた場合とtransrateさせない場合を比較したものです.

 私自身ARToolKitではこのように座標系をどう動かすかといった座標変換の考え方が最も難しいと感じています.

fillは塗りつぶしの色を指定するメソッドです. 第一引数から順にRed,Green,Blueに対応していて,それぞれ0~255の範囲の値で色の強さを指定することができます.ですから例えば,fill(255,0,0)とすることによって赤い立方体を描画することが可能になります.

これでSimpleLiteがどのような処理を行なっているのかわかるようになりました.
このサンプルプログラムはNyARToolKitを扱う上で最小の構成になっています.さらに様々な機能を追加していくためにはもっと長いサンプルを読む必要がありそうですが,ドキュメントがかなりしっかりと書かれているためそれほど苦労しないですみそうです.

2012年8月1日水曜日

ARToolKitをProcessingで使う(1)

ARToolKitをProcessingに導入してみます.
この記事を読むとサンプルプログラムが実行できるようになります.

*おことわり*
私は開発にWindows7 64bit, Processingのバージョンは1.5.1を使用しています.

1.Example ->Libraries -> Video ->  Ascii Videoを使ってWebカメラから画像がキャプチャーできるか調べます.

・この時私の環境では,QuickTimeがない.というエラーが出たのでここからインストール
・さらにno capture could be found or the vdig is not installed correctly processingというエラーが出たら,ここからVDIGをダウンロード&インストールします。
*Atelier:Mitsubaさんのページを参考にさせていただきました.
ありがとうございました.http://d.hatena.ne.jp/c-mitsuba/20100715/1279163495

が!!!!
problem connecting video output to quicktime
こんなエラーが出てしまいました.

*回避方法*
・Without JAVAを使用している場合
64bitOSだと色々な事情でカメラにアクセスできないようです.
JDK入りのものにインストールしなおしましょう.
*プラノワの空想科学人生さんのページを参考にさせていただきました.
ありがとうございました.http://www.pronowa.com/blog/?p=352

・WinVDIG105をインストールした.
ダメみたいです.
めんどくさいですがQuickTimeをアンインストールした後に101をインストールしなおしましょう.
ここを参考にしました.

・それでもダメ
おそらく関係ないと思いますが,念の為にQuickTimeは古いものを入れてみました.
試してみるのもいいかもしれません.私はこれを入れました.

いきなりつまずいてしまいましたが,次に進みます.

2. Example ->Libraries -> OpenGL -> Esferaを実行してOpenGL機能を使用できるかどうか確認します.ここではとくに問題は起きませんでした.

3. NyARToolKitをダウンロードして任意の場所に解凍します.
ダウンロードはここから.

4.NyARToolKitをProcessingにインストール
新しいライブラリを入手した際にはこれをやります.
解凍したフォルダをまとめてprocessing/mode/librariesにコピーし,そのフォルダ名をlibraryの中の.jarファイルと同じ名前に変更します.今回だったら,フォルダ名は”NyARToolKit”です.
これでExampleに表示されるようになりました.

5.サンプルプログラムを実行します.
まず,NyARToolKit/DataフォルダのPattHiro.pdfを印刷しました.
そしてExamplesの中からSimpleLiteを実行してみます.
Webカメラの中にマーカを入れると。しっかりキューブが重畳表示されました.












これでProcessingへのARToolKitの導入は完了です.

私は専攻科研究でARToolKitを扱っているので,本家にはそれなりに詳しいのですが,こちらの関数の仕様等はまだ把握していません.これから遊びながら勉強してみようと思います.



Likebuttonを現実の世界に登場させてみる(1)

こんにちは。
私が通う沼津高専では,8月11日に一日体験入学というものが開催されます.
その一日体験入学では,各研究室が展示をします.
去年展示してみて,展示に対する来場者の反応(ウケた,ウケない)がよくわからなかったので,今年は反応を可視化したいなと思っています.

そこで,実世界にいいね!ボタンを登場させ,いいね!の数=人気とします.

ポンチ絵↓












絵が下手すみません(笑)
SolidWorksなどの3DCADを使えるようになりたいですね~.

ボタンが押された数をかぞえるだけではつまらないので,インターネットに接続して,ボタンを押すことで何らかのアクションを起こします.とりあえずTwitterにいいねの数を呟いてみることにしました.

システム概要としては
Arduino→Processing→Twitter

・Arduinoに搭載したスイッチが押されるとSerialライブラリを使ってProcessingに1bitを送信
・押していない間は,Serial.flush()を使ってバッファをクリアします.
・チャタリング除去のためにDelayを組み込みます.

・Processing側ではSerialライブラリでArduinoからのデータを受信
・Twitter4Jライブラリを使ってProcessingからTwitterへのつぶやきを実装します.

次回はプログラムのソースを公開して詳しい内容について説明したいと思います.

下ではスイッチの代わりにブレットボードで回路をショートさせています.