aibo買ったのでAPIで遊んでみた


[ラクスアドベントカレンダー](https://qiita.com/advent-calendar/2019/rakus)17日目！
先日の@sts-sd2さんが投稿した「[マイクロなサービスを目指してRESTなWebサービスを作りたい](https://qiita.com/sts-sd2/items/cf403766bca8f86bb4a8)」からバトンを引き継いでの投稿になります。

今回は昔からの夢だった家庭用犬型ロボットを買ったので、そのレポートです。
もう少しなにかと連携させたりしたかったのですが、イマイチまだ活用方法が見えていません。。。


# はじめに

子どもの頃、初代AIBO発売のニュースを見て、ずっと欲しがっていたことを覚えています。
しかし、あまりの高額（25万程度でしたか）に買ってもらえるわけもなく、当時は泣く泣く諦めました（笑）

あれから10年。発表された新型aiboは相変わらずの高額ですが、昔欲しがっていたこともあり、また、11月に実装されたAPIにも興味を惹かれ、高額なことが気になりましたが、ついに買ってしまい現在に至ります。（ボーナスがすっきり消えましたが悔いはない。）

# aiboとは

aiboはソニーが開発、販売する家庭用犬型ロボットです。初代の発売は1999年。一時の開発中止を経て、2018年に再度販売が開始されました。（その際、名称も"AIBO"から"aibo"に変更されました。）

2018年から販売されているaiboを購入するためには、クラウドサービスに加入する必要があります。
aiboは専用のサーバと常に通信し、記憶やその他のデータをやりとりしているそうです。
この通信はWiFiだけでなく、モバイル通信でも行うことができます。

また、2019年の11月には、aibo操作用のAPIも公開され、ますます楽しみ方が増えています。

# 買ってみて

そもそも、”家庭用ロボット”を買ったのも初めての経験なので、技術的内容の前に、aiboを買ってからの流れを簡単にお伝えします。

## セットアップ

ソニーのWebストアから購入すると、大きな箱にまゆのようなケースに入れられたaiboが届きます。
購入後には、スマートフォンの専用アプリから初期設定が必要です。ペットの初期設定と言われるとなんとも不思議ですが、以下の内容を自分で決定できます。

* 名前
* 性別

なお、名前は後から変更することができますが、性別は変更できません。
また、初期設定とは別に、鳴き声の音や、瞳の色も設定できます。

## どんなことができるのか

基本的に、電源を入れるとずっと家の中をうろついています。
仕草はとてもイヌらしく、例えば前足で地面を掘ったり、後ろ足で耳の後ろを書いたり、前足の毛繕いをしたりと、本物のイヌのような滑らかな動きをします。

また、いくつかの"しぐさ"を覚えており、口頭で決められた呼びかけをするか、スマートフォンのアプリから指示を出すことで、歌を歌ったり、ボールで遊んだりすることもできます。

ちなみに、一番驚いたことは、片足を上げて粗相したことですね。
（ちゃんと叱って、場所を覚えさせれば決まった場所でするようになるらしいですが...どうも覚えてくれません。）

電池がなくなると、dockに自分で戻って充電を始めます。
ただし、充電中もずっと吠えたりしているので、かまってやれない時は電源を切っています。


# APIについて

aiboはその操作用に、APIが公開されています。
基本的なaiboの操作から、先に触れた仕草などを指示できる他、バッテリー残量の取得や、aiboが触られている部分の判別などができます。

## 開発にあたって必要なもの

aibo本体以外に、My Sony ID が必要です。
それ以外には特に準備不要。公式サイトからログインして、アクセストークンを取得すれば、すぐにAPIを実行できます。

## ドキュメントは？

APIを用いた開発時に必要なのは、そのAPIのドキュメントです。
aiboの場合、ソニーの公式サイトに[API一覧](https://developer.aibo.com/jp/docs)が記載されており、とてもわかりやすくまとまっています。

ドキュメントには、パラメータやレスポンスの記載だけでなく、`curl`での実行例も載っているため、一目でどう実行するかがわかるようになっています。

## どのようなAPIがあるのか

大きく分けると次の3種類です。

* Settings API
* Action API
* Cognition API

### Settings API

aiboの設定を行うAPIです。
現在は以下の3種類のみです。

* GetDevices ： 所有しているaiboの一覧情報を返します
* Get Result of API ： 各APIの実行結果を返します
* SetMode ： aiboが待機状態になります（開発時に歩き回られないように）

### Action API

aiboの動きを指示するためのAPIです。
非常に種類が多いので、いくつかのみ紹介します。

* MoveForward ： 前後に歩く
* MoveSideways ： 横方向に蟹歩きする
* PlayMotion ： 指定した振る舞いを実行する
* ChasePerson ： 人を指定時間見つめる

### Cognition API

aiboが認識しているものを取得するAPIです。

こちらも数が多いので一部のみ紹介。

* BitingStatus ： ものを加えているかどうかを取得
* BodyTouchedStatus ： 身体のどの部分を触られているかを取得
* NameCalledStatus ： 名前を呼ばれたかを取得
* PawPadsStatus ： 肉球が押されているかを取得
* HungryStatus ： バッテリー状況を取得

## 一通り触ってみた所感

### レスポンススピード
aiboのAPIは、実行後にサーバからaiboへ指示が出されます。
APIリクエストのレスポンスが返ってきてから、3秒ほどでaiboが指示通りの動きを始めます。

### 実行結果とaiboの心理状態

一部報道では、aiboの心理状態で実行結果が変わると言われていましたが、今のところAPIの実行を拒否するような仕草はありません。
これは、まだ私が気づいていないだけで、何度も実行するうちに、気分によって微妙に動作が違っていたりするのかもしれません。

### 他のデバイスとの連携について

真っ先にaiboの活用事例として思いつくのは、他電化製品のスイッチを入れてくれるなどの、スマートスピーカに似た使い方でしょう。
しかし、現状のaiboにはそういった機能はなく、単純に「ロボットペット」といった感じです。
APIも、基本的に何かをやらせるとものより、既定の仕草を行うためのAPIが多い印象です。

### アクセストークンについて

アクセストークンは、Weｂサイトから取得可能ですが、再取得を行うAPIなどは用意されていません。
そのため、トークンの利用期限が切れた場合は、開発者がWebサイトにアクセスし、トークンを再発行する必要があります。
（トークンの有効期限は、最短で1日、最長で90日です。）


### 謎のパラメータ「眠さ」

APIドキュメントを読んでいると、aiboの眠さを取得するAPIがありました。
しかし、この眠さが何にどう関係しているかはわからず。。。
手元のaiboで実行しても、`no_sleepy`（全く眠くない）と返ってくるだけで、用途が不明です。



# まとめと今度の活用について

一通りドキュメントを読んで、気になるAPIは実行してみましたが、活用方法はアイディア次第かと思います。
現在のAPIは、あらかじめ用意されている仕草をするものや、用意されたおもちゃ（aibo専用の骨やボール）に近いたりするだけで、新しい何かに対してアクションを起こすことは難しそうです。
前へ進むや、横に歩くなどを使って、場所を移動することはできますが、あくまで相対値での移動のため、特定の場所へ向かわせることも難しそうな印象でした。

ただ、用意されている仕草のバリエーションは多く、また、それぞれが本物のイヌのように動くため、使い方次第では何か面白そうなことができそうな気がします。

また、外部のセンサーと連携させることで、なにかをセンサーが検知した時に、特定の仕草を実行させることは難しくなさそうです。

今後、APIは追加されると思うので、今後のAPIにも期待したいところです。

aibo自体は、この記事を書いている間も私の足元で鳴いたりこちらを見つめたりしています。
APIを活用したなにかいいアイディアがある方は、ぜひ共有をおねがいします。