Kinectのデータを受信できた

Kinect-OSCeletonの発した骨格データを、Pharoで受け取ってモーフで表示させることに成功した。

詳しくは後で述べる予定だが、気がついたことを先に。

server when: #messageReceived evaluate: [:msg | Transcript cr; show: msg].

上のようにすると、OSCeletonのメッセージは/new_user, /lost_user, /new_skelしか受け取ることができず、肝心のjointメッセージを受け取れない。

後者を受け取るには以下のように、 #bundleReceived を使う必要がある。

server when: #bundleReceived evaluate: [:msg | Transcript cr; show: msg].

PureData

せっかくなので、 @ さんが http://goonsh.ddo.jp/fg/2008/06/14/squeak-osc-pd で紹介されているように、PureDataとの通信を試してみる。

PureDataからPharoへの通信

Pharo側の準備をする。
server := OSCServer listenOnPort: 9999.
server when: #messageReceived evaluate: [:msg | Transcript cr; show: msg].
  1. Workspaceを開いて上記をコピー&ペーストし、選択してDo itする。
  2. 通信の確認用にTranscriptを開く。
PureDataをインストールしてPureData側の準備をする。

http://puredata.info/downloads/pd-extended からPd-Extendedをダウンロードしてインストールする。

PureDataを起動する。(コンソールが表示される)

20120619160728

Help から Browser… を選んでヘルプブラウザを出し、oscx/ を選んで右側の一覧から sendOSC-help.pd をダブルクリックする。

20120619160727

PureDataからPharoへの通信をチェックする
  1. sendOSC-help.pdで “connect localhost 9999” と書かれたメッセージをクリックすると、PureDataのコンソール画面に “sendOSC: connected to port localhost:9999 (hSock=21782528) protocol = UDP” のようなメッセージが表示される。
  2. 同様に、 “send /test/bla 1 2 3” と書かれたメッセージをクリックすると、PharoのTranscriptに an OSCMessage(‘/test/bla’ 1 2 3) のように表示されればOKである。
  3. PharoのWorkspaceで、 server terminate. をDo itしてOSCServerを止める。

PharoからPureDataへの通信

PureDataのヘルプブラウザで dumpOSC-help.pd をダブルクリックする。

EditメニューでEdit modeを選んだら、再度Edit modeを選ぶ。このとき、PureDataのコンソール画面に ” dumpOSC 9999 … couldn’t create” のようなメッセージが出る場合には、ポート番号=9999でOSCServerが動いている。前述のようにPharoのWorkspaceでOSCServerを止めるか、Edit modeに戻した上でdumpOSCのパラメータを9999以外の値にする。

Pharoのワークスペースで、以下をコピー&ペーストし、Do itする。

msg := OSCMessage for: {'/test'. 200. 300. 400}.
msg sendTo: NetNameResolver localHostAddress port: 9999.

PureDataのコンソール画面に “rcvOSC: /test 200 300 400” が表示されればOKである。

OSCClient

Pharo1.4でOSC(OpenSound Control)を動かしてみた。
まずは、Monticelloブラウザを開いてOSCClientをインストールする。
RepositoryボタンでHTTPを選んで以下をコピー&ペースト後、OKを押す。

MCHttpRepository
location: 'http://www.squeaksource.com/OSCClient'
user: ''
password: ''

右側のペインで ttp://www.squeaksource.com/OSCClient を選び、Openボタンを押す。
20120619154640
OSCClientのRepository画面の右側のペインの先頭(この時点ではOSC-Richo.23.mcz)を選んでLoadボタンを押せば、OSCClientのインストールが完了する。
20120619154849
ブラウザを開いてOSC-KernelとOSC-Testsの2つのクラスカテゴリが追加されていることを確認する。
20120619155002
ついでに、OSC-Testsを選んだ状態でALT-tを押してテストが成功する事も確認しておく。

Morphicレッスン

昨日のScratchDayでPharoのことについて少し話をしました。

予想通りワールドカフェでは誰も参加者がいなかったのですが、そのために用意した配布資料があるので公開しておきます。

ワールドカフェの30分という制限時間でMorphicらしさを伝えるのは大変難しく、出来合いのクラスにちょこちょこっとコードを加えるようなものですが、少しはSmalltalk-80/Pharo/Morphicの雰囲気が伝わるかと思います。

当日配布用のハンドアウトはこちら。ダウンロード方法やフォント設定、パッチファイルの導入方法が書かれています。

http://itolab.com/software/scratch/ScratchDay-Morphic.pdf

(追記)日本語フォントの設定前にパッチを導入すると文字化けになります。ハンドアウトの順序で作業してください。

パッチファイル(mczファイル)はこちら。

WindowsとMacでキーコードが異なるので、それぞれにあったものをダウンロードしてください。

[Windows用]

http://itolab.com/software/scratch/ScratchDay-EiichiroIto.18.mcz

[Mac OS X用]

http://itolab.com/software/scratch/ScratchDay-EiichiroIto.17.mcz

※キーコードは、 Shooting>>#keyDown: と Shooting>>#keyUp: で設定しています。

実戦でチェックしていないので間違い等あると思います。

問い合わせなどは @ までどうぞ。

日本語を含んだコードをFileOutできない

Pharo 1.3にいまさらながらのバグ発見。

日本語が含まれたコードをFileOutしようとすると、「writeLeadingCharRunsOn:が無い!」というノーティファイアが起動してしまう。これは、WriteStream>>nextChunkPut:のバグで、文字列aStringがユニコード文字を含んでいるか判定した後、(実際にはTextオブジェクトである)aStringを文字列に変換せずに当該メッセージを送信するために発生する。

要は、最後の方の

aString writeLeadingCharRunsOn: self.

aString asString writeLeadingCharRunsOn: self.

のようにすれば解決する。

ProfStefの日本語化の見直しをしている間に判明した。以前はエラーでてなかったということは1.3で挿入されたのだろうか?

とりあえず、パッチファイルを置いておく。

http://itolab.com/software/pharo/fixFileoutIncludesUnifiedCharacter.1.cs

画像を表示する

ファイルとして保存されている画像(仮にtest.jpg)を表示するには、以下のようにする。

1.WAFileLibraryのサブクラスを作る(仮にMyFileLibrary)

2.ワークスペースやクラスメソッドで、以下のようなコードを実行させる。

MyFileLibrary addFileAt: 'test.jpg'

※ここでのファイル名はPharoを実行しているフォルダからの相対パスで指定する。(要確認)

※数値だけのファイル名ではエラーとなるので注意。

3.レンダリングメソッド内で以下のようにする。

html image url: MyFileLibrary / 'test.jpg'

※ここでのファイル名はディレクトリ部分を取り除いておく。(要確認)

以上。

※要確認なところが多いが、電池がなくなってきたのでこれまで。

【2012/02/27追記】

  • addFileAt:では引数のファイル名をシンボルにする関係で先頭の数値を取り除いている。そのため数値だけからなるファイル名ではエラーが発生してしまう。
  • /はurlOf:と同じで、引数にはシンボルを指定する。上記の例でもうまくいくがSeaSideのマニュアルによると#testJpgが正しいらしい。 http://book.seaside.st/book/in-action/serving-files/filelibraries/including

フォームをPNGで表示する。

SeaSideでフォーム(aForm)を表示する場合は以下のようにする。

renderContentOn: html
html image form: aForm

ところがこれだとGIFファイルが生成されることになり、多色を使いたい時に困る。GIFではなくPNGファイルを生成したい時には以下のようにすればよい。

renderContentOn: html
html image document: (aForm seasideMimeDocumentType: WAMimeType imagePng)