我が家にaiboがやってきました。 コロナ禍で家にいることが非常に多く、人と会うことも少ないため、我が家ではコミュニケーション不足の解消に役立ってます。
普通にaiboと触れ合うだけでも満足はしているのですが、aiboにはデベロッパープログラムがあり、APIを使ったプログラミングができます。 せっかくなので、調べてみました。
aiboのプログラミングには、大きくわけてビジュアルプログラミングと、aibo Web APIを使ったプログラミングがあります。
ビジュアルプログラミング
aiboビジュアルプログラミングは、ビジュアルプログラミング言語の『Scratch(スクラッチ)』と似ており、ビジュアルブロックを組み合わせてプログラミングを行ないます。
ブロックには、次の種類があります。
- イベント
- 制御
- 演算
- ブロック定義
- 動き
- ふるまい
- 音
- aiboのイベント
- 調べる
変数や制御構文(ifやforなど)といった、プログラミングの基本をビジュアル的に扱えるため、万人にオススメできるプログラミングスタイルです。
aibo Web API プログラミング
aibo Web API プログラミングは、「 https://public.api.aibo.com 」に用意された、Web APIを使うプログラミングスタイルです。
予め用意されたSDKを使うわけではなく、Web APIでaiboに指示を出すのが、プログラミングの基本となります。 そのため、Web APIさえコールできればよく、利用するプログラミング言語に制限はありません。
アクセストークンの取得
aibo Web APIでは、アクセストークンを使ってユーザー認証を行ないます。 アクセストークンはaiboデベロッパーサイト上で発行し、英数記号の文字列です。
- https://developer.aibo.com/jp/token で発行する。
- アクセストークンの有効期限は、「24時間」「30日」「90日」の3種類です。
- 利用するには、My aibo に登録済みの aibo と My Sony ID が必要です。
発行したアクセストークンは、APIコール時『Authorization:Bearer』ヘッダーに付与して使います。
deviceIdを取得して、aiboを特定する
ひとりのユーザーが複数のaiboを持つことができるため、アクセストークンだけでは、APIでaiboを特定することができません。
アクセストークンの発行を終えたら、次にdeviceIdと呼ばれる、aibo固有のIDを取得します。 これにはWeb APIが用意されており、/v1/devicesを使います。
$ curl -X GET \ https://public.api.aibo.com/v1/devices \ -H "Authorization:Bearer ${your accessToken}"
さっそくaiboデベロッパードキュメントに掲載されている、curlコマンドを実行してみました。すると、次のJSONが返却されます。
{"devices":[{"deviceId":"[英数記号のデバイス文字列]","nickname":"[aiboの名前]"}]}
普通にmacOSのターミナルから実行しましたが、ターミナルのエンコード設定がUnicode(UTF-8)で文字化けが起きなかったので、nicknameはUnicodeです。
見ての通り、ここではAuthorizationヘッダーにアクセストークンを付与して、HTTPSアクセスをしているだけです。 そのため、認証ヘッダーを設定可能なHTTPSクライアントであれば良く、基本的にプログラム上からWeb APIをコールします。
なお公式サイトには、Pythonを使ったサンプルが載ってました。
Web APIを使って、何ができるのか?
APIは、大きくわけて3種類です。
- Settings API:設定系のAPIです。
- Action API:動作系のAPIです。
- Cognition API:認識系の API です。aibo が見ているものや、反応しているものの情報を取得します。
Settings API
GetDevices(/v1/devices)
所有している aibo の一覧を取得します。
GetExecution(/v1/executions/${executionId})
API の実行結果を取得します。 それぞれのWeb APIには、実際にaiboへ動作が反映されるまで遅延があるため、リクエスト時に発行されたexecutionIdを使って最終的な実行結果を取得します。
SetMode(/v1/devices/${deviceId}/capabilities/set_mode/execute)
aiboが指示待ち中になるかどうかを指定します。 指示待ち中とはaiboを静止させることで、よりプログラムの実行結果をわかりやすくするためのコマンドです。
Action API
ApproachObject(/v1/devices/${deviceId}/capabilities/approach_object/execute)
aibo が指定されたものに近づきます。
- aibo:旧型の AIBO(ERS-110 や ERS-7 など)と新型の aibo(ERS-1000)
- aibone:aibo 専用アクセサリーのアイボーン
- dice:aibo 専用アクセサリーのサイコロ
- pinkball:aibo 専用アクセサリーのピンクボール
ApproachPerson(/v1/devices/${deviceId}/capabilities/approach_person/execute)
aibo が人に指定された距離まで近づきます。 実行するとaibo は人を探し、人を見つけるとaiboが人に向かって近づきます
ChangePosture(/v1/devices/${deviceId}/capabilities/change_posture/execute)
aibo が指定された姿勢をとります。すでにその姿勢のときは、何もせずに終了します。
- back:おなかを見せる
- crouch:しゃがむ
- down:伏せる
- down_and_lengthen_behind:寝転がる
- down_and_shorten_behind:足を曲げて寝転がる
- sit_and_raise_both_hands:両方の前足をあげる
- sit:すわる
- sleep:寝る姿勢になる
- stand:立つ
- stand_straight:まっすぐ立つ
ChaseObject(/v1/devices/${deviceId}/capabilities/chase_object/execute)
aibo が指定されたものを見続けます。
- aibo:旧型の AIBO(ERS-110 や ERS-7 など)と新型の aibo(ERS-1000)
- aibone:aibo 専用アクセサリーのアイボーン
- dice:aibo 専用アクセサリーのサイコロ
- pinkball:aibo 専用アクセサリーのピンクボール
ChasePerson(/v1/devices/${deviceId}/capabilities/chase_person/execute)
aibo が人を見続けます。
FindObject(/v1/devices/${deviceId}/capabilities/find_object/execute)
aibo が指定されたものを探します。
- aibo:旧型の AIBO(ERS-110 や ERS-7 など)と新型の aibo(ERS-1000)
- aibone:aibo 専用アクセサリーのアイボーン
- dice:aibo 専用アクセサリーのサイコロ
- pinkball:aibo 専用アクセサリーのピンクボール
FindPerson(/v1/devices/${deviceId}/capabilities/find_person/execute)
aibo が人を探します。
GetCloseToObject(/v1/devices/${deviceId}/capabilities/get_close_to_object/execute)
aibo が近くにある指定されたものに対して、かなりそばまで近づきます。ApproachObject で近づいたあとに使用してください。
- aibone:aibo専用アクセサリーのアイボーン
- dice:aibo 専用アクセサリーのサイコロ
- pinkball:aibo 専用アクセサリーのピンクボール
KickObject(/v1/devices/${deviceId}/capabilities/kick_object/execute)
aibo が指定されたものを蹴ったりヘディングしたりします。
- pinkball:aibo 専用アクセサリーのピンクボール
MoveAlongCircle(/v1/devices/${deviceId}/capabilities/move_along_circle/execute)
aibo が円弧を描きながら歩きます。
MoveDirection(/v1/devices/${deviceId}/capabilities/move_direction/execute)
aibo が指定された方向へ指定された距離を歩きます。
MoveForward(/v1/devices/${deviceId}/capabilities/move_forward/execute)
aibo が指定された距離を前後に歩きます。
MoveHead(/v1/devices/${deviceId}/capabilities/move_head/execute)
aibo が指定された向きへ、指定された速さで首と顔を動かします。
MoveSideways(/v1/devices/${deviceId}/capabilities/move_sideways/execute)
aibo が指定された距離を左右に横歩きします。
PlayBonea(/v1/devices/${deviceId}/capabilities/play_bone/execute)
aibo が専用アクセサリーのアイボーンを使って遊びます。
PlayMotion(/v1/devices/${deviceId}/capabilities/play_motion/execute)
aibo が指定されたふるまいを行います。 指定可能な動作はたくさんあり、aiboプログラミングの中核となるAPIです。
- うなずく
- いやがる
- 全身で大きくほえる
- げっぷをする
- へっぴり腰になる
- はあはあと微かに呼吸する
- 興味のあるそぶりをする
- ダンスをする
- あごをひく
- 夢をみる
- うれしそうにする
- 遊ぼう、の仕草をする
- 口をパクパクする
- 寝ぼけた仕草をする
- 両前足をあげる
- 興奮した仕草をする
- ヘディングする
- 左にヘディングする
- 右にヘディングする
- うれしそうにする
- ハイタッチする
- 左前足でハイタッチする
- 右前足でハイタッチする
- 遊びたそうにする
- ブルッと震える
- キスする
- 左前足を毛づくろいする
- 右前足を毛づくろいする
- 左右をすこし見る
- のぞき込む
- おしっこをする(男の子)
- おしっこをする(女の子)
- 大きく2回うなずく
- 口を少し開け閉めする
- とっても喜ぶ
- 左前足でお手をする
- 右前足でお手をする
- すねて左を向く
- すねて右を向く
- はっとする
- 甘噛みする
- 上目遣いする
- 待ちきれなそうにする
- 仰向けになる
- そわそわする
- 背中を地面に擦り付ける
- 地面を掘る
- 左後足で頭をかく
- 右後足で頭をかく
- かなしそうにする
- お尻を振る
- 細かく震える
- 左前足で横に蹴る
- 右前足で横に蹴る
- おなかを見せて左に転がる
- おなかを見せて右に転がる
- 歌う
- ねごとを言う
- くしゃみをする
- 目の前を嗅ぐ
- 下の方を左右に嗅ぐ
- 上の方を嗅ぐ
- 驚く
- 少し驚く
- のびをする
- 左右に体を揺らす
- 口を開けて耳を開く
- 退屈そうにする
- 顔を洗う仕草をする
- 悲しくうつむいてキュンキュン鳴く
- 耳をぴくっと動かす
- 前傾してうなる、警戒する
- 高くキャンキャンッ!と鳴く
- おおきくあくびをする
PlayDice(/v1/devices/${deviceId}/capabilities/play_dice/execute)
aibo が専用アクセサリーのサイコロを使い、指定された遊びを行います。
- holdMouthDice:サイコロをくわえます。
- rollDiceLeft:サイコロを左に転がします。
- rollDiceRight:サイコロを右に転がします。
- rollDicePush:サイコロを向こう側に転がします。
- rollDicePull:サイコロを手前側に転がします。
- stackDice:サイコロを別のサイコロの上に積み重ねます。
ReleaseObject(/v1/devices/${deviceId}/capabilities/release_object/execute)
aibo がくわえているものを離します。
Stay(v1/devices/${deviceId}/capabilities/stay/execute)
aibo が指定された時間、待機します。
TurnAround(/v1/devices/${deviceId}/capabilities/turn_around/execute)
aibo が指定された角度だけその場で回ります。
Cognition API
BitingStatus(v1/devices/${deviceId}/capabilities/biting_status/execute)
aibo がものをくわえているかどうかを取得します。
BodyTouchedStatus(/v1/devices/${deviceId}/capabilities/body_touched_status/execute)
aibo が体のどの部分を触られているのかを取得します。
FoundObjectsStatus(/v1/devices/${deviceId}/capabilities/found_objects_status/execute)
aibo が認識している人やものについて取得します。
HungryStatus(/v1/devices/${deviceId}/capabilities/hungry_status/execute)
aibo のバッテリー残量を取得します。
NameCalledStatus(/v1/devices/${deviceId}/capabilities/name_called_status/execute)
aibo が自分の名前を呼ばれたかどうかを取得します。名前を呼ばれていた場合、呼ばれた方向も合わせて取得します。
PawPadsStatus(/v1/devices/${deviceId}/capabilities/paw_pads_status/execute)
aibo の肉球が押されているかどうかを取得します。
PostureStatus(/v1/devices/${deviceId}/capabilities/posture_status/execute)
aibo がとっている姿勢を取得します。
SleepyStatus(/v1/devices/${deviceId}/capabilities/sleepy_status/execute)
aibo の眠さを取得します。
VoiceCommandStatus(/v1/devices/${deviceId}/capabilities/voice_command_status/execute)
aibo が反応した言葉を取得します。 言葉には次の種類があります。
- away:あっちいって
- awaysoft:どいて
- bequiet:しずかにして
- bowing:おじぎして
- bringthebone:ほねとってきて
- bye:ばいばい
- come:おいで
- dance:おどって
- down:おすわり
- followme:ついてきて
- goodevening:こんばんは
- goodmorning:おはよう
- goodnight:おやすみ
- gtsy:はじめまして
- hand:おて
- handsup:てあげて
- hello:こんにちは
- highfive:はいたっち
- imhome:ただいま
- kicktheball:ぼーるけって
- lielow:ふせ
- marking:まーきんぐ
- movebackward:ばっく
- openyourmouth:くちあけて
- out:はなして
- pinkball:ぴんくぼーる
- play:あそぼう
- playwithball:ぼーるであそんで
- run:はしって
- shakefullbody:ぶるぶるして
- showyourface:こっちむいて
- sing:うたって
- standup:おきて
- stay:まて
- theotherhand:おかわり
- turn:まわって
- walk:あるいて
まとめ
APIドキュメントをひととおり確認した結果、Web APIでできることは大体わかりました。
次回以降は、実際の活用事例の調査や、Web APIの組み合わせによる応用を考えていきたいと思います。