社畜になった乙女工作部で展示したものの説明と解説と感想

はじめに

12/1、2と日本科学未来館でおこなわれたMaker Faire Tokyo 2012に市原えつこ(@moja_etsuko)、クガナオミ(@kuga703)と「社畜になった乙女工作部」として出展してきました。
まず社畜でもないしもちろん乙女でもないので自分の中でも突っ込みどころが満載なのですが、「工作」担当ということで許してもらえればと思います笑

ステレオタイプな会社をネタにした作品を作ったので、それらのご紹介をしたいと思います。

kinect謝罪

kinectの前でお辞儀をすると謝罪音声がスピーカーから流れます。
腰の曲がった角度を計算していて、実は素早くお辞儀すると異なる音声が流れるようになっていました(当日は人が多すぎて難しかったのですが)。
言語はprocessing、kinectを動作させるためにNITE+openNI+simple-openniを使っています(こちらのエントリをどうぞ。)

動作中の様子は下記のようになっています。

本音がわかる、ARお茶汲み

湯のみの中にARマーカーが貼ってあり、カメラにかざすとOLが給湯室でお茶をどのように入れていたかの動画が流れ始めます。
知りたくなかった本音がわかってしまう作品となっています。
ARマーカーを使ったものの多くが3DのCGを重畳するシステムだと思うのですが、これはマーカーそのものに動画を描画することで現実世界のモノが動画プレイヤーとなるような体験が出来て開発中もなかなか面白かったです。
これも言語はprocessingで、ARマーカーのライブラリにはNyARToolkitを使っています(こちらのエントリが参考になるかもしれません)。

動作中の様子はこんな感じ。

シュレッダー内蔵名刺入れ

最後はこれです。
名刺入れの中にシュレッダーを内蔵し、名刺をもらったその場で裁断することが出来ます。

↑これを四角くぶった切りました。
正直これが一番反応が良く、これだけは開発してなかったので僕としては喜んでいいのか悪いのかという感じでした笑

こんな感じで裁断します(kinect謝罪が誤作動しまくっております)。

MFT2012の感想

というわけで4つの作品を展示しまして、このうち3つの開発を担当しました。
準備に2ヶ月しかなかったのでなかなか大変でした・・・。
結局技術的に簡単なものを物量でおしていく、というかたちになりましたが、それぞれのストーリーというかコンテンツが好評だったようでなによりでした。

去年はリアルslコマンドという作品でMTM07に出展しましたが、それ以上の人で大変でした。
いろんな方が書かれていますが、もう少しゆとりがある場所だと良かったかなーと思いました。
ただこれが初の有料化ですし、今回で成功してだんだんとスケールアップしていくことを期待しています。
ゆくゆくはコミケと同じくらいの規模に・・・と夢は広がります。
クリス・アンダーソンが「MAKERS」を書いたことでにわかにMake:や3Dプリンタバズワードのようにもてはやされていますが、いちMakerとしてはこれからも「大人になっても楽しめる文化祭」であってほしいと勝手に思っています。

何はともあれ今回もとても楽しいイベントで、運営スタッフの皆様本当にお疲れ様でした!
また会場や懇親会で出会ったMakerの皆さん、また見に来てくださった皆さんもありがとうございました。
これからもむだなものばかり作っていきたいと思います。

processingでkinectを使うメモ

kinectを使う際に、processingがOpenNIを扱えるようになったらしいので使ってみた。
下記のエントリを参考に使えるようになりました。
Mac+Kinect+Processingで遊んでみる - karaage. [からあげとポニーテイル]

まだまだサンプルを走らせたりリファレンスを見た程度だが、ひとまずのメモ書き。
・スケルトン(各関節)の座標はSimpleOpenNI#getJointPositionSkeletonで取ってこれる。
 →これはexampleにあるUser.pdeを参考にすると良い。
・ 取得した関節の座標を描画するには、まずSimpleOpenNI#convertRealWorldToProjectiveで座標系を変換すること。
 →変換後は普通にprocessingの描画関数に放り込める。

openframeworksでしかスケルトンを扱えないかと思っていたが、こんなに簡単に扱えるとは驚き。

[追記]
RGB画像を表示するために、下記のエントリを参考にしました。
simple-openni Tutorial

音声ファイルを再生するには

processingで音声ファイルを再生するには、minimライブラリを使えば良いみたい。
下記のブログを参考にさせていただきました。
Processingのminimライブラリで音楽を停止するとき | Morikuma Works

注意点としては、mp3ファイルを再生する際にIDタグ(タイトルやアルバム名など)が入っているとエラーが出てしまうということ。
wavファイルをmp3にタグ無しで変換するのが良さそう。

MusicShieldのコードを少し読んでみる

microSDを1GBにしたら動いたので、コードを見てみる。
やりたいこととしては、
 ・センサの入力値に合わせて再生する曲を選択する
というのがある。
なので、毎ループごとに呼ばれている箇所を探してそこにセンサの値を読む処理を割りこませる必要がある。

調べてみると、player.cppのAvailableProcessorTime()という関数のdo while文が毎回呼ばれていることがわかった。
また、ここでMusicShieldについているスイッチの入力を見るためのCheckKey()という関数を呼んでいる。
CheckKey()では入力に合わせて音量や選曲の処理を行なっているようなので、ここを参考にすれば良いみたい。
読むと、playingStateという変数をPS_NEXT_SONGにすると次の曲へ、PS_PREVIOUS_SONGにすると前の曲が再生されるようになっている。

