のしメモ アプリ開発ブログ

Unityアプリとかロボットとか作ってるときに困ったこととかメモ

Gear360をUnityで動かしてみた

Gear360という360度のかわいいカメラがあります。
しかし、公式アプリではGalaxy系の端末しかサポートしていないみたいです(2016年7月現在)。
でも、iPhoneでも使いたいので、Unityで開発する方法をメモ
※ GoogleStreatViewアプリを使用すればコードを書かなくてもiPhoneから撮影することは可能です。

2017/02/21追記

UnityでOSC APIを取り扱うシンプルなリポジトリを公開しました。
これを使えばGear360でもTHETA Sでも簡単に撮影してテクスチャを取得することが可能です。

OSC APIとは何か

Open Spherical Camera APIというAPIです。
Googleが出している、「Wifiを搭載した360度カメラの基準API」みたいな感じで、
Gear360も、THETA SもこのAPIに対応しているので、THETA S用に作ったコードがGear360で動いたり動かなかったりする感じです。

Gear360のAPIを実行する

Gear360でOSC APIが本当に実行できるか調査してみましょう。

Wifi接続方法

1. Gear360のMenuボタン長押し後、GoogleStreatViewを選択してOKを押す
2. 表示されたSSIDに繋ぎ、表示されているパスワードを打ち込む
3. 接続される

とりあえずAPI叩いてみる

infoを叩いてみましょう
/osc/info
infoのAPIリファレンスはこちら
https://developers.google.com/streetview/open-spherical-camera/guides/osc/info?hl=ja

ここで注意することは、360カメラによってプライベートIPアドレスが異なることです。
調べて載っていたものだけ掲載しておきます(2017年7月現在)。

camera IP OSC API Level
THETA S 192.168.1.1 1
ファームウェアv01.62以降は、2
Gear 360 192.168.107.1 1
Bublcam 192.168.0.100 1

Gear360と接続している状態で、WWWを使ってJsonをとってくるとこんな感じのデータを取ってこれます。

{
    "manufacturer": "Samsung Electronics",
    "model": "GEAR 360",
    "serialNumber": "XXXXXXXXXXXX",
    "firmwareVersion": "XXXXXXXXXXX",
    "supportUrl": "www.samsung.com",
    "endpoints": { "httpPort": 80, "httpUpdatePort": 80 },
    "gps": false,
    "gyro": false,
    "uptime": 50,
    "api": [
            "\/osc\/info",
            "\/osc\/state",
            "\/osc\/checkForUpdates",
            "\/osc\/commands\/execute",
            "\/osc\/commands\/status" 
    ] }

ちなみにコードはこんな感じ

APIを使えるか試すプログラム

using UnityEngine;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using LitJson;

public class OSCController : MonoBehaviour {

	private const string c_HttpHead = "http://";
	private const string c_HttpPort = "80";
	[SerializeField]
	private string m_IPAddress = "192.168.107.1"; // Gear360:192.168.107.1 / Bublcam:192.168.0.100 / RICOH THETA:192.168.1.1

	void Start(){
		// infoデータをダウンロードしてみる
		StartCoroutine (ExecGetInfo ());
	}

	private IEnumerator ExecGetInfo(){
		// URLを作成
		string url = MakeAPIURL("/osc/info");

		// 送信開始
		WWW www = new WWW (url);
		yield return www;

		// 結果出力
		if (www.error == null) {
			Debug.Log (www.text);
		} else {
			Debug.Log (www.error);
		}
	}

	private string MakeAPIURL(string command){
		return string.Format ("{0}{1}:{2}{3}", c_HttpHead, m_IPAddress, c_HttpPort, command);
	}
}

APIを叩けることがわかったので、撮影をしてみます。

撮影するプログラムを作ってみる

Gear360はAPI Level 1なので、THETA Sの過去記事の実装で動かせそうと思ったら、THETA Sにしか載っていないパラメータ(_latestFileUri)を使っていましたね…
noshipu.hateblo.jp

ということでロジック的には、以下の感じで実装します。
1. セッション開始
2. キャプチャ実行 & Commad IDの保存
3. Command IDからStatusのチェックを続けて、ステータスが完了するまで連投する
4. ステータス完了を確認したら、fileUriを受け取る
5. fileUriからgetImageのAPIを実行して画像バイナリを取得
6. バイナリからTexture2Dを生成して、Materialに貼り付ける

youtu.be
動いた!これでiPhoneでもAndroidでもPCでも動かせますね。
あと、Gear360はパラメータがおかしかったりすると、エラーも出さずに電源が落ちるので開発し辛いかもです。

結論

とりあえず、Gear350もTHETA S同様にOSC APIを使うことができるみたいです!
次回は「Gear360のLiveVIew機能や、動画はAPIに含まれているのか?」を検証してみたいですね。

[asin:B01EY5TZTS:detail]