オートノマスライフの考え方

#アプリケーションとアクティビティ

これまでのチュートリアルでは、Choregrapheを使って、アプリケーションという単位で実行をおこなってきました。これは、単一の機能（顔認識や対話など）のみを独立したプログラムとしてまとめるような形でした。

一方で、たとえば、Pepperと実際にリビングで一緒にいることを考えると、息をしているような振る舞いを常時行う、特に何もなければランダムに暇そうなジェスチャーをする、前に人間がいれば会話を持ち掛ける、人がぶつかってしまった際に、転倒時のために関節の固定を解除するなど、さまざまな振る舞いを実現する必要があることがわかります。

Pepperでは、このような多様な振る舞いに関して、1つのアプリケーションとしてすべて実装するのではなく、**基本的な振る舞い(人に視線を移す, 息をしているようなモーションをする, 転倒検出したら被害を抑えるような反応をする)**に**新たな振る舞い(アクティビティもしくはビヘイビア)を、振る舞いの起動条件とともに追加する**といった考え方を採用しています。

さらに、たとえば転倒を検出した際の全身の関節の固定を外す、関節温度の上昇を検知して動作をいったん停止するといったことは、サービスのための振る舞いよりも優先度を高く考えるべきです。
このような**安全確保のための反応(リフレックス)**と、サービスのための**アクティビティの実行**それぞれの優先度を管理する仕掛けも必要になってきます。

Pepperはこのような仕掛けとして **オートノマスライフ(Autonomous Life)** (自律的/生命)というモードを用意しており、開発者はアクティビティという単位で機能を表現し、その起動条件を定義することでPepperの振る舞いを多様にすることができます。

なお、 **オートノマスライフはバーチャルロボットではサポートしておらず、Pepper実機が必要になります**。
実際に動作させたい場合は、アルデバラン・アトリエ秋葉原などでPepper実機を使っていただければと思います。 (予約URL：http://pepper.doorkeeper.jp/events)

ここでは、オートノマスライフを考えるうえで必要な構成要素について説明し、これらの構成要素がどのように振る舞うのかを説明していきます。

##構成要素

###アクティビティ

アクティビティはオートノマスライフ内で実行可能なタイプの[ビヘイビア](http://qiita.com/Atelier-Akihabara/items/c5f57358a7b333eef397#4-3)です。アクティビティには2種類あり、

* Solitaryアクティビティ ... 対応すべき人がいない間に、Pepperがひとりでおこなうアクティビティ
* Interactiveアクティビティ ... 人間との対応をおこなうアクティビティ

Solitaryアクティビティでは、対応すべき人を待つ、あるいは周囲の人を自分に引きつけるなど、Interactive状態になることを促すような振る舞いを実装します。これは、常にInteractiveアクティビティによって割り込まれる可能性があります。

Interactiveアクティビティでは、人間との対応をおこなうような振る舞いを実装します。Interactiveアクティビティは他のアクティビティによって割り込まれることはありませんが、適切に終了するように設計する必要があります。

アクティビティは同時に1つだけ起動することができますが、Interactiveアクティビティに関しては、名前、タグ、トリガーセンテンスに基づいて他のアクティビティから実行される可能性があります。

> ####![info.png](https://qiita-image-store.s3.amazonaws.com/0/54394/ed7863bd-4c2e-7710-58db-0e38a4f26959.png) (参考)ソフトバンクショップにおけるSolitaryアクティビティとInteractiveアクティビティ
> ソフトバンクショップにはPepperがおり、接客などをおこなっていますが、ソフトバンクショップでのPepperの振る舞いはオートノマスライフによって実現されています。
> たとえば、周りに人がいないときには独り言を言ったり、一人遊びを始めたりしますが、これはSolitaryアクティビティとして実装されており、人に問いかけたり、会話をする部分はInteractiveアクティビティとして実装されています。

###Autonomous Launchpad

センサーなど各種の周辺情報に基づいて、実行するべきアクティビティを決定する機構です。
Solitary状態において動作し、インストールされている各アクティビティのトリガー条件と現在の状態を比較し、実行すべきアクティビティを決定します。

複数のアクティビティが実行の候補となった場合、アクティビティの優先度としては、

- SolitaryアクティビティとInteractiveアクティビティが同時に条件を満たす ... Interactiveを優先
- 複数アクティビティが同時に条件を満たす ... 最も長く使われていないものを優先

といったルールで決定されます。

###リフレックス(反応)

安全確保のための反応としては以下のようなものがあります。

- 関節温度の上昇 ... 参考：ALBodyTemperature
- 致命的なハードウェアのエラー検出 ... 参考：ALDiagnosis
- 押されたこと、落下の検出 ... 参考：Push recovery, Fall manager(ALMotion)

###Basic Awareness, Breathing

オートノマスライフ起動中は、Basic Awareness と Breathing と呼ぶサービスによって、見た目として生きているような振る舞いをします。

* Basic Awareness (API ALBasicAwareness) ... 周辺の人間を認識し、常に人間に視線を向ける機能を提供する
* Breathing (API ALMotion) ... 呼吸をするようなモーションを提供する

それぞれの詳細はAPIを参照してください。


##状態遷移

オートノマスライフでは、周辺の状況、自身の状態などによって、4つの状態、

* Solitary (ひとりぼっち)
* Interactive (人間との対面)
* Safeguard (安全確保)
* Disabled (無効)

のそれぞれを遷移していきます。状態と遷移条件の関係は以下のようになります。

![states.png](https://qiita-image-store.s3.amazonaws.com/0/54394/158a124c-a4a6-0233-bbda-f70ab066797e.png)


Safeguard, Disabledの各状態における振る舞いは、開発者は定義することはできません。
対して、Solitary, Interactiveの状態では、Pepperにインストールされている各アクティビティのトリガー条件定義などにしたがって、適切なアクティビティが選択、起動されます。開発者は、アクティビティを定義することで、オートノマスライフにおける振る舞いをカスタマイズすることができます。

状態の変化を簡単なビデオにまとめました。Pepperがオートノマスライフを起動したあと、状態がどのように変化するかがわかります。なお、メモリウォッチャーパネルの使用方法は [Pepperチュートリアル (6)：タッチセンサー、人の認識#メモリイベント](http://qiita.com/Atelier-Akihabara/items/0a5826fb018a4d0e4268#2-2) などを参考にしてください。

[![オートノマスライフにおける状態の変化](http://img.youtube.com/vi/b7e9copynHQ/0.jpg)](http://www.youtube.com/watch?v=b7e9copynHQ)

動画から、Pepperの置かれた状況によって各状態がどのように変化するのかわかると思います。

次に、各状態において各構成要素がどのように振る舞うのかを見ていきます。

###Solitary (ひとりぼっち)

オートノマスライフ起動時の開始はSolitary状態からはじまります。
この状態においては、以下のようなことをおこないます。

* Basic AwarenessとBreathingの実行 ... 周囲の状況に対して反応するようなモーションをしたり、息をしているような（身体を一定間隔で上下するような）動作をします
* Autonomous Launchpadの実行 ... 周囲の状況を監視し、実行すべきアクティビティの選択を自動的におこないます

Autonomous LaunchpadがInteractiveアクティビティの起動を判断すると、Interactive状態に移行します。

###Interactive (人間との対面)

Interactive状態においては、人間との対話など、人間と相互作用をするようなアクティビティを実行します。
この状態においては、以下のようなことをおこないます。

* Basic AwarenessとBreathingの実行 ... 周囲の状況に対して反応するようなモーションをしたり、息をしているような（身体を一定間隔で上下するような）動作をします
* Autonomous Launchpadの停止 ... 新たなアクティビティの選択、実行を停止します

Interactiveアクティビティは、別のアクティビティを起動することがありえます。その際は現在のアクティビティは停止され、スタックされた状態になり、新しいアクティビティが起動します。
新しいアクティビティが停止されると、スタックされたアクティビティが再度起動されます。

Interactiveアクティビティが停止すると、Solitary状態へと戻ります。
なお、現在は未実装ですが、Pepperがすべての人間を見失った場合、Solitary状態に移行するというルールも規定されています。

###Safeguard (安全確保)

Safeguard状態には、先にリフレックス(反応)として挙げた、対応の緊急度が高い事象

- 関節温度の上昇 ... 参考：ALBodyTemperature
- 致命的なハードウェアのエラー検出 ... 参考：ALDiagnosis
- 押されたこと、落下の検出 ... 参考：Push recovery, Fall manager(ALMotion)

が、Solitary, Interactive状態の際に発生した場合に遷移します。この状態においては、各サービスは以下のようになります。

* 起動していた全アクティビティ(スタックされたもの含む)が停止、消去されます
* Basic Awareness, Breathingが停止されます
* Autonomous Launchpadが停止されます


問題の解消が確認されたのち、Safeguard状態からSolitary状態に移行します。
たとえば温度上昇の際は、温度が正常稼働可能な範囲に戻ったのちSolitary状態に戻ります。対して、ハードウェア故障などを検出した際はSafeguard状態のまま維持されます。

なお、Safeguard状態への移行はアルデバランのコードからのみおこなう必要があります。開発者のアプリケーションなどでSafeguard状態に遷移させないように注意してください。

###Disabled (無効)

Pepper起動時はDisabled状態からはじまります。また、各状態で無効化をされたり、Safeguard状態での反応に失敗した場合Disabled状態に戻ります。

この状態において、各サービスは以下のようになります。

* 起動していた全アクティビティ(スタックされたもの含む)が停止、消去されます
* Basic Awareness, Breathingが停止されます
* Autonomous Launchpadが停止されます


#アクティビティの設定に関するユーザインタフェース

##オートノマスライフの起動・停止

オートノマスライフの起動・停止は、ツールバーからおこなうことができます。
**[オートノマスライフのオン]**ボタンを押すと、オートノマスライフを起動でき、再度同じボタンを押すと、オートノマスライフを停止することができます。

![toolbar.png](https://qiita-image-store.s3.amazonaws.com/0/54394/36e3f63d-46c4-65e9-2321-d93efdc72148.png)


##プロジェクトのプロパティ

自分のアプリケーションをオートノマスライフ対応にするためには、以下のように操作します。
具体的にどのようにしてアクティビティを作成していくかは、今後のチュートリアルで説明していきます。

1. [プロジェクトの内容]パネルの**[プロパティ]ボタンをクリック**します

    ![project_content.png](https://qiita-image-store.s3.amazonaws.com/0/54394/9b6e857d-445d-459c-4f0d-a5cb11af90a8.png)   

2. プロジェクトのプロパティダイアログが開きますので、**設定変更したいビヘイビアを選択[A]**すると、**アクティビティのタイプなどを選択する[B]**ことができます

    ![project-properties.png](https://qiita-image-store.s3.amazonaws.com/0/54394/1e36bc60-cdf3-0a54-785c-8e83f282ac2c.png)

##ロボットアプリケーション

ロボットにインストールされているアクティビティを管理するには、[ロボットアプリケーション]パネルを利用します。通常、[ロボットビュー]と同じ領域にあり、[ロボットアプリケーション]タブを選択することで表示することができます。
見つからない場合は[表示]メニューから[ロボットアプリケーション]を選択してください。

![robot-application.png](https://qiita-image-store.s3.amazonaws.com/0/54394/66b858b3-2675-e0e3-e106-4c9b82ef06df.png)

ロボットアプリケーションパネルでは、以下の機能を提供します。

1. アプリケーションリスト ... 接続中のロボットにインストールされているアプリケーションの一覧が表示されます
2. インストールボタン ... 現在編集中のアプリケーションをパッケージしてロボットにインストールします
3. 削除ボタン ... 選択したアプリケーションをロボットからアンインストールします
4. フィルターを表示ボタン ... アプリケーションリストを絞り込むためのフィルターテキストボックスを表示します

今後のチュートリアルで、簡単な例を通してSolitary, Interactive各アクティビティについて、ユーザインタフェースの操作方法などをみていきます。