私はシグナルを購読しようとしていますが、どのように正確に行われたのか分かりません。 私は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)
によって捕まえることができるシグナルを送ると思った。
私の考えは、常に動作するシグナルリスナーを作ることです。この信号リスナーは、ビヘイビアーが停止したときに反応し、他のビヘイビアのリスニングを継続します。
信号が「my_behavior」という動作にインストールされていますか?そうであれば、あなたのプログラムはシグナル(ブロッキングではない)の後に何もしないので、あなたのコールバックを受け取る直前(しかし、あなたが終了したときには...)にする必要はありません。シグナルメソッドの後に変更を見ようとしている間に1または1つのtime.waitを追加してみてください...幸運にも... –
@Alexandre Mazelそれは問題です、その動作は基本チャンネルからのものです - 'run_dialog_dev'。これはすべてのダイアログを実行する役割を担い、ロボットが人と話しているかどうかによってオンとオフになります。だから私はそれがいつ止められるかを知る方法を見つけようとしています。おそらく、それが始まったとき。 –
ALBehaviorManagerを使用して、ビヘイビアの起動と停止を知ることもできます。実行中のビヘイビアのリストを要求し、ビヘイビアのインストール/起動/開始時に追跡するイベントに登録することもできます。 cf API:http://doc.aldebaran.com/2-1/naoqi/core/albehaviormanager-api.html –