如何使用ALMemory
的{{1}}函数订阅事件,该函数需要正确的Python作用域,同时使用ROS(rospy)来启动代码之外的模块?
此问题与this Naoqi subscription question类似,但在不同点上,没有使用rospy,这对实现至关重要。
我当前的代码就是这样;
mainBehaviour.py
subscribeToEvent
nao.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")
我想要的是使用nao.py的mainBehaviour.py,它的功能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)
在机器人掉落时触发。但是,当前代码不会产生此行为(它会忽略任何掉落),但是也不会产生错误。我尝试使用this ALMemory tutorial来实现。但是,本教程使用单个python文件,其中ROS不会实例化方法。因此,我无法使用行robotHasFallen
。我试图通过声明指向pythonModule = myModule("pythonModule")
的全局变量来获得该Python范围(先前链接的问题的答案指出“ python变量必须与您创建的模块名称具有相同的名称”)。
如何创建所需的行为,使用self
检测掉落的机器人,使用ROS,其后果是无法自行启动模块,因此无法传递其构造函数?
因为我使用的是大学计算机,所以无法安装其他任何库。
答案 0 :(得分:2)
您的示例代码使用了“ naoqi”库,但是现在更方便地使用“ qi”库(您可以通过“ pip install qi”获得它,它已经存在于2.1版或更高版本的机器人中)。在该版本中,您可以直接传递回调,有关帮助程序库的信息,请参见here(您可以传递events.connect("MyALMemoryKey", my_callback)
(传递函数而不仅仅是传递其名称-并不关心函数在何处)来自)。
在引擎盖下,它会这样做:
ALMemory.subscriber("MyALMemoryKey").signal.connect(my_callback)
(请注意,ALMemory是 Service (qi框架),而不是 module (naoqi框架)。
您可以直接使用该辅助程序库(请参见文档here,以及一些使用该程序库的示例here),也可以在代码中使用相同的逻辑(这并不太复杂,一旦有了工作示例)。