2017-08-30 3 views
2

私はシグナルを購読しようとしていますが、どのように正確に行われたのか分かりません。 私はhttp://doc.aldebaran.com/2-4/dev/libqi/api/python/signal.htmlを読みましたが、まだそれを完全に理解していません。次のエラーメッセージシグナルを購読するには

service = session.service("ALBehaviorManager") 

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

signal.connect(my_callback) 

しかし得る:ここで私はいくつかのコールバックを呼び出すよりも、この信号ALBehaviorManager.behaviorStopped('some_behavior')を待つとしようとしているコードである

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 *) 

EDITEDは

service = session.service("ALBehaviorManager") 

signal = qi.Signal() 

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

これを実行すると、信号を待つことはなく、ただ電話するだけです。my_callback

EDITED 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) 

私はそれが何もしません。このPythonスクリプトを実行すると、あなたの応答(@JLS)に基づいています。現在のところ、ロボットでは"test_video_player-fdb9c9/behavior_1"が実行されています。私はPythonスクリプトがすぐに終了しないと思ったが、受け取ったタイプ「behaviorStopped」からの信号と、それが受信されてif behavior_id == "test_video_player-fdb9c9/behavior_1"であることを条件にして何をするかを待っていただろう。

EDITED 3番

このような状況があります:私は唯一の目的は、他の動作が停止した行動の名前をログに記録する停止している任意の時点で「リスナー」という名前の1件の挙動を持っています。それを行うための1つの方法は、この「リスナー」に情報を送るイベントを作ることです。 OK。すべて正常に動作しますが、 'dialog_runner_dev'などのビルドイン動作が停止した場合の対処方法私は、いつでも行動が止まると、それはこのALBehaviorManager::behaviorStopped(std::string behaviorName)によって捕まえることができるシグナルを送ると思った。

私の考えは、常に動作するシグナルリスナーを作ることです。この信号リスナーは、ビヘイビアーが停止したときに反応し、他のビヘイビアのリスニングを継続します。

+1

信号が「my_behavior」という動作にインストールされていますか?そうであれば、あなたのプログラムはシグナル(ブロッキングではない)の後に何もしないので、あなたのコールバックを受け取る直前(しかし、あなたが終了したときには...)にする必要はありません。シグナルメソッドの後に変更を見ようとしている間に1または1つのtime.waitを追加してみてください...幸運にも... –

+0

@Alexandre Mazelそれは問題です、その動作は基本チャンネルからのものです - 'run_dialog_dev'。これはすべてのダイアログを実行する役割を担い、ロボットが人と話しているかどうかによってオンとオフになります。だから私はそれがいつ止められるかを知る方法を見つけようとしています。おそらく、それが始まったとき。 –

+0

ALBehaviorManagerを使用して、ビヘイビアの起動と停止を知ることもできます。実行中のビヘイビアのリストを要求し、ビヘイビアのインストール/起動/開始時に追跡するイベントに登録することもできます。 cf API:http://doc.aldebaran.com/2-1/naoqi/core/albehaviormanager-api.html –

答えて

2

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) 

補遺:

シグナルをブロックして待機する必要がある場合は、コールバックから割り当てられた約束のように、待つことができるスレッドセーフ変数を使用するのが賢明です。 qi.Promiseは1度しか設定できません。そのため、複数回発生する必要がある場合は、代わりにQueueを使用してください。

1:

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

2:彼らはあなたがメインとコールバックのためにアクセスできるようになり、どこかの変数を定義するスクリプトをブロックしたい場合は、

answer = fAnswer.value() 

3を使用します。にコールバック関数で値を設定します。

pAnswer.setValue(ans) 
+0

EDITED No.2 –

+0

を参照してくださいOK、私もその答えを追加しました!サブスクリプションはコールバックをシグナルに接続するだけで、そのシグナルが呼び出されるのを待つことはありません。待機したい場合は、先物やキューなどのスレッドセーフなシステムを使用することができます。先物は一度しか設定できません。 – JLS

関連する問題