2017-01-04 2 views
0

naoqi python sdkにいくつかの問題があります。 私はCaresse Detectorのために次のコードを持っています。 私のクラスはALModuleから継承され、頭の触覚センサーのイベントに登録されます。私は私のクラスをインポートする外部ファイルに同じコードを実行した場合、イベントが発生したときに、私は次のエラーを取得しながら、外部ファイルからのALModule-inheritedクラスの使用

# -*- encoding: UTF-8 -*- 
import sys 
from naoqi import ALProxy 
from naoqi import ALModule 
from naoqi import ALBroker 
import time 

class caresseDetector(ALModule): 
    def __init__(self,name="caresseDetectorModule"): 
     ALModule.__init__(self,name) 
     self.tts = ALProxy("ALTextToSpeech") 
     self.memory = ALProxy("ALMemory") 
     self.memory.subscribeToEvent("FrontTactilTouched",name,"onFrontTouched") 
     self.memory.subscribeToEvent("RearTactilTouched",name,"onRearTouched") 
     self.memory.subscribeToEvent("MiddleTactilTouched",name,"onMiddleTouched") 
     self.touchFlags = [False,False,False] 
     self.t0 = 0 
     self.gestureDuration = 0.5 

    def onFrontTouched(self): 
     print self.touchFlags 

     if time.time()-self.t0 < self.gestureDuration: 
      if self.touchFlags == [False,True,True]: 
       self.greet() 
     else: 
      self.touchFlags = [False,False,False] 

     if self.touchFlags == [True,False,False]: 
      self.t0 = time.time() 

     elif self.touchFlags == [False,False,False]: 
      self.t0 = time.time() 
      self.touchFlags[0] = True 
     # else: 
     #  self.touchFlags = [False,False,False] 
     #  self.t0 = 0 

    def onRearTouched(self): 
     # print self.touchFlags 
     exec('print ' + str(self.touchFlags)) 
     if time.time() - self.t0 < self.gestureDuration: 
      if self.touchFlags == [True,True,False]: 
       self.greet() 
     else: 
      self.touchFlags = [False,False,False] 

     if self.touchFlags == [False,False,True]: 
      self.t0 = time.time() 

     elif self.touchFlags == [False,False,False]: 
      self.t0 = time.time() 
      self.touchFlags[2] = True 
     # else: 
     #  self.touchFlags = [False, False, False] 
     #  self.t0 = 0 

    def onMiddleTouched(self): 
     # print self.touchFlags 
     exec ('print ' + str(self.touchFlags)) 
     self.touchFlags[1] = True 

     if self.touchFlags == [True,True,True]: 
      self.greet() 
     # else: 
     #  self.touchFlags = [False,False,False] 
     #  self.t0 = 0 

    def greet(self): 
     # print "-------" 
     exec ('print ' + str(self.touchFlags)) 
     self.t0 = 0 
     id = self.tts.post.say("Grazie!") 
     self.touchFlags = [False,False,False] 
     self.tts.wait(id,0) 

    def detect(self,broker): 
     # myBroker = ALBroker("myBroker", "0.0.0.0", 0, self.robotIP, self.port) 
     try: 
      while True: 
       time.sleep(1) 

     except: 
      # print 
      # print "Interrupted, shutting down" 
      exec ('print') 
      exec ('print "Interrupted, shutting down"') 
      broker.shutdown() 

    def __del__(self): 
     self.memory = None 
     self.tts = None 

    # robotIP = "194.119.214.185" 
    # 
    # myBroker = ALBroker("myBroker","0.0.0.0",0,robotIP,9559) 
    # goofy = caresseDetector("detector") 
    # goofy.detect(myBroker) 

私は最後の命令を実行する場合は、モジュールがうまく動作するコードの末尾にコメント:

[E] 4099 qitype.dynamicobject: ALPythonTools::eval 
python object not found detector 

テストへの外部ファイルは、次のようになります。

from naoqi import ALBroker 
from caresseDetector import caresseDetector 
robotIP = "194.119.214.185" 

myBroker = ALBroker("myBroker","0.0.0.0",0,robotIP,9559) 
goofy = caresseDetector("detector") 
goofy.detect(myBroker) 

私はオンライン何かを発見していない、誰かが私を助けることができますか?モジュール名として同じ名前とNAOqiコールバック機構は、トップレベルのスコープ内のグローバル変数を探すことによってモジュール・インスタンスを検索しようと予め

答えて

1

おかげで(すなわち、__main__です) 。 "detector"ALModule.__init__()に渡すので、NAOqiはdetectorという名前のグローバル変数を検索し、コード例ではgoofyという名前であるため、見つからない場合があります。コードが同じファイルに、外部ファイルの両方で私の作品

myBroker = ALBroker("myBroker","0.0.0.0",0,robotIP,9559) 
detector = caresseDetector("detector") 
detector.detect(myBroker) 

にインスタンス作成コードを変更した後

。あなたは、単にやっているのでhttp://doc.aldebaran.com/2-1/dev/python/reacting_to_events.html

+0

ありがとう、たくさんの男! – magicleon

1

あなたは、あなたのケースでALModuleを使用する必要はありません。

この動作は、NAOqi PythonのSDKの公式ドキュメント(コード例下記の注意事項を参照)に記載されていますクライアント。 how to write a clientのチュートリアルです。本当にメソッドを公開したい場合は、ALModuleの代わりにサービスを作成する必要があります。

あなたの場合、ALMemoryイベントを購読したいと思っています。しかし、あなたはALModuleを使う必要がある古い学校のやり方をしています。 ALMemory.subscriber(eventName)の導入以来、あなたは、単に次のように記述することができます

def onFrontTactilTouched(value): 
    pass # process the event 

memory = session.service('ALMemory') 
subscriber = memory.subscriber('FrontTactilTouched') 
subscriber.signal.connect(onFrontTactilTouched) 

サブスクリプションを維持するために生きている加入者を維持する必要がありますのでご了承ください。

+0

2.1.4 APIバージョンで動作しますか? – magicleon

+0

と... CLIではなく、コードでロボットのIPをどうやって渡すのですか? – magicleon

+0

私は2.4.3 SDKをダウンロードしました。次にNaoと試してみます。私は、2.4.3はPepper Lolのためだけだと思った。 – magicleon

関連する問題