2013-08-07 71 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.")