Как подписаться на событие в Naoqi, используя Python и ROS? - PullRequest
0 голосов
/ 16 марта 2019

Как я могу подписаться на событие, используя функцию ALMemory subscribeToEvent, которая требует правильной области действия Python при использовании ROS (rospy), который запускает модули вне моего кода?

Этот вопрос похож на этот вопрос о подписке для 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")

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)

Я хочу, чтобы mainBehaviour.py, используя nao.py, имел функцию robotHasFallen срабатывать при падении робота. Тем не менее, текущий код не производит это поведение (он игнорирует любое падение), но также не выдает ошибку. Я попытался реализовать это, используя этот учебник ALMemory . Тем не менее, это руководство использует один файл Python, в котором методы не создаются ROS. Поэтому я не могу использовать строку pythonModule = myModule("pythonModule"). Я попытался все еще получить эту область видимости Python (в которой ответ на ранее связанный вопрос гласит: «переменная python должна иметь то же имя, что и имя создаваемого вами модуля»), объявив глобальную переменную, указывающую на self.

Как я могу создать желаемое поведение, обнаружив упавшего робота с помощью subscribeToEvent, используя ROS с его последствиями - я сам не запускаю модули и, следовательно, не могу передать его конструктор?
Я не могу установить дополнительные библиотеки, потому что использую университетский компьютер.

1 Ответ

2 голосов
/ 18 марта 2019

Ваш пример кода использует библиотеку "naoqi", но теперь удобнее использовать библиотеку "qi" (вы можете получить ее с помощью "pip install qi", она уже присутствует на вашем роботе в версиях 2.1 или выше).В этой версии вы можете напрямую передать обратный вызов, см. здесь для вспомогательной библиотеки, которая позволяет вам делать events.connect("MyALMemoryKey", my_callback) (вы передаете функцию, а не только ее имя - и неважно, где функцияпроисходит от).

Под капотом он делает это:

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

(обратите внимание, что здесь ALMemory - это Service (qi framework), а не module (платформа naoqi).

Вы можете напрямую использовать эту вспомогательную библиотеку (см. документ здесь и некоторые примеры, использующие ее здесь ), илииспользуйте ту же логику в своем коде (это не очень сложно, если у вас есть рабочий пример для начала).

...