THETAライブストリーミング on レゴマインドストームEv3

# 概要
全天球ライブストリーミング映像を見ながら運転する。
そんな楽しそうな未来に向けて、レゴマインドストームEv3にTHETA Sを載せて、Ev3を操作しながらTHETA Sのライブストリーミング映像を見られるようにしてみました。

### ※ お断り
今回はDualfishEye動画での配信になります。
![参考画像](https://developers.theta360.com/intl/common/img/dualfisheye.jpg)

### やること
* レゴマインドストームEv3(以下Ev3)をROSで遠隔操作する
* Ev3にTHETA Sを積んでライブストリーミング(DualfishEye)する
 * 将来的には全天球動画にしてHMDで見れるようにしたい
* 配信されたライブストリーミング映像を見る
 * 視聴環境：Mac PC、iPhone、Android (4.x以上) のみ

# 実現方法

## Ev3を遠隔操作

まずは操作する車の方です。

### Ev3ハード設計
Ev3は車型にして、LiveShell2とTHETA Sを積みました。
(きちんと設計しないと、バランス崩して倒れたり、配線に失敗したりします。)

* Ev3にUSB WiFiドングルをセット (遠隔操作の通信用)
* LiveShell2とTHETA SをHDMIケーブルで結線
* LiveShell2にUSB WiFiドングルをセット (配信サバとの通信用)

![R0013519.JPG](https://qiita-image-store.s3.amazonaws.com/0/17647/b64837ea-0498-51bf-49ca-aa1f3dc878ed.jpeg)

### Ev3ソフト環境構築
* [ROSでレゴマインドストームEV3を動かしてみた](http://qiita.com/mechamogera/items/504fcf57153086094ba2)

## 動画配信

* LiveShell2からWiFiドングル経由で配信サバへ転送します
* 配信サバからHLSで配信します

![architecture.png](https://qiita-image-store.s3.amazonaws.com/0/17647/eb163daf-9726-c230-651f-09297b0f07bc.png)


### 動画配信サバの設定

今回はAWS EC2インスタンス上に配信サバを構築しました。

#### EC2インスタンス

EC2インスタンスを起動する際、以下の点に注意してください。

* EIPをつけない場合は"自動割り当てパブリック IP"を有効化して下さい
* SecurityGroupで以下のようにRTMP, HTTP用の穴あけをして下さい

| ポート     | プロトコル | 送信元    | 補足                     |
|-----------:|:----------:|-----------|--------------------------|
| 22         | tcp        | 0.0.0.0/0 | 接続元IPに絞ってください |
| 80         | tcp        | 0.0.0.0/0 | 閲覧用HTML取得           |
| 443        | tcp        | 0.0.0.0/0 | 同上                     |
| 1935       | tcp        | 0.0.0.0/0 | RTMP用                   |

#### nginx + rtmp_module インストール
こちらを参考にさせて頂きました。 => [nginx-rtmp-moduleでお試しLive配信環境を作る](http://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324)

* クライアントは前述のLiveShell2でやるのでスキップ。
* nginxはyumからも取れますが、rtmp_module込みでビルドしないといけないのでソースから入れました。

#### HLS配信・閲覧用のHTML配信
こちらを参考にさせて頂きました。 => [nginx-rtmp-moduleを使ってスマートフォンへの生放送配信を実験](http://qiita.com/oggata/items/5933e9a5ab16ece45c5f)

* iPhone, Mac, AndroidはHLS形式に対応しているため、デフォルトブラウザで閲覧ができるようになります。

#### nginxの設定
上記2つのqiitaを参考にして、以下のようになりました

* [nginx.conf](https://gist.github.com/ogawatti/af0654908abdb7629b5d)

### LiveShell2の設定

初期セットアップについては省略。
配信サバへの転送設定について記載します。

* 設定 (ダッシュボード右上)
 * 配信先サービス : その他配信サービス (サーバーアドレス入力)
 * 配信先URL    : rtmp://[配信サバのPublicIP]/hls
 * ストリーム名 : 任意の文字列
* カスタム (ダッシュボード右上)(設定のちょっと下辺り)
 * 平均ビットレート : 32Kbps
 * フレームレート   : 1fps
 * 配信キューの長さ : 100
 * プロファイル     : Baseline ( ※ [Androidでは「Baseline」のみ対応のため](http://developer.android.com/intl/ja/guide/appendix/media-formats.html))


# 閲覧

1. 配信サバを起動(EC2/nginxを起動する)
1. THETA Sをライブストリーミングモードで起動 ([参考 : 起動方法](https://theta360.com/ja/support/manual/s/content/streaming/streaming_01.html))
1. LiveShell2を起動する
 * ダッシュボードから配信を開始する
1. ブラウザから配信サバのPublicIPにアクセスするとプレイヤーが表示されるので再生します。

見えました！
![LiveStreaming.png](https://qiita-image-store.s3.amazonaws.com/0/17647/40d049d9-e08b-81d8-ffab-133f5341664c.png)


# 今後の課題

* タイムラグの軽減
 * 回線が重いと結構なタイムラグが発生します
 * LiveShell2の設定の見直し
 * サーバーのスケールアップ
* DualfishEye動画をスティッチして全天球動画に変換して配信したい
* 全天球動画をHMDで見たい

---

# 関連記事(ご紹介)

* ROS, Ev3
 * [VirtualBoxでROSを動かしてみる](http://qiita.com/oh_rusty_nail/items/b19f474b0d88eecddc1e)
 * [OSXのdocker環境でROSを動かしてみる](http://qiita.com/mechamogera/items/1de9a49306087936d954)
 * [ROS環境構築 (Ubuntu15.04 + ROS Jade)](http://qiita.com/ogawatti/items/ef56b25b1ba7785e7536)
 * [ROSでレゴマインドストームEV3を動かしてみた](http://qiita.com/mechamogera/items/504fcf57153086094ba2)
 * [EV3+ROS+ev3_robot_gyro_carを読んでみた](http://qiita.com/paty-fakename/items/903411c7d372f512b3d4)
 * [Raspberry Pi 2+Ubuntu 14.04+ROSでEV3動かしてみた](http://qiita.com/mechamogera/items/e4f53d7d33be9125e8b9)
* 動画配信
 * [nginx-rtmp-moduleでお試しLive配信環境を作る](http://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324)
 * [nginx-rtmp-moduleを使ってスマートフォンへの生放送配信を実験](http://qiita.com/oggata/items/5933e9a5ab16ece45c5f)