繁体   English   中英

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

[英]How to subscribe to event in Naoqi using Python and ROS?

如何使用ALMemorysubscribeToEvent函数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM