NAOqi OS 2.4.3 から 2.5.5 へ以降する際の注意ポイント

# はじめに
2017年4月4日に、Pepper for Biz を対象に NAOqi OS 2.5.5 のアップデートが配信されます。

[【Pepper for Biz】ソフトウェア「NAOqi OS 2.5.5」リリースのお知らせ](http://www.softbank.jp/robot/news/support/20161219a/)

今回のアップデートでは、これまでの OS とは互換性のない変更がいくつかなされており、
NAOqi OS 2.4.3 で動いていたアプリが動かなくなってしまうこともあります。
この記事では、すでに NAOqi OS 2.4.3 で動いているアプリを 2.5.5 に移行する際に見つけた注意ポイントをいくつか記載しています。

尚、すでに公式にアナウンスされている変更が必要な箇所については触れていませんので、
詳細については以下を参照してください。
[NAOqiバージョンアップ(v2.5.5)のお知らせ.pdf](https://developer.softbankrobotics.com/Software/documentation/NAOqi%E3%83%8F%E3%82%99%E3%83%BC%E3%82%B7%E3%82%99%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A(v2.5.5)%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.pdf)




# 前提条件
以下の記述はすべて Pepper for Biz で動作を確認しています。




# インターネット 未接続時の Speech Reco, Dialog の onStopped 出力タイミング
## まずは入れ替える必要あり
Pepper のアプリでは割とよく使用する Speech Reco ボックスと Dialog ボックスですが、「はじめに」で記載した [PDF 資料](https://developer.softbankrobotics.com/Software/documentation/NAOqi%E3%83%8F%E3%82%99%E3%83%BC%E3%82%B7%E3%82%99%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A(v2.5.5)%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B.pdf)上で、「互換性のないBOXの置換」として記載されているので、既存のアプリを NAOqi OS 2.5.5 で動かす場合は Choregraphe 2.5.5 でボックスを入れ替える必要があります。

## 何が問題か
「インターネット未接続時」とは、LANにのみ繋がっている状態、Pepper 設定画面のネットワーク状態の色がオレンジ色になっている状態のことです。

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/172685/8e4183b9-5d60-0c9f-f66a-ea93962ba96e.png)

基本的に Pepper はインターネット接続環境がある状態での使用を推奨されていますが、イベント会場や地下フロアなど、LANには繋がるけれどインターネットには接続できない、といった環境でも稼働する場合も意外とあります。
こんな環境で アプリを動かす際に起こるのが以下の事象です。

以下は良くある Speech Reco の使用例です。
音声を認識した後に Speech Reco ボックス自体を停止しつつ次の処理に移るようにしています。
こうすることで、Pepper が自分自身のセリフを聞き取って無限ループに入るのを防いだり、あるいは 複数の　Speech Reco ボックスを使用した場合の認識する Word List を他の Speech Reco ボックスに切り替えることができます。


<img width="620" alt="スクリーンショット 2017-03-29 13.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/172685/1072c97e-1dd8-f366-62dc-543866502611.png">


インターネット未接続かつ NAOqi OS 2.4.3 の場合、Speech Reco や Dilalog ボックスを使うと、onStopped 出力が発火されるのに、**数秒間かかります。**
ところが NAOqi OS 2.5.5 で動かすと、onStopped 出力は、onStop 入力に入ったタイミングで発火されます。

インターネット未接続時に数秒かかるのを見越した上で実装を行っている場合、2.5.5 で動作させた場合に予期しないタイミングで onStopped が発火し予期せぬ挙動をする可能性があります。


## 解決方法

本事象を解決（というより対処）する場合は、インターネット未接続時、NAOqi OS 2.5.5 で Speech Reco, Dialog ボックスを利用する場合、onStopped 出力が発火されるタイミングが異なることを十分理解した上で実装を行う必要があります。







# Expression Watcher ボックスのパラメータの書き方
## Expression Watcher ボックスとは
Expression Watcherボックスとは、Pepper が起動中に発火する様々なイベント、ALMemory のデータを監視しつつ、
単に「発火した」というだけではなく、データの値に条件を指定して true, false を出力するボックスです。

<img width="131" alt="スクリーンショット 2017-03-29 10.52.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/172685/d343a7a0-83f2-2682-7407-68ebae6d9c61.png">

例を見てみましょう。
まずは、Expression Watcherボックスのパラメータ 「Condition」に以下の条件を入力します。

```
('MyData' == 1) ~2
```

これは、「MyData」というキーのデータが 2秒間1 である場合、という条件です。 

Insert Data ボックスのパラメータ「key」に「MyData」と入力して試してみます。
ボックスの配置はこんな感じです。

<img width="620" alt="スクリーンショット 2017-03-29 11.02.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/172685/6cad37a3-c3d8-3057-9044-2de6db136083.png">



この状態でアプリを起動すると、Expression Watcher ボックスからいきなり false が出力されます。
まだ指定した条件に合致していないため false となります。
この状態で、Insert Data ボックスの onStart 入力をダブルクリックしてみましょう。

<img width="620" alt="スクリーンショット_2017-03-29_11_02_47_のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/172685/dbcb5448-9a40-4c37-0a36-b0798fbec118.png">

すると入力画面が表示されるので「1」と入力して「OK」をクリックします。
そして ２秒待つと…

<img width="620" alt="スクリーンショット 2017-03-29 11.09.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/172685/8308e67f-d375-2cef-0b52-0543bb56970e.png">

true が出力されます。
このように、値に対して時間的な条件を指定することができます。
他にも、複数の条件を組み合わせることもできるのでなかなか便利なボックスです。

条件書式の詳細については Choregraphe のドキュメントに記載があるので適宜参照してください。
[Launch trigger conditions — Aldebaran 2.4.3.28 documentation](http://doc.aldebaran.com/2-4/naoqi/interaction/triggerconditions.html#launchpad-expressions)


## 何が問題か
前置きが長くなりましたが本題です。

NAOqi OS 2.4.3 で動いていたアプリを 2.5.5 で動かしてみたところ、Expression Watcher ボックスで以下のようなエラーが出ました。

```
RuntimeError: Invalid expression syntax: "bang(myEvent) && 'myEvent' == 1"  
```

どうやら文法エラーのようです。
実際のアプリでの条件は上記の例ほどシンプルではなかったので、具体的に条件文のどこが原因なのかを探るのに少し時間がかかってしまいました。

## 解決方法

試しに Choregraphe 2.4.3 と 2.5.5 でデフォルトの Expression Watcher ボックスの「Condition」パラメータに入っている記載を見ると以下のようになっています。

2.4.3 の場合

```
bang(myEvent) && 'myEvent' == 1
```

2.5.5 の場合

```
bang('myEvent') && 'myEvent' == 1
```

2.5.5 では条件に指定する ALMemory のキー名をシングルクォーテーションで囲むことを厳密にチェックするようになったようです。

同様の事象が発生した場合は条件に指定している文字列を確認してみてください。





# requests ライブラリのバージョンが下がった

## Pepper と requests 
requests とは Python でよく利用されている、HTTPライブラリです。（使用方法の説明については割愛します）
[Requests: HTTP for Humans](http://docs.python-requests.org/en/master/)

このライブラリは Pepper 本体の中にインストールされているため、**Pepper の実機に接続した状態であれば**、アプリ内で `import` することで、特に requests ライブラリをアプリ内に保持することなく使用できます。
（バーチャルロボットで requests ライブラリを使用する場合は、アプリ内に保持した requests ライブラリへの パスを通す必要があります）

今回のNAOqi OS 2.5.5 アップデートでは、このライブラリのバージョンが以下のように下がっています。

|NAOqi OS ver|requests ver|
|:--|:--|
|2.4.3|2.5.1|
|2.5.5|**2.3.0**|

## 何が問題か
requests では、パラメータをPOSTする際に以下のような書き方をします。

```py
url = 'https://api.github.com/some/endpoint'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=payload)
```

この時、POST パラメータをJSON形式で送る場合以下のような書き方が可能です。
(**requests 2.4.2 以降**)

```py 
url = 'https://api.github.com/some/endpoint'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, json=payload)
```

太字で書いた通り、上記の書き方でのJSON形式 POST リクエストは requests のバージョンが 2.4.2 以上で使用可能な書き方です。
NAOqi OS 2.4.3 の Pepper では実行可能でしたが、2.5.5 の Pepper ではエラーが発生してしまいます。

## 解決方法

`json` キーワード引数での自動変換機能を使用するのをやめる、というのがシンプルな解決方法です。
以下がその例です。

```py
import json
url = 'https://api.github.com/some/endpoint'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=json.dumps(payload))
```

弊社のアプリではこの点が影響するのみでしたが、NAOqi OS 2.5.5 で requests を利用する際は、
requests のバージョンが下がったことを念頭に置くと解決する事象があるかもしれません。

# まとめ

本記事では、弊社アプリを　NAOqi OS 2.4.3 から 2.5.5　に移行する際、気付いた点を記載しました。
他のボックスにも挙動が異なる、独自実装の部分で対応が必要等あるかとは思いますが、少しでもお役に立てれば幸いです。