Raspberry Pi 日記 (part2)
長嶋 洋一
2013年7月6日(土)
週末になった。 今日は午後に「40虎」の勉強会(作品映像鑑賞会)ということで、学生が映像を見ている裏でRaspberry Piを進めることにした。 昼前から研究室で準備にとりかかったのは、昨日の最後に、OSCメッセージを受け取って処理するという部分にまで行けなかったので、その突破口を探ることだった。 昨日の流れは、整理してみると以下のようなものだった。つまり、混乱を避けて「Simple OSC」はダウンロードしたもののインストールせず、上位互換フルセット?の「pyOSC」に挑戦して行き詰まっていた、という事である。 ここまで整理して気付いたのが、「Simple OSC」内には「simpleOSC.py」とともに、以下の「app_example.py」があるのを見落としていたことである。 そして以下の「app_example.py」を眺めてみると、ちょうど長大な「OSC.py」で困っていたものがスッキリとしているように思えてきた。 そうか、学生など初学者向けでちょうど良かったのである。(^_^;)
- Raspberry Piに既にOSCそのものはインストール済を確認
- 「Simple OSC」をゲットした
- Simple OSCの実行には「pyOSC」が必要ということで「pyOSC」をゲットした
- 「Simple OSC」内の「simpleOSC.py」を見ると、ちょっと違うっぽい??
- 「Simple OSC」は学生など初学者向けだという説明
- 「pyOSC_examples」内の「basic_send.py」と「basic_receive.py」を見ると、欲しかったもの
- 「Simple OSC」のインストールを待って、まず「pyOSC」をインストール
- 「basic_send.py」を実行させてMaxへのOSCメッセージ送信を確認
- 「basic_receive.py」実行させるとMaxからのOSCメッセージ到達は確認できたもののメッセージ自体の取得ハンドラが無い
- 「pyOSC」内の「OSC.py」は長大でえらく大変そう(^_^;)
そこで、昨日の手順と同様に、以下のように SimpleOSC_0.3.2.zip を「SimpleOSC.zip」とリネームしてRaspberry Pi62号機にrcpしてunzipしてインストールしてみた。 これで、指定されたように「pyOSCをインストールした後に」「SimpleOSCインストールした」という事になった。#!/usr/bin/env python from simpleOSC import initOSCClient, initOSCServer, setOSCHandler, sendOSCMsg, closeOSC, \ createOSCBundle, sendOSCBundle, startOSCServer def myTest(): import time # in this example we will have a small delay in the while loop initOSCClient() # takes args : ip, port initOSCServer() # takes args : ip, port, mode --> 0 for basic server, 1 for threading server, 2 for forking server # bind addresses to functions setOSCHandler('/check', checkcheckcheck) startOSCServer() # and now set it into action print 'ready to receive and send osc messages ...' try: while 1: sendOSCMsg("/test", [444]) # !! it sends by default to localhost ip "127.0.0.1" and port 9000 # create and send a bundle bundle = createOSCBundle("/test/bndlprt1") bundle.append(666) # 1st message appent to bundle bundle.append("the number of the beast") # 2nd message appent to bundle sendOSCBundle(bundle) # !! it sends by default to localhost ip "127.0.0.1" and port 9000 time.sleep(0.5) # you don't need this, but otherwise we're sending as fast as possible. except KeyboardInterrupt: print "closing all OSC connections... and exit" closeOSC() # finally close the connection before exiting or program. def checkcheckcheck(addr, tags, data, source): print "CHECK CHECK CHECK..." print "received new osc msg from %s" % getUrlStr(source) print "with addr : %s" % addr print "typetags :%s" % tags print "the actual data is : %s" % data if __name__ == '__main__': myTest()ここで改めて「Simple OSC」内の「simpleOSC.py」を見ると、「basic_send.py」や「basic_receive.py」に比べてdefineばかり・・・と思ったが、関係ないことは無くて、まずはここから実験すべき、と思えた。 昨日の夕方にあれこれ悩んで調べたことで、少しは視界が開けてきたようで、無駄でもなかったのかもしれない。 そこで「simpleOSC.py」を「test.py」とリネームして、少しずつ関係なさそうなところを削ってテストランさせる、という実験を進めている中で、遂に「判って」しまった(^o^)。 「simpleOSC.py」をリネームした「test.py」では、何も起きないのである。 そして、見落としていた「app_example.py」をリネームした「test.py」で実験していて、突然に気付いたのである。 「app_example.py」の冒頭のLast login: Sat Jul 6 08:52:29 on console nagasm-Mac-mini:~ nagasm$ ssh pi@172.16.65.62 pi@172.16.65.62's password: Linux raspberrypi 3.6.11+ #456 PREEMPT Mon May 20 17:42:15 BST 2013 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Jun 23 21:27:04 2013 pi@raspberrypi ~ $ ls Desktop a.out blink_autorun pyOSC pyusb-1.0.0a3 test.py GPIO_clear bcm2835-1.25 null python_games test test1.py RPi.GPIO-0.1.0 blink1-tool ocr_pi.png pyusb-1.0.0-a1 test.c twilight.png pi@raspberrypi ~ $ rcp nagasm@172.16.65.31:Desktop/SimpleOSC.zip . Password: SimpleOSC.zip 100% 7355 7.2KB/s 00:00 pi@raspberrypi ~ $ unzip SimpleOSC.zip Archive: SimpleOSC.zip creating: SimpleOSC/ inflating: SimpleOSC/app_example.py creating: __MACOSX/ creating: __MACOSX/SimpleOSC/ inflating: __MACOSX/SimpleOSC/._app_example.py inflating: SimpleOSC/readme.txt inflating: SimpleOSC/setup.py inflating: __MACOSX/SimpleOSC/._setup.py inflating: SimpleOSC/simpleOSC.py inflating: __MACOSX/SimpleOSC/._simpleOSC.py inflating: __MACOSX/._SimpleOSC pi@raspberrypi ~ $ rm -r __MACOSX pi@raspberrypi ~ $ cd SimpleOSC pi@raspberrypi ~/SimpleOSC $ ls -l 合計 20 -rw-rw-r-- 1 pi pi 3097 12月 13 2012 app_example.py -rw-rw-r-- 1 pi pi 4153 12月 13 2012 readme.txt -rw-rw-r-- 1 pi pi 588 11月 29 2012 setup.py -rw-rw-r-- 1 pi pi 3292 12月 13 2012 simpleOSC.py pi@raspberrypi ~/SimpleOSC $ sudo python setup.py install running install running build running build_py creating build creating build/lib.linux-armv6l-2.7 copying simpleOSC.py -> build/lib.linux-armv6l-2.7 running install_lib copying build/lib.linux-armv6l-2.7/simpleOSC.py -> /usr/local/lib/python2.7/dist-packages byte-compiling /usr/local/lib/python2.7/dist-packages/simpleOSC.py to simpleOSC.pyc running install_egg_info Writing /usr/local/lib/python2.7/dist-packages/SimpleOSC-0.3.egg-info pi@raspberrypi ~/SimpleOSC $の意味が判って、そこからイモヅル式に全ての繋がりが判ったのである。 defaultのpathとかの詳しいところは不明だが、上の「from simpleOSC import」というのは、インストールされた「simpleOSC.py」に並んでいる定義をインクルード(import)する、という事だったのだ。 そして参照されている「simpleOSC.py」の冒頭ではfrom simpleOSC import initOSCClient, initOSCServer, setOSCHandler, sendOSCMsg, closeOSC, \ createOSCBundle, sendOSCBundle, startOSCServerとあった。これが、先にインストールしておくべき、という事だったpyOSCの中にあった「OSC.py」なのである。 そして参照されている「OSC.py」の冒頭ではfrom OSC import OSCServer, ThreadingOSCServer, ForkingOSCServer, OSCClient, OSCMessage, OSCBundleとあった。 おそらくこれは、apt-getでインストール完了していたOSCのパッケージで定義されているのだろう。 これにより、結局のところ、defaultでpathとかの折り合いは済んでいる模様で(^_^;)、「app_example.py」をリネームした以下の「test.py」は、ちゃんと定期的にMaxにOSCメッセージを送り、またMaxからのOSCメッセージに反応するだけでなくその中身のデータを表示する、という事まで確認できた。import math, re, socket, select, string, struct, sys, threading, time, types#!/usr/bin/env python from simpleOSC import initOSCClient, initOSCServer, setOSCHandler, sendOSCMsg, closeOSC, \ createOSCBundle, sendOSCBundle, startOSCServer import time, threading def check1(addr, tags, data, source): print "%s" % data def check2(addr, tags, data, source): print "data = %s" % data initOSCClient(ip='172.16.65.31', port=7001) initOSCServer(ip='172.16.65.62', port=7003, mode=0) setOSCHandler('/check1', check1) setOSCHandler('/check2', check2) startOSCServer() sendOSCMsg("/test", [444]) bundle = createOSCBundle("/test/bndlprt1") bundle.append("Hello, World !") sendOSCBundle(bundle) try: while 1: time.sleep(3) except KeyboardInterrupt: print "closing all OSC connections... and exit" closeOSC()
地味なようでこれは大いなる進展なので、ここで忘れないうちに、ターミナルを2画面さらに開いて、Raspberry Pi61号機と63号機にも「SimpleOSC.zip」をrcpしてunzipしてインストールした。 また、いろいろ実験したRaspberry Pi62号機のカレントディレクトリには「SimpleOSC.pyc」「USC.pyc」というファイルが出来ていたが、調べてみるとこれはコンパイルされたPythonプログラムということで、消しても「test.py」は問題なく動いたので消しておいた。 これで道具立てがぼちぼち揃ってきたが、40虎の映像作品名作鑑賞会をついつい観入ってMaxプログラミングが滞ってしまったので(^_^;)、今日はここまでとなった。
「Raspberry Pi日記」トップに戻る