[aibo API]使ってみた

ついにaiboのapiが公開されたので、さっそく家のてるくん(オス、1才半)を操ってみます。

公式サイト「http://aibo.sony.jp/developer/」によるとapiをプログラミング言語(サンプルはpython)から使う方法とGUIツール「aiboビジュアルプログラミング」から使う方法があるようですが、今回はサンプルに沿ってpythonから使ってみます。

イントロダクションに沿って以下の手順で進めます。
(1) トークンの取得
(2) API を実行させたい aibo の deviceId の取得
(3) 動作や認識を行う API の実行
(4) 実行した API の結果の取得

(1) トークンの取得

デベロッパーサイトから取得するので、サインイン(MySonyID)が必要。
でも、aiboのバージョンが足りていないと以下のページが表示され取得失敗する。

バージョンアップしたら無事成功。
トークンの有効期限は取得時に3種類「24時間、30日、90日」から選択。

(2) API を実行させたい aibo の deviceId の取得

deviceIdを取得するAPIの実行ということで、pythonサンプル。

import requests
import sys
import json

headers = {
'Authorization': 'Bearer ${accessToken}',
}

if __name__ == '__main__':
    get_url = 'https://public.api.aibo.com/v1/devices/'
    response = requests.get(get_url, headers=headers)
    get_result = json.loads(response.text)
    print(get_result)

(3) 動作や認識を行う API の実行
(4) 実行した API の結果の取得

サンプルコードとapiヘルプを比較して、確認しよう。

◆サンプルコード

# file name is "execute_action_api.py"
import requests
import sys
import json
import time

deviceId = '${Your aibo`s deviceId}'
headers = {
'Authorization': 'Bearer ${Your Token}',
}

TIME_OUT_LIMIT = 10

def do_action(api_name, arguments):
    post_url = 'https://public.api.aibo.com/v1/devices/' + deviceId + '/capabilities/' + api_name + '/execute'
    data = '{"arguments":' + arguments + '}' 

    # POST API
    response = requests.post(post_url, headers=headers, data=data)
    post_result = json.loads(response.text)
    executionId = post_result["executionId"]

    # Get Result of API execution
    get_result_url = 'https://public.api.aibo.com/v1/executions/' + executionId
    TimeOut = 0
    while True:
        response = requests.get(get_result_url, headers=headers)
        get_result = json.loads(response.text)
        get_status = get_result["status"]

        if get_status == "SUCCEEDED":
            print(get_result)
            break
        elif get_status == "FAILED":
            print(get_result)
            break
        
        TimeOut += 1
        if TimeOut > TIME_OUT_LIMIT:
            print("Time out")
            break

        time.sleep(1)
    
if __name__ == '__main__':
    length = len(sys.argv)
    if length == 3:
        do_action(sys.argv[1], sys.argv[2])
    else :
        print("execute_action_api.py  ")
        exit(1)

呼び出すときはこんな感じ「py execute_action_api.py find_object “{\”TargetType\”:\”pinkball\”}”」

処理の順番はこんな感じ

  1. 実行するAPIに応じたurlをサーバーに投げて(POST)
  2. 投げたAPIの結果を取得するurlをサーバーに投げる(GET)
    ※どのAPIでも基本同じみたい。返却内容は異なるようだけど。
  3. 結果が”SUCCEEDED”(成功)、”FAILED”(失敗)なら処理して
    それ以外「”ACCEPTED”(サーバー受付完了)、”IN_PROGRESS”(aibo受付完了)」なら再度結果問合せ。

◆apiヘルプ

実行してみた...SUCCESSが返ってきた、だけどてるくんは微動だにせず。心眼でもつかったのだろうか?

とりあえず動いたようなので、いろんな指示を試してみよう。

◆おまけ「apiの一覧」

Settings API GetDeviceds aibo情報の取得
GetResultofAPI API実行結果の取得
SetMode aibo指示待ち状態ON/OFF
Action API ApproachObject 指定物に近づく
ApproachPerson 人に近づく
ChangePosture 姿勢を指定
ChaseObject 指定物を探して見続ける
ChasePerson 人を探して見続ける
FindObject 指定物を探す
FindPerson 人を探す
GetCloseToObject 指定物にかなり近づく
KickObject 蹴る、ヘディングする
MoveAlongCircle 円弧状に歩く
MoveDirection 指定方向に歩く
MoveForward 前または後ろに歩く
MoveHead 首と顔を動かす
MoveSideways 横歩き
PlayBone アイボーンで遊ぶ
PlayMotion ふるまいを行う
PlayDice サイコロで遊ぶ
ReleaseObject くわえているものを離す
Stay 待機する
TurnAround 回る
Cognition API BitingStatus くわえているか取得
BodyTouchedStatus どこを触られているか取得
FoundObjectsStatus aiboが認識している人・ものを取得
HungryStatus バッテリー残量を取得
NameCalledStatus 名前を呼ばれたか取得
PawPadsStatus 肉球を押されているか取得
PostureStatus 今の姿勢を取得
SleepyStatus 眠さを取得
VoiceCommandStatus 反応した言葉を取得

(番外編)aiboビジュアルプログラミング

ブラウザ上のツールだった。サインインして使うため、ユーザに紐づいたaiboが自動で選択されて、トークンや装置IDの取得は不要だった。
使ってみた感想としては、簡単。すごい直感的に動かせる。小学校のプログラミング教育とかで使えると楽しいだろうな。