Pepperアプリの仕組みをあらためてまとめてみる 〜Choregraphe版とAndroid版比較〜

# はじめに
この記事は [CyberAgent Developers Advent Calendar](https://adventar.org/calendars/3981) 2019 17日目の記事です。
（少し遅れてしまった。。。）

この記事では、現在流通しているPepperの大きな2つのタイプ、

- 主にChoragrapheという開発環境を利用してアプリ開発を行うPepper(以下、Choregraphe版)
- 新しく販売されたAndroid Studio でアプリ開発を行うPepper（以下、Android版）

のアプリの仕組みを適宜比較しつつまとめています。

# 想定している読者
- Pepper のアプリ開発についてあまり知らないけどちょっと興味ある人

# なんでこの内容なのか？
なぜこの内容にしたのかを少し書いてみようと思います。
内容だけ知りたい！という方はこの章は読み飛ばしてまったく問題無しです。

具体的に何を書こうかなーと思っていたところ、そういえば社内で「Pepper ってOSは何で動いているの？」「そもそもアプリ仕組みってどんな感じ？」といったことを聞かれることが多かったことを思い出し、意外とエンジニアの方にもPepperのアプリってどうなっているのか知られていない、ということに今更ながら気づきました（遅い）。
そこで、アドベントカレンダーというさまざまな人が異なる観点から書いた記事がまとまっているところに投稿することで、多少Pepperについて興味を持ってもらえたらいいなという想いと、自分の頭を整理する意味も込めてまとめよう、と思い今に至ります。

# Pepper とは
ソフトバンクが販売している、人型のコミュニケーションロボットです。
2014年に発表されたのでもう5年経つんですね、感慨深い。。。
参考：[Pepper 製品情報](https://www.softbank.jp/robot/pepper/)

# Choregrapheって？
はじめのところでサラッと書いていたのですが、Choregrapheってご存知でしょうか？
これのイメージができていないと多少わかりにくいかもしれないので、まずははじめに少し説明を。
一言でいうと、GUIベースでコードも少しいじれる開発環境です。
イメージとしては[Node-RED](https://nodered.org/)が近いと思います。

<img width="600" alt="スクリーンショット 2019-12-18 11.26.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534668/a8b772d2-3442-3db5-d647-31aed8c8c99b.png">
こんな感じで「ボックス」と呼ばれるモジュールをGUIでつなげていきます。


<img width="600" alt="スクリーンショット 2019-12-18 11.27.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534668/7d8627d1-84d4-ac21-edb8-ace6c0f57e4c.png">
それぞれのボックスの中身はPythonで書かれているので、このようにコードを直接いじることもできます。

Choregraphe版では主にこの開発環境を使って開発を行います。

# Pepperの種類
アプリの仕組み中心の記事とはいえ、多少はPepperにどのようなモデルがあるのかも触れておこうと思います。

どれも同じように見えるPepper ですが実はいくつか種類があります。
といっても、開発環境の違い以外は基本的には契約プランの違いです。
店頭でよく見かけるPepperは、ほとんどが法人向けモデルです。
一般家庭向けモデルと法人向けモデルは、搭載されているアプリやサポート体制に違いがあります。

## Choregraphe版
- 開発者向け先行販売モデル
- 一般家庭向けモデル
- 法人向けモデル（Pepper for Biz）

## Android版
2019年提供開始
現在はこちらが売られています。

- [一般家庭向けモデル（Pepper for Home）](https://www.softbankrobotics.com/jp/product/home/)
- [法人向けモデル（Pepper for Biz）](https://www.softbank.jp/biz/robot/pepper/)



# アーキテクチャ
では、ここから本題です。
## 基本
まず全体的な仕組みですがものすごくシンプルにするとこんな感じです。

**全体図**
まずは全体図（ものすごくざっくり…）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534668/4e248ca0-9312-f28a-52ee-74bac9caa79d.png"/>

PepperにはLinuxディストリビューションの一つであるGentooをベースに独自カスタマイズされたOSが積まれています。
そこに、各種センサーデータやアクチュエータにアクセスするqi Frameworkがあり、開発するアプリから各言語ごとのSDKを介してNAOqiにアクセスしてPepperを制御していきます。

また、Pepperの特徴であるタブレットは別途Androidタブレットとして独立しています。

余談ですが、上記構成のためタブレットと本体それぞれWifiアクセスが必要なので、Pepperは1台で2つのIPアドレスを必要とします。

参考

- http://doc.aldebaran.com/2-5/dev/tools/opennao.html
- [アトリエ秋葉原 Choregraphe編ワークショップ資料 ワークショップ中級(3/3)](https://docs.google.com/presentation/d/15cZ93LfomP-KTFuGhLyW9yaHZ7deeDV4Fkkdz3vcu9A/edit#slide=id.g3f95e92428_0_120)

**ハードウェア制御を少し細かく**
アプリケーションについてはあとで触れるので、ハードウェア制御について少し細かく見てみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534668/29261836-bc9c-1102-3aca-4ed6425078d8.png" alt="qiita 記事素材-Page-2.png"/>


**NAOqi モジュール**
[言語ごとのSDK](http://doc.aldebaran.com/2-5/dev/programming_index.html)からアクセスします。
各種APIを提供しています。
APIドキュメントは[こちら](http://doc.aldebaran.com/2-5/naoqi/index.html)

**ALMemory**
アプリを開発するうえで非常にお世話になるモジュール。
Pepperで扱うセンサーの値やアプリで必要となる値をkey-value形式で保持するグローバルメモリ空間です。
現在ロボットがどういう状態であるか（例：人を見つけた、音が聞こえた等）などもここで管理しています。
値を監視してイベント発火、といったことも可能です。

**DCM(Device Communication Manager)**
Pepper のハードウェア機器を制御、その状態をもとにALMemoryの値を更新、といったことを行っています。
アプリ開発時に意識することは稀です。

参考

- http://doc.aldebaran.com/2-5/naoqi/sensors/dcm.html
- [[Qiita]今さらながら＆うろ覚えながらPepperのアーキテクチャを解説する](https://qiita.com/miyatomo/items/2c3329bb0c2a365bdc11)


## アプリケーション
次に、アプリケーションについてです。
実はChoregraphe版とAndroid版ではアプリを実行する場所が大きく異なります。

### Choregraphe版
まずはChoregraphe版
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534668/a44c7ec0-e9f6-34b9-b996-4ef0e54990dd.png" alt="qiita 記事素材-Page-2.png"/>

開発環境はChoregrapheです。
Choregrapheで開発したアプリはPepper本体（という言い方は正しいのだろうか？）にインストールして実行します。
よく見かけるタブレットを操作するタイプはアプリの中にhtml, js, css 等のファイルを内包しており、別途インストールしてあるnginxを介してブラウザから参照できるようになっています。
そこにタブレットのWebViewからアクセスしてタブレットに表示しています。

ここまで読むと気づかれる方もいらっしゃると思いますが、当然LAN内にある機器のWebブラウザからもこのファイル群にはアクセス可能です。
ですのでこの仕組みを応用すると、例えば手元のブラウザからPepperを操作するリモコン的なものも比較的簡単に作成できます。

### Android版
次にAndroid版

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534668/ec870305-93ba-3966-6480-08a8e3255032.png" alt="qiita 記事素材-Page-2.png"/>

開発環境はAndroid Studioです。
図にするとChoregraphe版と比較してだいぶシンプルになりました。
そうです、開発するアプリをインストールする先がまったく異なっているのです。
Android版ではタブレットにアプリがインストールされ、Android向けSDKを介して各種APIにアクセスして制御する方式になっています。
タブレットのUIは通常のAndroidと同じように実装し、各種トリガーに応じてPepper向けAPIを呼び出します。
アプリがAndroidになったことで、bluetoothやChromecastを用いた外部機器との連携も可能になりました。
（Choregraphe版では中継する機器を介して連携する必要があったりしてけっこう大変です）


# 開発方法
具体的な開発方法ですが、こちらはすでにそれぞれしっかりまとまっている資料があるので、そちらを紹介しておきたいと思います。

- [アトリエ秋葉原 ワークショップ資料](https://pepper-atelier-akihabara.jp/archives/439)

上記資料は、Choregraphe版・Android版それぞれ開発環境の構築からサンプルコードを用いた実装までワークショップ形式でまとめられています。
実際にアプリを開発してみたい方からなんとなく雰囲気を知りたい方まで幅広くおすすめです。

## 2020/01/27 追記
Softbank Robotics 公式でAndroid版Pepperアプリの開発方法を解説した動画もあります。
（最近アトリエ秋葉原の方に教えていただきました。感謝！）

- [QiSDK Online Training](https://www.softbankrobotics.com/jp/developer/qisdk-online-training/)

動画の内容に合わせたサンプルコードもダウンロードできるのでぜひ活用してください。

# Pepper持っていないよ問題
最後にPepperアプリ開発（というかハードウェア扱うアプリ全般）につきまとう、実機が無いよ問題について少し触れて終わりたいと思います。

## 触りたいけど触れない
Pepperは他のコミュニケーションロボットと比較して、1台あたりの費用が結構します（参考：[Pepper for Home 価格](https://www.softbank.jp/robot/pepper/consumer/)）
興味を持ったはいいものの、身近にPepperが無くて実機で試せない、あるいは会社に1台いるけれど複数台連携したり検証したいけどどうしたらいいのか？という事があるわけです。

## Pepperに触れる施設
**Pepper アトリエ秋葉原**
そんな時におすすめしたいのが **[Pepper アトリエ秋葉原](https://pepper-atelier-akihabara.jp/)**。
ここはPepperの開発元でもあるソフトバンクロボティクスが運営している、Pepperを体験できる施設です。
私も大変お世話になっています。
常に数十台のPepperがいてアプリ開発ワークショップやイベントが行われており、空きがあればPepperを1台（もしくは複数台）独占して利用することもできます。

そしてなんと言っても**無料です。**（開催される一部イベントは有料のこともあります）
アトリエ秋葉原利用申し込みは[こちら](https://pepper.doorkeeper.jp/)から

**アトリエサテライト**
アトリエ秋葉原は東京都内ですが、全国にも**[アトリエサテライト](https://www.softbankrobotics.com/jp/developer/atelier/satellite/)**としてPepperを利用できる施設がありますので近くにあるか探してみてください。


# その他参考になりそうな資料

- [ソフトバンクロボティクス開発者向けポータル](https://www.softbankrobotics.com/jp/developer/)
- [Choregraphe版公式リファレンス](http://doc.aldebaran.com/2-5/index_dev_guide.html)
- [Android版公式リファレンス](https://android.aldebaran.com/sdk/doc/pepper-sdk/index.html)