簡體   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