うわー!遅なった遅なった!
この記事は IoTLT Advent Calendar 2018 の 17 日目の記事です。
みやとも と言います!
昔はPepperに携わってましたが、離れて久しいので色々うろ覚えです!
普段はフルスタックエンジニアやったり(というか何でもやる)、RPAやったりしていますが、今日はIoTネタでアドベントカレンダー書きます。
実はPepperのアーキテクチャは結構好きだったので、何かの助けになればと書こうかと思います。
(若干話がソフトウェアよりですが、ご容赦ください..w)
はじめに
最近全くIoT関連触ってないのでかなりやっつけになりますが、後々ちゃんと触って検証する予定なので、アップデートを乞うご期待ください。。w
今回は仕事してきた中でPepperの中身を見まくっていた時期があり、その内容をシェアしようかと思います.
内容的には古いですが、そもそもPepperのつくりが定石的だけど斬新なので、よければ楽しんでください.
Pepperってなんぞや?
Softbank Robotics開発(元はフランスのAldebaran Robotics)のコミュニケーションロボット.
呼吸してるっぽく見せるAutonomous Life機能など表現力を高めようとして不気味の谷を若干超えてる気がするロボットです.
Pepperのアーキテクチャ(OS周り)
もはや需要の有無を気にしなくなってきました!
まずはOS周りから解説しますが、基本的な構造は数のようになっています.
NAOqiOS
PepperはNAOqiというLinuxのGentooディストリビューションをフォークした独自のROSを積んでいます.
NAOqiはアプリケーションとのインターフェース(API)にもなっているので、アプリケーションから受けた命令をDCMに渡してHWを動かしています.
NAOqiのAPIはとても分かりやすいので、一度 APIリファレンス(en) を見ても楽しいです.
DCM
NAOqiと各ハードウェアモジュールをつなぐ制御プログラムです.
NAOqiから受けた命令を元にHWを動かしたり、動かした結果(座標とか)をALMemoryというPepperの持つグローバルメモリに格納します.
DCMはハードウェアへの命令を1~10msの間隔で送信し続けるので、連続した動きを表現できています.
ALMemory
Pepperが持つグローバルなKeyValue形式のメモリ空間です.
多くのアプリケーションのデータやハードウェアの稼動情報はここに格納されています.
また、Eventの発火もできるのでアプリケーションからALMemoryへの値更新をトリガーに別のアクションを起こすみたいな使い方もできます.
Pepperのアーキテクチャ(API周り)
記憶が、、、限界にちかい。。。
Pepperのアプリケーションは基本的にNAOqiが持っているAL~という名前のAPIをたたくことで色々な機能が呼び出せます.
このAPIによって色々な表現になるわけですが、API設計はとても合理的で綺麗ですので、とても勉強させてもらっていました.
ただ、この辺は普通のアプリケーションと構造は一緒ですね.
Pepperのアプリ開発には Choregraphe を使用しますが、ここのボックスもAPIのラッパーになっている感じです。
Pepperのアーキテクチャ(タブレット周り)
タブレットとの通信について
Pepperの頭には nginx というWebサーバが搭載されています.
加えて、PepperはqiMessaging.jsというライブラリを保有していて、こいつがWebサーバを介してタブレットとのやり取りをしたり、タブレットからWebサーバを経由してNAOqiのAPIをたたいたりできます。
この辺りは、PepperをJavaScriptで動かそう! の記事が詳しく解説してくださっています。
qiMessaging.jsさえあれば手持ちのタブレットやスマホからもPepperが操作できるのは、nginx経由で命令が送れるからなんですね.
タブレットの描画について
PepperのタブレットはAndroid何がしのWebView + Angular.jsを使用しています.
qiMessaging.jsで送信されたデータはAngularで解釈され、ディスプレイに表示される具合です.
凄いゴリゴリですね.
まとめ
とりとめも無くPepperのアーキテクチャを書いてしまいましたが、意外と中身のアーキテクチャやソースコードを見ればNAOqi APIの綺麗な設計だったり、qiMessagingの斬新なつくりだったり、色々勉強になることが多かったのが実感です.
(タブレットがWebViewベースなのに驚愕はしましたがw)
ぜひ色んなプロダクトの中身を見てコードリーディングしてみましょー!