如何使用Python和ROS在Naoqi中订阅事件?

时间:2019-03-16 17:21:40

标签: python ros nao-robot rospy

如何使用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,其后果是无法自行启动模块,因此无法传递其构造函数?
因为我使用的是大学计算机,所以无法安装其他任何库。

1 个答案:

答案 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),也可以在代码中使用相同的逻辑(这并不太复杂,一旦有了工作示例)。