Raspberry Pi 日記 (part2)

長嶋 洋一


2013年7月6日(土)

週末になった。 今日は午後に「40虎」の勉強会(作品映像鑑賞会)ということで、学生が映像を見ている裏でRaspberry Piを進めることにした。 昼前から研究室で準備にとりかかったのは、昨日の最後に、OSCメッセージを受け取って処理するという部分にまで行けなかったので、その突破口を探ることだった。 昨日の流れは、整理してみると以下のようなものだった。
  1. Raspberry Piに既にOSCそのものはインストール済を確認
  2. 「Simple OSC」をゲットした
  3. Simple OSCの実行には「pyOSC」が必要ということで「pyOSC」をゲットした
  4. 「Simple OSC」内の「simpleOSC.py」を見ると、ちょっと違うっぽい??
  5. 「Simple OSC」は学生など初学者向けだという説明
  6. 「pyOSC_examples」内の「basic_send.py」と「basic_receive.py」を見ると、欲しかったもの
  7. 「Simple OSC」のインストールを待って、まず「pyOSC」をインストール
  8. 「basic_send.py」を実行させてMaxへのOSCメッセージ送信を確認
  9. 「basic_receive.py」実行させるとMaxからのOSCメッセージ到達は確認できたもののメッセージ自体の取得ハンドラが無い
  10. 「pyOSC」内の「OSC.py」は長大でえらく大変そう(^_^;)
つまり、混乱を避けて「Simple OSC」はダウンロードしたもののインストールせず、上位互換フルセット?の「pyOSC」に挑戦して行き詰まっていた、という事である。 ここまで整理して気付いたのが、「Simple OSC」内には「simpleOSC.py」とともに、以下の「app_example.py」があるのを見落としていたことである。 そして以下の「app_example.py」を眺めてみると、ちょうど長大な「OSC.py」で困っていたものがスッキリとしているように思えてきた。 そうか、学生など初学者向けでちょうど良かったのである。(^_^;)
#!/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()
そこで、昨日の手順と同様に、以下のように SimpleOSC_0.3.2.zip を「SimpleOSC.zip」とリネームしてRaspberry Pi62号機にrcpしてunzipしてインストールしてみた。 これで、指定されたように「pyOSCをインストールした後に」「SimpleOSCインストールした」という事になった。
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 $ 
ここで改めて「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」の冒頭の
from simpleOSC import initOSCClient, initOSCServer, setOSCHandler, sendOSCMsg, closeOSC, \
     createOSCBundle, sendOSCBundle, startOSCServer
の意味が判って、そこからイモヅル式に全ての繋がりが判ったのである。 defaultのpathとかの詳しいところは不明だが、上の「from simpleOSC import」というのは、インストールされた「simpleOSC.py」に並んでいる定義をインクルード(import)する、という事だったのだ。 そして参照されている「simpleOSC.py」の冒頭では
from OSC import OSCServer, ThreadingOSCServer, ForkingOSCServer, OSCClient, OSCMessage, OSCBundle
とあった。これが、先にインストールしておくべき、という事だったpyOSCの中にあった「OSC.py」なのである。 そして参照されている「OSC.py」の冒頭では
import math, re, socket, select, string, struct, sys, threading, time, types
とあった。 おそらくこれは、apt-getでインストール完了していたOSCのパッケージで定義されているのだろう。 これにより、結局のところ、defaultでpathとかの折り合いは済んでいる模様で(^_^;)、「app_example.py」をリネームした以下の「test.py」は、ちゃんと定期的にMaxにOSCメッセージを送り、またMaxからのOSCメッセージに反応するだけでなくその中身のデータを表示する、という事まで確認できた。
#!/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日記」トップに戻る