Python 如何订阅信号

Python 如何订阅信号,python,nao-robot,pepper,Python,Nao Robot,Pepper,我试图订阅一个信号,但我不知道它到底是怎么做的。 我已经读过了,但仍然没有完全理解。下面是一段代码,我试图等待此信号ALBehaviorManager.behaviorStopped('some_behavior'),然后调用一些回调: service = session.service("ALBehaviorManager") signal = qi.Signal(service.behaviorStopped('by_behavior')) signal.connect(my_callb

我试图订阅一个信号,但我不知道它到底是怎么做的。 我已经读过了,但仍然没有完全理解。下面是一段代码,我试图等待此信号
ALBehaviorManager.behaviorStopped('some_behavior')
,然后调用一些回调:

service = session.service("ALBehaviorManager")

signal = qi.Signal(service.behaviorStopped('by_behavior'))

signal.connect(my_callback)
pAnswer = qi.Promise()
fAnswer = pAnswer.future()
但会收到以下错误消息:

Traceback (most recent call last):
  File "C:/testing.py", line 24, in <module>
    signal = qi.Signal(service.behaviorStopped('by_behavior'))
Boost.Python.ArgumentError: Python argument types in
    Signal.__init__(Signal, NoneType)
did not match C++ signature:
    __init__(struct _object *, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)
    __init__(struct _object *)
当我运行它时,它不会等待信号,它只调用
my\u callback

编辑第2号

根据您的回答(@JLS),当我运行这个python脚本时,它什么也不做。目前在机器人上,此
“测试视频播放器-fdb9c9/behavior\u 1”
正在运行。我认为python脚本不会立即完成,但它会等待接收到来自类型“BehaviorsToping”的信号,并在接收到信号时检查behavior\u id==“test\u video\u player-fdb9c9/behavior\u 1”,然后根据条件执行它应该执行的操作

编辑第3号

让我们来看看这种情况:我有一个名为“listener”的行为,它的唯一目的是在任何时候停止其他行为以记录停止的行为的名称。一种方法是制作一个事件,将信息发送给这个“监听器”。好啊一切正常,但当内置行为停止时,如“dialog\u runner\u dev”,该怎么办。我认为,如果任何时候一个行为停止,它都会发送一个信号,该信号可以被这个
ALBehaviorManager::behaviorStopped(std::string behaviorName)
捕获

我的想法是制作一个一直工作的信号监听器。此信号侦听器将在行为停止时做出反应,然后继续侦听其他行为。

使用qi.signal()创建一个信号。我猜这里你想订阅一个现有的信号,它会调用一个你连接到它的回调函数:

behavior_manager_service = session.service("ALBehaviorManager")
behavior_stopped_signal = behavior_manager_service.behaviorStopped
behavior_stopped_connection = behavior_stopped_signal.connect(on_behavior_stopped_callback)
使用某个地方定义的回调函数:

def on_behavior_stopped_callback(behavior_id):
    if behavior_id == "some_app_uuid/some_behavior":
        do_something()
最后:

behavior_stopped_signal.disconnect(behavior_stopped_connection)
附录:

如果您需要阻塞并等待信号发生,一个技巧是使用一个线程安全变量,您可以等待,比如从回调中分配的承诺。A只能设置一次,因此如果需要多次设置,请使用A

1:在main和回调可以访问的地方定义变量:

service = session.service("ALBehaviorManager")

signal = qi.Signal(service.behaviorStopped('by_behavior'))

signal.connect(my_callback)
pAnswer = qi.Promise()
fAnswer = pAnswer.future()
2:要阻止脚本的位置,请使用

answer = fAnswer.value()
3:在回调函数中,设置值:

pAnswer.setValue(ans)
使用qi.Signal()创建一个信号。我猜这里你想订阅一个现有的信号,它会调用一个你连接到它的回调函数:

behavior_manager_service = session.service("ALBehaviorManager")
behavior_stopped_signal = behavior_manager_service.behaviorStopped
behavior_stopped_connection = behavior_stopped_signal.connect(on_behavior_stopped_callback)
使用某个地方定义的回调函数:

def on_behavior_stopped_callback(behavior_id):
    if behavior_id == "some_app_uuid/some_behavior":
        do_something()
最后:

behavior_stopped_signal.disconnect(behavior_stopped_connection)
附录:

如果您需要阻塞并等待信号发生,一个技巧是使用一个线程安全变量,您可以等待,比如从回调中分配的承诺。A只能设置一次,因此如果需要多次设置,请使用A

1:在main和回调可以访问的地方定义变量:

service = session.service("ALBehaviorManager")

signal = qi.Signal(service.behaviorStopped('by_behavior'))

signal.connect(my_callback)
pAnswer = qi.Promise()
fAnswer = pAnswer.future()
2:要阻止脚本的位置,请使用

answer = fAnswer.value()
3:在回调函数中,设置值:

pAnswer.setValue(ans)

您的信号是否安装在行为“我的行为”中?如果是的话,那么它可能是有意义的:您的程序在发出信号(即非阻塞)后无事可做,所以离开,所以就在您收到回调之前(但您不应该在终止时…)。尝试添加while 1或time。请在signal方法之后等待,以尝试查看更改。。。祝你好运…@Alexandre Mazel这就是问题所在,行为来自基本频道——“run_dialog_dev”。它负责运行所有对话框,并根据机器人是否与人对话来打开和关闭。因此,我试图找到一种方法来知道它何时停止。您还可以使用ALBehaviorManager了解行为的启动和停止时间:您可以询问运行行为的列表,还可以在每次安装/启动/启动行为时注册到一些事件跟踪。cf API:@AlexandreMazel请参考EDDITED No.3。我不知道内置行为的特殊情况,这很遗憾。如果这真的是这种类型的行为,那么也许作为一种解决方法,你可以直接要求ALSpeechRecognition或ALDialog了解他们的当前状态(甚至是自主生活)好的,他们只是解决方法…你的信号是否安装在行为“我的行为”中?如果是的话,那么它可能是有意义的:您的程序在发出信号(即非阻塞)后无事可做,所以离开,所以就在您收到回调之前(但您不应该在终止时…)。尝试添加while 1或time。请在signal方法之后等待,以尝试查看更改。。。祝你好运…@Alexandre Mazel这就是问题所在,行为来自基本频道——“run_dialog_dev”。它负责运行所有对话框,并根据机器人是否与人对话来打开和关闭。因此,我试图找到一种方法来知道它何时停止。您还可以使用ALBehaviorManager了解行为的启动和停止时间:您可以询问运行行为的列表,还可以在每次安装/启动/启动行为时注册到一些事件跟踪。cf API:@AlexandreMazel请参考EDDITED No.3。我不知道内置行为的特殊情况,这很遗憾。如果这真的是这种类型的行为,那么也许作为一种解决方法,你可以直接要求ALSpeechRecognition或ALDialog了解他们的当前状态(甚至是自主生活)好的,他们只是解决方法…请参考编辑的No.2OK,我也添加了这个答案!订阅只是将回调连接到信号,而不是等待发出该信号。如果您想等待,可以使用futures或其他线程安全系统,例如队列。期货只能设定一次。请参考已编辑的No.2OK,我已经添加了answe