![](/img/trans.png)
[英]How to subcribe an event of ALSpeechRecognition Naoqi in Python
[英]How to subscribe to event in Naoqi using Python and ROS?
如何使用ALMemory
的subscribeToEvent
函数subscribeToEvent
事件,当使用ROS(rospy)来初始化代码之外的模块时,该函数需要正确的Python作用域?
该问题类似于此Naoqi订阅问题 ,但不同之处在于未使用rospy,这对实现至关重要。
我当前的代码就是这样;
mainBehaviour.py
from nao.nao import Nao
class mainBehaviour(AbstractBehaviour):
def init(self):
global mainBehaviourMethod
mainBehaviourMethod = self
self.nao.setCallOnFall("mainBehaviourMethod", "robotHasFallen")
def update(self):
print("Update")
def robotHasFallen(self, eventName, val, subscriberIdentifier):
print("FALLING")
o
from naoqi import ALProxy, ALModule, ALBroker
import rospy
from math import radians
import weakref
class Nao(object):
def __init__(self):
self.nao_ip = rospy.get_param("nao_ip")
self.port = 9559
self.memory_proxy = ALProxy("ALMemory", self.nao_ip, self.port)
def setCallOnFall(self, module, method):
self.memory_proxy.subscribeToEvent("robotHasFallen", module, method)
我想要的是使用nao.py的mainBehaviour.py具有其功能,当机器人掉落时会robotHasFallen
。 但是,当前代码不会产生此行为(它会忽略任何掉落),但是也不会产生错误。 我试图使用此ALMemory教程来实现此目的 。 但是,本教程使用单个python文件,其中ROS不会实例化方法。 因此,我无法使用pythonModule = myModule("pythonModule")
。 我试图通过声明一个指向self
的全局变量,来获得这个Python范围(先前链接的问题的答案指出“ python变量必须与您创建的模块名称具有相同的名称”)。
我该如何创建所需的行为,使用subscribeToEvent
检测掉落的机器人,使用ROS,其后果是无法自行启动模块,因此无法传递其构造函数?
我使用的是大学计算机,因此无法安装其他任何库。
您的示例代码使用了“ naoqi”库,但是现在更方便地使用“ qi”库(您可以通过“ pip install qi”获得它,它已经存在于2.1版或更高版本的机器人中)。 在该版本中,您可以直接传递回调,请参见此处的帮助程序库,该库可让您执行events.connect("MyALMemoryKey", my_callback)
(您传递的函数不仅是函数的名称,而且它不在乎功能来自)。
在后台,它执行以下操作:
ALMemory.subscriber("MyALMemoryKey").signal.connect(my_callback)
(请注意,此处ALMemory是服务 (qi框架),而不是模块 (naoqi框架)。
您可以直接使用该帮助程序库(请参见此处的文档,以及一些使用此示例的示例),或在代码中使用相同的逻辑(一旦您有了一个可行的示例,它就不会很复杂)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.