2013-08-07 95 views
0

我正在使用Windows XP機器和Python 2.7上的NAO機器人。Naoqi事件處理10秒延遲

我想檢測語音中的標記。整個事情的工作,但不幸的是,我不得不面對現在10秒的延遲,我的事件沒有被檢測到(回調函數未被調用)。

首先,我的主要功能:

from naoqi import ALProxy, ALBroker 
from speechEventModule import SpeechEventModule 
myString = "Put that \\mrk=1\\ there." 
NAO_IP = "192.168.0.105" 
NAO_PORT = 9559 
memory = ALProxy("ALMemory", NAO_IP, NAO_PORT) 
tts = ALProxy("ALTextToSpeech", NAO_IP, NAO_PORT) 
tts.enableNotifications() 

myBroker = ALBroker("myBroker", 
    "0.0.0.0", # listen to anyone 
    0,   # find a free port and use it 
    NAO_IP,   # parent broker IP 
    NAO_PORT)  # parent broker port 

global SpeechEventListener 
SpeechEventListener = SpeechEventModule("SpeechEventListener", memory) 
memory.subscribeToEvent("ALTextToSpeech/CurrentBookMark", "SpeechEventListener", "onBookmarkDetected") 
tts.say(initialString) 

在這裏,我speechEventModule:

from naoqi import ALModule 
from naoqi import ALProxy 

NAO_IP = "192.168.0.105" 
NAO_PORT = 9559 

SpeechEventListener = None 
leds = None 
memory = None 

class SpeechEventModule(ALModule): 
    def __init__(self, name, ext_memory): 
     ALModule.__init__(self, name) 
     global memory 
     memory = ext_memory 
     global leds 
     leds = ALProxy("ALLeds",NAO_IP, NAO_PORT)   

    def onBookmarkDetected(self, key, value, message): 
     print "Event detected!" 
     print "Key: ", key 
     print "Value: " , value 
     print "Message: " , message 

     if(value == 1): 
      global leds 
      leds.fadeRGB("FaceLeds", 0x00FF0000, 0.2) 
     if(value == 2): 
      global leds 
      leds.fadeRGB("FaceLeds", 0x000000FF, 0.2) 

請,不要任何人有同樣的問題? 有人可以給我一個建議嗎?

在此先感謝!

+0

我可以排除問題,過熱 – Ste

+0

你說,它的工作...你有什麼修改?可能你所編程的模塊需要大量的CPU(在這裏,只有你可以知道原因)。開始思考你在開始失敗時引入的改變。你可以看到是否是使用ssh連接到機器人並執行'top'命令的CPU問題 – Manuel

+0

Hello Manuel,非常感謝您的回覆!是的,它在上週工作,我正在調試,將事件從整個項目中分離出來,以確保解決該問題。這對CPU來說是個好主意,我通過ssh連接到了我的nao,但是沒有導致超過10%cpu的進程 - 所以你的建議不是解決方案:(但是thx。你有更多的建議嗎? Thx提前我的朋友! – Ste

回答

0

您正在訂閱模塊外部的活動。如果我沒有錯,你必須把它做到__init__方法。

class SpeechEventModule(ALModule): 

    def __init__(self, name, ext_memory): 
     ALModule.__init__(self, name) 
     memory = ALProxy("ALMemory") 
     leds = ALProxy("ALLeds") 

無論如何,請檢查您的主要功能一直運行下去(更好,如果你趕上鍵盤中斷),或者你的程序將結束之前,他可以捕獲任何關鍵字。

try: 
    while True: 
     time.sleep(1) 
except KeyboardInterrupt: 
    print 
    print "Interrupted by user, shutting down" 
    myBroker.shutdown() 
    sys.exit(0) 

看看this tutorial,它可能會有幫助。

0

也許你應該嘗試手動綁定回調,這樣做:

def __init__(self, name, ext_memory): 
    ALModule.__init__(self, name) 
    self.BIND_PYTHON(self.getName(),"onBookmarkDetected"); 

這是我在一些Choregraphe盒使用回調時做的。

1

下面是如何將具有更近鬧起版本來完成:

import qi 
import argparse 


class SpeechEventListener(object): 
    """ A class to react to the ALTextToSpeech/CurrentBookMark event """ 

    def __init__(self, session): 
     super(SpeechEventListener, self).__init__() 
     self.memory = session.service("ALMemory") 
     self.leds = session.service("ALLeds") 
     self.subscriber = self.memory.subscriber("ALTextToSpeech/CurrentBookMark") 
     self.subscriber.signal.connect(self.onBookmarkDetected) 
     # keep this variable in memory, else the callback will be disconnected 

    def onBookmarkDetected(self, value): 
     """ callback for event ALTextToSpeech/CurrentBookMark """ 
     print "Event detected!" 
     print "Value: " , value # key and message are not useful here 

     if(value == 1): 
      self.leds.fadeRGB("FaceLeds", 0x00FF0000, 0.2) 
     if(value == 2): 
      self.leds.fadeRGB("FaceLeds", 0x000000FF, 0.2) 


if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument("--ip", type=str, default="127.0.0.1", 
         help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.") 
    parser.add_argument("--port", type=int, default=9559, 
         help="Naoqi port number") 
    args = parser.parse_args() 

    # Initialize qi framework 
    connection_url = "tcp://" + args.ip + ":" + str(args.port) 
    app = qi.Application(["SpeechEventListener", "--qi-url=" + connection_url]) 
    app.start() 
    session = app.session 
    speech_event_listener = SpeechEventListener(session) 

    tts = session.service("ALTextToSpeech") 
    # tts.enableNotifications() --> this seems outdated 
    while True: 
     raw_input("Say something...") 
     tts.say("Put that \\mrk=1\\ there.")