0

如何使用ALMemory'ssubscribeToEvent函数订阅事件,该函数需要正确的 Python 范围,同时使用 ROS(rospy)在我的代码之外启动模块?

这个问题和这个 Naoqi 订阅问题类似,但不同之处在于没有使用 rospy,这对实现至关重要。

我当前的代码就是这样;
主要行为.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

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 实例化的。因此我无法使用 line pythonModule = myModule("pythonModule")。我试图通过声明一个指向self.

如何创建所需的行为,subscribeToEvent使用 ROS 检测倒下的机器人,其后果是自己不启动模块,因此无法传递其构造函数?
我无法安装任何其他库,因为我使用的是大学计算机。

4

1 回答 1

2

您的示例代码使用“naoqi”库,但现在使用“qi”库更方便(您可以通过“pip install qi”获得它,它已经存在于您的机器人上,版本为 2.1 或更高版本)。在该版本中,您可以直接传递回调,请参阅此处获取允许您执行的帮助程序库events.connect("MyALMemoryKey", my_callback)(您传递函数而不仅仅是它的名称 - 它不关心函数来自哪里)。

在引擎盖下,它执行以下操作:

ALMemory.subscriber("MyALMemoryKey").signal.connect(my_callback)

(注意这里的 ALMemory 是一个服务(qi 框架)而不是一个模块(naoqi 框架)。

您可以直接使用该帮助程序库(请参阅此处的文档,以及此处使用它的一些示例),或者在您的代码中使用相同的逻辑(这不是很复杂,只要您有一个工作示例可以开始)。

于 2019-03-18T09:11:35.310 回答