Smart Communication Design Company
ホーム > ナレッジ > Blog > Apps Blog > 2015年10月 > THETA Sの開発用SDKを使ってみる

THETA Sの開発用SDKを使ってみる


インタラクションアーキテクト 大室

RICOH THETA(以下、THETA)は、株式会社リコー(以下、Ricoh)から発売されている、一度の撮影で360度の全天球の写真や動画が撮れるユニークなデジカメです。
YouTubeFacebookも360度動画の対応を始めたりと、何かと話題になっています。

以下はTHETAの公式サイトにあるものですが、こういったものが作れます。

Milky Way from an Norikura Observatory in Mt. Marishiten-dake, Japan - Spherical Image - RICOH THETA

機能やコンセプトも面白いのですが、開発用SDKも公開されているので、今回は10月23日に発売されたTHETA Sを使って、そのSDKを試してみました。
SDKは、iOS用とAndroid用があります。私は、iOS用で試しました。

以前から発売されている、RICOH THETAとRICOH THETA m15は、API v1でしたが、THETA SからはAPI v2になっています。
API v2は、Google社のOpen Spherical Camera API Version 1.0に準拠し、v1とは使い方が大きく変わっていました。
なお、SDK本体は、THETA DEVELOPERSのサイトからダウンロードします。

環境

セッションIDを取得する

iPhoneとTHETA S間の通信には無線LANからHTTP接続し、GET/POSTリクエストでAPIを叩いていくイメージとなります。戻り値はJSONです。
リクエスト先は、IPアドレスとポートは以下になります。
192.168.1.1:80

iOS用のSDKはObjective-Cで書かれているため、詳細は割愛しますがBridgingHeaderさせる必要があります。
まず、セッションIDを取得してみます。

リクエスト

func getSessionId() {
    // URLリクエスト
    let urlStr = "http://192.168.1.1/osc/commands/execute"
    let request = NSMutableURLRequest(URL: NSURL(string: urlStr)!)
    // POST通信
    request.HTTPMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    // パラメータ
    let params: [String: AnyObject] = [
        "name":"camera.startSession",
        "parameters": ""
    ]
    do {
        request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.init(rawValue: 2))
    } catch {
        print("NSJSONSerialization Error")
        return
    }
    // APIを叩く
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error in
        if (error == nil) {
            let result = NSString(data: data!, encoding: NSUTF8StringEncoding)!
            print(result)
        } else {
            print(error)
        }
    })
    task.resume()
}

レスポンス

{
    "name":"camera.startSession",
    "state":"done",
    "results":{ 
        "sessionId":"SID_0008",
        "timeout":180
    }
}

撮影をするAPIや写真をiPhoneに取り込むAPIを使うときは、ここで取得したセッションIDをパラメータに含んでそれぞれのAPIを叩いていきます。

静止画撮影用API

つぎに、上記で取得したセッションIDを使って静止画撮影をしてみます。

リクエスト

func takePicture( sessionId:String ) {
    let urlString = "http://192.168.1.1/osc/commands/execute"
    let request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    request.HTTPMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")  
    let params: [String: AnyObject] = [
        "name":"camera.takePicture",
        "parameters": ["sessionId": sessionId]
    ]    
    do {
        request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.init(rawValue: 2))
    } catch {
        print("NSJSONSerialization Error")
        return
    }
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error in
        if (error == nil) {
            let result = NSString(data: data!, encoding: NSUTF8StringEncoding)!
            print(result)
        } else {
            print(error)
        }
    })
    task.resume()
}

レスポンス

{
    "name":"camera.takePicture",
    "state":"inProgress",
    "id":"1",
    "progress":{
        "completion":0.0
    }
}

これで撮影成功です。
撮影した画像はTHETA本体に記録されています。

使ってみた印象

この他にも、撮影した画像をiPhoneに転送するAPIやTHETA本体の設定情報のAPIなど、一通りのAPIは揃っており、特別クセもなくすんなり使える印象でした。

あとはアイディア次第で色々な展開できると思います。
例えば、星空をTHETAでインターバル撮影し、iOSの機能で比較明合成(コンポジット)をした360度の星空撮影など、今までにない新しい体験ができます。

ぜひ試してみてください。