使用来自外部文件的 ALModule-inherited class
Using ALModule-inherited class from external file
我在使用 naoqi python SDK 时遇到了一些问题。
我有以下用于 Caresse 检测器的代码。
我的 class 继承自 ALModule 并注册到头部触觉传感器上的事件。
# -*- 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)
如果我 运行 最后一条指令注释在代码末尾,模块运行良好,而如果我 运行 在导入我的 class 的外部文件中使用相同的代码,事件发生时出现以下错误:
[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 回调机制试图通过在顶级范围内(即 __main__
所在的位置)查找具有 同名 [=26] 的全局变量来查找模块实例=] 作为模块名称。你把"detector"
传给了ALModule.__init__()
,所以NAOqi去寻找名为detector
的全局变量,但是没有找到,因为它在代码示例中被命名为goofy
。
将实例创建代码更改为
后
myBroker = ALBroker("myBroker","0.0.0.0",0,robotIP,9559)
detector = caresseDetector("detector")
detector.detect(myBroker)
代码在同一个文件和外部文件中对我都有效。
NAOqi Python SDK 的官方文档中也提到了此行为(请参阅代码示例下方的注释):http://doc.aldebaran.com/2-1/dev/python/reacting_to_events.html
你的情况不需要使用ALModule,因为你只是在做一个客户端。这是 how to write a client 的教程。如果你真的想公开方法,你应该写一个服务,而不是绕过 ALModule。
在您的例子中,您想订阅 ALMemory 事件。但是您是以 old-school 方式进行的,这需要您使用 ALModule。由于引入了ALMemory.subscriber(eventName),可以简单的写成如下:
def onFrontTactilTouched(value):
pass # process the event
memory = session.service('ALMemory')
subscriber = memory.subscriber('FrontTactilTouched')
subscriber.signal.connect(onFrontTactilTouched)
请注意,您必须让订阅者保持活动状态才能维持订阅。
我在使用 naoqi python SDK 时遇到了一些问题。 我有以下用于 Caresse 检测器的代码。 我的 class 继承自 ALModule 并注册到头部触觉传感器上的事件。
# -*- 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)
如果我 运行 最后一条指令注释在代码末尾,模块运行良好,而如果我 运行 在导入我的 class 的外部文件中使用相同的代码,事件发生时出现以下错误:
[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 回调机制试图通过在顶级范围内(即 __main__
所在的位置)查找具有 同名 [=26] 的全局变量来查找模块实例=] 作为模块名称。你把"detector"
传给了ALModule.__init__()
,所以NAOqi去寻找名为detector
的全局变量,但是没有找到,因为它在代码示例中被命名为goofy
。
将实例创建代码更改为
后myBroker = ALBroker("myBroker","0.0.0.0",0,robotIP,9559)
detector = caresseDetector("detector")
detector.detect(myBroker)
代码在同一个文件和外部文件中对我都有效。
NAOqi Python SDK 的官方文档中也提到了此行为(请参阅代码示例下方的注释):http://doc.aldebaran.com/2-1/dev/python/reacting_to_events.html
你的情况不需要使用ALModule,因为你只是在做一个客户端。这是 how to write a client 的教程。如果你真的想公开方法,你应该写一个服务,而不是绕过 ALModule。
在您的例子中,您想订阅 ALMemory 事件。但是您是以 old-school 方式进行的,这需要您使用 ALModule。由于引入了ALMemory.subscriber(eventName),可以简单的写成如下:
def onFrontTactilTouched(value):
pass # process the event
memory = session.service('ALMemory')
subscriber = memory.subscriber('FrontTactilTouched')
subscriber.signal.connect(onFrontTactilTouched)
请注意,您必须让订阅者保持活动状态才能维持订阅。