Pepper / Subscribe to EventとRaise Eventについて

Pepperの`ALMemory`周りのメモ
Choregrapheに用意されているBOXのみで`ALMemory`にデータを格納、
通知を受け取って他のボックスに更新を適用させるサンプル。



#1. 目的
Choregrapheに**デフォルトで用意されているボックスのみ**を使って、
イベントの通知によって別のボックスの動作を促せないか、、、



#2. 結果
**`Subscribe to Event`というボックスと`Raise Event`というボックスを利用することにより実現出来る！**
（正確には`Subscribe to Event`を利用しなくてもできます）



#3. 概要
![Screen-Shot-2015-02-26-at-11.12.57-AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/1ec6682a-ea54-8338-5f5c-b349f0f19b73.jpeg)

`root`に`Observer`という名前のボックスと`Notification`という名前のボックスを配置

* **`Observer`ボックスにはイベント通知を受け取った後の処理**
* **`Notification`ボックスにはイベント通知をするための処理**


##3-1. Observerボックス

`root > Observer`

![Screen-Shot-2015-02-26-at-11.10.52-AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/27244edd-6516-1cfd-eff7-860b708027bd.jpeg)

`Observer`ボックスの中身には**`Subscribe to Event`**と確認用に`Say Text`を配置。

![Screen Shot 2015-02-26 at 12.24.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/70456/9da99b5c-a357-2594-97cf-1d6936a7bfe8.png)

`Subscribe to Event`のパラメーターはそのままで。



##3-2. Notificationボックス

`root > Notification`

![Screen Shot 2015-02-26 at 3.13.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/70456/455fa24f-1959-4ab4-48c0-5c19e5c8c87e.png)

`Notification`ボックスの中身にはPepperくんに挨拶する内容によって、
**`Raise Event`**に渡る値が変化するようにボックスを配置

*動作の流れ*

1. `Speech Reco.`によってPepperくんに音声をインプット
2. `Switch Case`を使い聞いた言葉により条件分岐して`Multi Edit`で値の調節
3. **`Raise Event`を使って受け取った値を通知**(重要)

![Screen Shot 2015-02-26 at 12.39.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/70456/c9658884-b226-94f5-56f8-7d4d041c1580.png)

`Raise Event`のパラメーターもそのままで。

##3-3. Subscribe to EventとRaise Eventの簡単な説明

**`Raise Event`というボックスに値を送る**ことにより、
パラメーターで設定した`MyApplication/MyData`というイベントの
値が更新され、**`Subscribe to Event`に通知**されます。
簡単！！



##3-4. 実行結果

![Screen-Shot-2015-02-26-at-3.13.45-PM_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/bd4ca3ca-d938-75a2-9b4d-5cf5aa228065.jpeg)

先ほど組んだアプリを起動して、Dialogウィンドウに「おはよう」と打ってエンターを押すと、
「今は朝なんですね」と返ってきました。



##3-5. アプリの流れ

（Pepper実機では無いので`Speech Reco.`でエラーが起きてます、、、）
![Screen-Shot-2015-02-26-at-3.13.45-PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/463d6724-298e-f334-b17f-89c3f15352f5.jpeg)

Pepperに「おはよう」と話しかけることにより、
**`Notification`ボックス内の`Speech Reco.`が反応、`Raise Event`に値が渡ります。**

![Screen-Shot-2015-02-26-at-3.14.16-PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/ce456a24-b16b-9026-cf8f-1c58bbb9aa10.jpeg)

**`Observer`ボックス内の`Subscribe to Event`が`ALMemory`の更新通知を受け取り**、
値を`Say Text`に吐き出します。



##3-6. こっちの方がスマート、、、？

![Screen Shot 2015-02-26 at 3.36.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/70456/9392ab79-77ac-c961-7648-528a998f32e0.png)

`Add event from ALMemory`の吹き出しが付いてる下の(+)をクリック。

![Screen Shot 2015-02-26 at 3.39.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/70456/1c7c7119-f20b-9ad9-8f3c-1aa68cc62c55.png)

`MyApplication/MyData`(**`Raise Event`のパラメーターにセットしたイベント名**)
のチェックボックスにチェックを入れる。

![Screen-Shot-2015-02-26-at-3.33.34-PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/215ad877-9c6c-f6ad-95b7-8859de7a9477.jpeg)

すると、**`MyApplication/MyData`**という新しいインプットが増えているので、
ここから`Say Text`に繋ぐ。

![Screen-Shot-2015-02-26-at-3.35.20-PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/70456/40cdeff2-3084-47d5-5dd1-531afedf9962.jpeg)

**これでも先ほどと同じ動作をします。**
こちらのほうが少しアプリがスマートになるのかな。
（内部的にはどのような処理の違いがあるのか分かりませんが、、、）



#4. まとめ
他の方法でもこのアプリの実装は可能ですが、
`Notification`（インプット）と`Observer`（アウトプット）を分けることで、
簡単なアプリならごちゃごちゃせずに組めます。