PepperではQiChat Scriptという、対話に特化した独自のスクリプト言語で人間とPepperの会話を実装することができます。
Communityに投稿されていた ALMemoryの格納と取得のタイミングが合わない を見て、変数参照の置き換えタイミングってどんな感じなんだろう?と思ってドキュメントをざっと見たが、それらしき記述は見つからず。簡単な範囲で動作確認してみたのでメモ。
実験内容
実験に使ったファイルはGitHub https://github.com/yacchin1205/pepper-dialog-tests の VariablesTest にあります。
アニメーションの前後で変数を参照した場合、どのようなタイミングで変数が参照されるのかを確認するために、
-
MyCountをアニメーションの前後でしゃべるようなQiChatのルールを記述
u:(アニメーション) 今は $MyCount ですよ。^mode(disabled) 1つめのアニメーションしますね。 ^run(animations/Stand/Gestures/Hey_1) 1つめのアニメーション終了後は $MyCount ですよ。2つめのアニメーションしますね。 ^run(animations/Stand/Gestures/Explain_11) 2つめのアニメーション終了後は $MyCount ですよ。
といった処理を用意してみました。
結果
それぞれ animations/Stand/Gestures/Hey_1
, animations/Stand/Gestures/Explain_11
は1秒以上はあるようなモーションですが、これを実行し、「アニメーション」と話しかけると、
ロボット:今は57ですよ。1つめのアニメーションしますね。 1つめのアニメーション終了後は57ですよ。2つめのアニメーションしますね。 2つめのアニメーション終了後は57ですよ。
と、ダイアログビューに表示され、上記の内容でPepperがモーション再生をおこないながらしゃべりました。
何度か動作確認しましたが、$MyCount
の値はアニメーション前後で同じ値になりました。これは、u:のルールにマッチした時点で、出力中のすべての変数が置き換えられているのだと考えられます。
APIの観点では、$変数
はALDialogがサポートする記法で、^run
はALAnimatedSpeechがサポートする記法なわけですが、おそらくALDialogはALAnimatedSpeech向けの記述に関知せず、$変数
の置き換えなどALDialogの責任分のみの処理をおこなって、あとはALAnimatedSpeechに委譲し、^run
の解釈、実行はALAnimatedSpeechの責任でおこなわれるという分担で行われているように見えます。
QiChatは$変数=値
のような記述ができたり、出力内で簡単なロジックを書けそうに思えるので、一瞬「?」という動作ではありますが、これはこれで仕様として妥当性がありそうに思えます。というのも、よくある変数参照の用途として、
u:(e:イベント) $イベント
みたいな感じで、イベントをフックしてその値をしゃべらせるといった記述があるわけですが、$イベント
の前に演出としてモーションなどを入れたくなってくることを考えると、ルールがマッチした瞬間の値を参照してくれるほうが意図しない動作を起こしにくそうにも思えるため・・・この辺のダイナミックな部分は、ドキュメントとして書ききるのは難しいですねえ・・・
変数設定についても調べたんですけど、時間を見てまた結果を書きます。