Как подписаться на событие в Naoqi с помощью Python и ROS?

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

Этот вопрос похож на этот вопрос о подписке Naoqi, но отличается тем, что не использовался роспы, что критично для реализации.

Мой текущий код таков:
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 с его последствиями, когда я не инициирую модули самостоятельно и, следовательно, не могу передать его конструктор?
Я не могу установить дополнительные библиотеки, потому что я использую университетский компьютер. .


person Isaiah    schedule 16.03.2019    source источник
comment
привет, не могли бы вы попробовать с начальным объявлением в начале вашего mainBehavior.py переменной: mainBehaviourMethod = None (потому что просто сказать глобальный позже не должно быть достаточно, чтобы действительно создать переменную с глобальной областью действия)   -  person Alexandre Mazel    schedule 19.03.2019


Ответы (1)


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

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

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

(обратите внимание, что здесь ALMemory — это Сервис (фреймворк qi), а не модуль (фреймворк naoqi).

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

person Emile    schedule 18.03.2019
comment
Спасибо! К сожалению, мы используем университетские компьютеры и не можем установить другие библиотеки. Используя ту же логику в своем коде, вы также хотите использовать функцию connect ()? Как мне тогда получить подписчика (используя naoQi)? - person Isaiah; 18.03.2019
comment
Вы даже не можете установить другие библиотеки с помощью pip install --user ? Для этого не требуются права суперпользователя; вы также можете просто загрузить Python SDK здесь: community.ald .softbankrobotics.com/en/resources/software/ (вы можете получить отказ, если не зарегистрировали (бесплатную) учетную запись) - person Emile; 25.03.2019