LoginSignup
6
7

More than 5 years have passed since last update.

QiChatの変数参照タイミングを調べてみる

Posted at

PepperではQiChat Scriptという、対話に特化した独自のスクリプト言語で人間とPepperの会話を実装することができます。

Communityに投稿されていた ALMemoryの格納と取得のタイミングが合わない を見て、変数参照の置き換えタイミングってどんな感じなんだろう?と思ってドキュメントをざっと見たが、それらしき記述は見つからず。簡単な範囲で動作確認してみたのでメモ。

実験内容

実験に使ったファイルはGitHub https://github.com/yacchin1205/pepper-dialog-testsVariablesTest にあります。

アニメーションの前後で変数を参照した場合、どのようなタイミングで変数が参照されるのかを確認するために、

  1. メモリに、0.1秒ごとに1増える変数 MyCount を用意
    count.png

  2. 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がサポートする記法で、^runALAnimatedSpeechがサポートする記法なわけですが、おそらくALDialogはALAnimatedSpeech向けの記述に関知せず、$変数の置き換えなどALDialogの責任分のみの処理をおこなって、あとはALAnimatedSpeechに委譲し、^runの解釈、実行はALAnimatedSpeechの責任でおこなわれるという分担で行われているように見えます。

QiChatは$変数=値のような記述ができたり、出力内で簡単なロジックを書けそうに思えるので、一瞬「?」という動作ではありますが、これはこれで仕様として妥当性がありそうに思えます。というのも、よくある変数参照の用途として、

u:(e:イベント) $イベント

みたいな感じで、イベントをフックしてその値をしゃべらせるといった記述があるわけですが、$イベントの前に演出としてモーションなどを入れたくなってくることを考えると、ルールがマッチした瞬間の値を参照してくれるほうが意図しない動作を起こしにくそうにも思えるため・・・この辺のダイナミックな部分は、ドキュメントとして書ききるのは難しいですねえ・・・

変数設定についても調べたんですけど、時間を見てまた結果を書きます。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7