QiChatの使い所(2)


 本記事は以下の環境で動作を確認しています。

バージョン
NAOqi 2.5.5.5
Choregraphe 2.5.5.5

この記事の内容

 前回の記事『QiChatの使い所(1)』では、ロボアプリを構成する特徴的な技術
としてChoregrapheダイアグラム、Python、QiChat、ALMemoryを紹介し、QiChatからChoregrapheダイアグラムを結びつける方法を紹介しました。今回はQiChatからNAOqi APIやALMemoryの使い方を結びつける方法を紹介したいと思います。

APIを直接コールする

 QiChat関数で^run^startを使いモーションが定義されているビヘイビアを実行させることができました。会話の進行に合わせたモーション制御ができました。ですが、モーションではなく、個別のAPIの呼び出しを会話の進行と共にできたら便利なはずです。
 QiChatの関数を使えばそんなことができてしまいます。

QiChat関数 ^call, ^pCall

 QiChat関数 ^call^pCallはNAOqi APIを実行します。

構文:

^call(<NAOqiModule>.<Method>(<Params>))
^pCall(<NAOqiModule>.<Method>(<Params>))

 QiChat関数^run^startのようにこちらも働きは同じで、非同期か同期かの違いになります。

QiChat関数 処理内容の詳細
^call 同期処理。呼び出しAPIの終了を待ち後続処理が実行される。
^pCall 非同期処理。呼び出しAPIの終了を待たないで後続処理が実行される。

 いくつか実際のAPIを実行させて動作を確認してみたいと思います。ALMemoryにデータを書き込んで見たいと思います。

u:(メモリに書き込んで) 書き込みます! ^call(ALMemory.insertData("TestApp/TestKey", "TestData")) テストデータを書き込みました!

 上記のコードは、利用者の「メモリに書き込んで」との呼びかけにPepperが「書き込みます」と反応しAPIを呼び出し、書き込み完了後Pepperが「テストデータを書き込みました」と反応します。

実行結果:

 QiChatから直接APIが実行され、ALMemory上にデータが書き込まれていることが確認できます。
 QiChatからPython側から処理を行うようなAPIコールが実現できますね。

ALMemoyとの繋がり

 実は上記のような方法を行なわなくてもQiChat側からALMemoryを利用できます。今度はALMemoryへの書き込みを^callを使わずにQiChat変数$から行いたいと思います。

QiChat変数 $ 書き込み

 構文を説明する前に以下のコードを見てください。データが正しく書き込まれているか確認するため書き込む内容を”TestData2”とします。

u:(メモリに書き込んで) 書き込みます! $TestApp/TestKey="TestData2" テストデータを書き込みました!

実行結果:

 API呼び出しのQiChat関数^callを使わなくても$だけでALMemoryにデータが書き込まれていることが確認できました。
 つまりここでのQiChatでいう変数はALMemory変数と結びついているということになります。

QiChat変数 $ 読み込み

 実は、このQiChatの$はデータの読み込みも行えるのです。QiChatスクリプトを以下のように書き換えます。

u:(メモリに書き込んで) 書き込みます! $TestApp/TestKey="TestData2" テストデータを書き込みました!
$TestApp/TestKey

 書き込んだ"TestData2"が発話されています。
 書き込みだけでなく読み込みに関してもALMemoryと結びついていることが確認できました。

 Pepperに発話させるのではなく、QiChat変数$の値を関数呼び出しと組み合わせて使えるか試してみましょう。

u:(メモリに書き込んで) 書き込みます! $TestApp/TestKey="TestData2" テストデータを書き込みました!
^call(ALMemory.insertData("TestApp/TestKey3", $TestApp/TestKey))

 こちらも変数"TestApp/TestKey3"に値"TestData2"が書き込まれていることが確認できます。

構文

 QiChatの変数構文をまとめると以下のようになります。

構文
書き込み <ALMemoryKey> = <Data>
読み込み <ALMemoryKey>

まとめ

 いかがでしょうか。QiChat通して会話のみならず、Pythonで処理するようなAPI呼び出しやALMemoryの書き込み・読み込みができ、ロボアプリを構成する特徴的な技術を結びつける方法が理解いただけれたと思います。