![](/img/trans.png)
[英]How to subcribe an event of ALSpeechRecognition Naoqi in Python
[英]How to subscribe to event in Naoqi using Python and ROS?
如何使用ALMemory
的subscribeToEvent
函數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.