2015年10月6日火曜日

LTE(携帯電話網)でローバーを遠隔操作してみた。(ドロイドローンVer0.2)WebRTC版

前回LTE携帯電話網でローバーを遠隔操縦してみたで課題だったリアルタイム操縦ができました。
HTML5で使えるXboxのGamePadも購入してつけてみて操縦しました。
AndroidStadioでクローンしてそのままビルドすれば動くはずです。



XboxのGamePADが、スティクから手を放してもばねが弱いためかセンターの0にきっちり戻らず、ローバーが旋回してしまうため、操縦がしにかかったです。まぁ慣れなんでしょうが。

いまFPVはこんなことになっています。 ゴイスー。
このくらい迫力のある動画ならなばインパクトあるんですが、ちんたらうごいていても面白くないですね。今度はそっちに注力せねば。

前回はWebサーバーとAndroid、Webブラウザのポーリング通信で、カメラ画像とローバー操縦に5秒のタイムラグがあったんですが今回WebRTC(Webリアルタイムチャット)でほぼタイムラグがなくなりました。

WebRTCのサーバーはSkyWayを利用させていただきました。
WebRTCの知識0でしたが、ドキュメントもわかりやすく1か月ほどで実装できました。
一部ドキュメント通りに行かないところもありましたが、何とかなりました。

はまったところは、

  • ローバー操縦コマンド、GPSデータなどのデータコネクションPeer
  • カメラ画像とオーディオのメディアストリームPeer

の2本立てで実装するサンプルがない。
両方のPeerのコールバック関数の順番の入れ弧をいろいろ関数の場所を動かしてトライアンドエラーで試しました。うまく行かないときはPeer2本立てってそもそも無理かとも思いましたが。

適当な順番でもうまくいくつながるときがあるんですが、接続の失敗が多しぎました。

結局、WebブラウザとAndroid側で確認ボタンを押して接続するようにし、接続タイミングをウェイトすることで何とか安定させました。

いやー、WebRTC(SkyWay)はすばらしいですね。

WebRTC自体はドロイドローン構想時に使用したいと考えていたんですが、WebRTCはAndroidのネイティブアプリで対応した物ありませんでいた。

CordovaとかのHTML5アプリでは、その時点でBluetooth対応とかいまいちでしたので、ローバー操縦のBluetoothを優先して、ストリーミングは後で考えようということで、AndroidのネイティブアプリでWebサーバー経由で作り出したのが約1年前でしょうか。Android開発もほぼ素人なので、カメラとかWebで散々苦労しました。

やっとWeb版が先月9月に完成したものの、タイムラグありすぎで次バージョンのGCMとかRTC等調べていたら、2015.7月にSkyWayのAndroid SDKが発表されているのに気が付きました。タイミングが良かったです。

それから、Web、カメラのコード全部捨てて、やり直しになりましたが、何とかできました。

課題
  1. カメラ、GPSデータの保存が出来ない。Webブラウザからクラウドストレージに保存予定。
  2. Androidのフロント、バックカメラ2台使いがしたい。
  3. WebRTC中にAndroidの高画質カメラ撮影が保存できないのか?
  4. 乗り物マイコンのArduino対応とラジコン用サーボの制御
  5. いまのところ私個人のSkywayのAPIキーを使っていますが、サービスとして広く提供する為にはどうすりゃいいのか。
5番ですが、Skywayの場合、APIキーが一つだと、複数人つなぐとPeerIDがどんどん増えてしまう。現在生成されたPeerIDを選択する方法ですが、どっかで個々の利用者との区別をしなければです。

1.でクラウドストレージ使うのに、GoogleのIDなんかでログインするとなれば、クラウドストレージを通じてPeerIDのやり取りすることになるかとおもいますが。

また、ものすごく利用されるとGoogleAPIのほうも有償で対応しなければで、アプリはオープンソースでやりたいけど、サーバー利用料を何とかせねばなります。

まぁ追々考えますか。

あと、実際屋外で操縦するのには、操縦側のFPV表示装置も下のような感じでスマフォでやるのがベストだよね。Web画面をスマフォ対応のHTML5にするか、こっちもネイティブにするか。
bluetoothでジョイスティックつないでんのかな。
HTML5のbluetoothも対応進んでるのかな。そうすればスマフォアプリもHTML5にした方がいいのかな。