如何订阅标志

2024-10-02 12:31:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着订阅一个信号,但我不知道它到底是怎么做的。 我读过http://doc.aldebaran.com/2-4/dev/libqi/api/python/signal.html,但还是不完全理解。下面是一段代码,我试图在这里等待这个信号ALBehaviorManager.behaviorStopped('some_behavior'),然后调用一些回调:

service = session.service("ALBehaviorManager")

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

signal.connect(my_callback)

但得到以下错误消息:

^{pr2}$

已编辑

service = session.service("ALBehaviorManager")

signal = qi.Signal()

signal(service.behaviorStopped('my_behavior'), my_callback())

当我运行这个程序时,它不等待信号,它只调用my_callback

编辑编号2

import qi
import sys


def on_behavior_stopped_callback(behavior_id):
    if behavior_id == "test_video_player-fdb9c9/behavior_1":
        print "Yeah"
    else:
        print "Noooooo"

if __name__ == '__main__':
    ip = "11.1.11.111"
    port = 9559

    session = qi.Session()
    try:
        session.connect("tcp://" + ip + ":" + str(port))
    except RuntimeError:
        print ("Can't connect to Naoqi at ip \"" + ip + "\" on port " + str(port))
        sys.exit(1)

    behavior_manager_service = session.service("ALBehaviorManager")

    behavior_stopped_signal = behavior_manager_service.behaviorStopped

    behavior_stopped_connection = behavior_stopped_signal.connect(on_behavior_stopped_callback)

根据您的响应(@JLS),当我运行这个python脚本时,它什么也不做。当前在机器人上,"test_video_player-fdb9c9/behavior_1"正在运行。我原以为python脚本不会立即完成,但它会等待从“behaviorStopped”类型接收到信号,并在收到信号后检查if behavior_id == "test_video_player-fdb9c9/behavior_1",然后根据情况执行它应该执行的操作。在

编辑编号3

让我们来看看这个情况:我有一个名为“listener”的行为,它的唯一目的是在其他行为停止时记录停止行为的名称。一种方法是生成一个事件,将信息发送给这个“侦听器”。好 啊。一切都很好,但是当一个内置行为停止时该怎么做,比如“dialog_runner_dev”。我想如果任何时候一个行为停止,它就会发出一个信号,这个信号可以被这个ALBehaviorManager::behaviorStopped(std::string behaviorName)捕捉到。在

我的想法是让信号监听器一直工作。当一个听者停止倾听时,另一个行为就会继续。在


Tags: ip编辑signal信号portsessionmyconnect
1条回答
网友
1楼 · 发布于 2024-10-02 12:31:03

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

behavior_manager_service = session.service("ALBehaviorManager")
behavior_stopped_signal = behavior_manager_service.behaviorStopped
behavior_stopped_connection = behavior_stopped_signal.connect(on_behavior_stopped_callback)

在某个地方定义了回调函数:

^{pr2}$

最后:

behavior_stopped_signal.disconnect(behavior_stopped_connection)

附录:

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

1:定义变量,使它们可以被main和回调访问:

pAnswer = qi.Promise()
fAnswer = pAnswer.future()

2:如果要阻止脚本,请使用

answer = fAnswer.value()

3:在回调函数中,设置值:

pAnswer.setValue(ans)

相关问题 更多 >

    热门问题