THETA Sの開発用SDKを使ってみる
RICOH THETA(以下、THETA)は、株式会社リコー(以下、Ricoh)から発売されている、一度の撮影で360度の全天球の写真や動画が撮れるユニークなデジカメです。
YouTubeやFacebookも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のサイトからダウンロードします。
環境
- Swift:2.1
- XCode:7.1
- iPhone6 & iOS9.1
- THETA S & firmware 01.11 & API v2
セッション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度の星空撮影など、今までにない新しい体験ができます。
ぜひ試してみてください。