今日はひとまずここまで。
センサを読むところを加えて、playingStateの状態を変更してやればあとは勝手にやってくれそうだ。
しかし、任意の曲番号を指定して再生するのはどうする・・・?

[追記]
なんだかまだ全然良くわかってないけど、PlayCurentFile()という関数の最後に曲を流し終わった時の処理を書くとうまくいけそうなことがわかった。
サンプルコードのままだと
 ・1曲再生し終わった時、SDカード内の次の曲を再生する。
という処理になっているが、
 ・1曲再生し終わった時に一時停止し、次に再生する曲はSDカード内の3番目の曲にする。
という処理にしたい場合は下記のように書くと良い。

/* player.cpp */
void PlayCurrentFile()
{
    char c, nFragments;

    /* 中略 */

    SendZerosToVS10xx();

    // After finishing normally default to requesting to play next song        
    //playingState = PS_NEXT_SONG; //サンプルコードだとここがアクティブになっているのでコメントアウト

    // ここに曲を流し終わったときの処理をどうするか書く!
    playingState = PS_NORMAL; // 単曲再生(次の曲へ進まない)
    playStop = 0;                       // 一時停止する(1にするとループ再生)
    currentFile = 3;                   // 次に再生する曲の番号
}

AvailableProcessorTime()でやればいいのか、PlayCurentFile()でやればいいのかわからないが、ひとまず
 ・playingState = PS_NORMALで固定
 ・playStopを0にしたら停止、1にしたら再生しっぱなし
 ・currentFileを再生したいファイル番号にする
というように適宜変更してやれば良さそう。

Macのfinderでも直接パスを入力したい

Windowsに慣れてしまっているので、どうにもfinderには慣れない・・・。
特にエクスプローラみたいにパスを直接入力出来ないのがもどかしい(出来るかもしれないけど・・・無知)。

下記のソフトをインストールすることで解決した。
FinderPath

「Command+G」でウィンドウ上部にアドレスバーが出てきて入力出来る。
Tabで補完もしてくれて捗る!

Mac OS X Lionで動作しました。

Arduino+Music Shieldを使う(準備編)

Arduinoから音声を再生したかったので、下記のシールドを購入した。
Seeed Studio INT109B2P Music Shield

インストール方法は下記に書いてある。
Music Shield - Wiki

ひとまずwikiの手順に従いMusic v1 14.zipとNewSoftSerial.zipをダウンロード。
で、..\arduino-0022\librariesに置くらしいが・・・どこやねん。
macだとよくわからなかった。調べてみたら、
/Applications/Arduino.app/Contents/Resources/Java/libraries
でいいみたいだ。
ディレクトリをコピーするとArduinoIDE上でSketch→Import Library...にmusicとNewSoftSerialが追加される。
あとportpins.hの書き換えも必要なので、
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/include/avr
にあるportpins.hを上書きする。
コンソール開いてmvやらcpやらで書き換えました。

で、サンプルスケッチを走らせたものの・・・コンパイルは通ったのに再生されない!
よく見たらmicroSDはSDHC(4GB以上)をサポートしてないのね・・・。

ひとまずAmazonで手頃な1GBのをポチってみた。
到着しだい試してみる予定。ちゃんと動くといいけど・・・。

[追記]
1GBのmicroSDで動いた!やはりmicroSDHCは非対応。

processingとNyARToolkitでCGにテクスチャを貼る

NyARToolkitでARマーカに画像を重畳したい。
なのでARマーカに合わせてCGで正方形を描画し、任意の画像をテクスチャとして貼ってみる。

下記のコードで動いた。

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

Capture cam;
MultiMarker nya;

// image setting
PImage t_image; // texture image
int t_image_l = 160; // marker and texture size

// display setting
int DISPLAY_W = 640; // display width
int DISPLAY_H = 480; // display height

void setup() {
  size(DISPLAY_W, DISPLAY_H, P3D);
  
  // Setup for NyARToolkit.
  colorMode(RGB, 100);
  println(MultiMarker.VERSION);
  cam=new Capture(this, DISPLAY_W, DISPLAY_H);
  nya=new MultiMarker(this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG);
  nya.addARMarker("patt.hiro", t_image_l);
  
  // Setup texture
  t_image = loadImage("hoge.jpg");
  
}

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);

  beginShape();
  texture(t_image);
  vertex(t_image_l/2*(-1), t_image_l/2*(-1), 0, t_image_l);
  vertex(t_image_l/2, t_image_l/2*(-1), t_image_l, t_image_l);
  vertex(t_image_l/2, t_image_l/2, t_image_l, 0);
  vertex(t_image_l/2*(-1), t_image_l/2, 0, 0);  
  endShape();
  
  nya.endTransform();
  
}

vertexで指定している、4つの引数が謎。
1番目はx座標、2番目がy座標であることはわかるが、3番目と4番目はなんだろう・・・?
テクスチャの幅・高さだろうか。

実行例

元画像

実行結果

テクスチャの画像を切り替えることで、アニメーションのように見せることも出来る。