ラベル LG G Watch の投稿を表示しています。 すべての投稿を表示
ラベル LG G Watch の投稿を表示しています。 すべての投稿を表示

2014年9月6日土曜日

Android Wear (LG G Watch) でカメラからの映像を見ながら三輪ロボットを操作してみた

はじめに

Android wear (LG G Watch) で、カメラからの映像を見ながら三輪オムニホイールロボットをラジコンのように操作してみました。動画はこちら。




経緯など

Android Wear (LG G Watch) で三輪ロボットを操作してみた」にて、Android wear搭載のLG G Watchで三輪ロボットを制御しました。

このロボットにはRaspberry Piとそのカメラモジュールが搭載されており映像を配信しているのですが、せっかくなのでLG G Watchでもその映像を表示してみよう、というのが今回のお話。

仕組みなど

動画の後半にも示されているように、LG G WatchだけではなくペアリングされたAndroid端末とその上で動くアプリが必要です。システム全体の模式図は下図のようになります。


スマートフォン側のアプリが三輪ロボット上のカメラからの映像を受け取り、それをWear側のアプリに送ります。カメラからの映像は640x480、15fpsで送られてきますが、Wear側へはそれを280x280、5fps程度に変換してから送っています。スマートフォンとWearはBLEで接続されていますので、データ量を極力減らさないとまともに動作しません。

アプリのスクリーンショットはこちら。

Wear側のアプリ



スマートフォン側のアプリ



ソース

操作命令送信のサンプルは「Android Wear (LG G Watch) で三輪ロボットを操作してみた」にあります。

映像受信のサンプルは neuralassembly/MjpegViewWear になります。Android Studio でインポートして、スマホとWearの両方にインストールしてください。

MjpegViewerWearを試すには、上の動画で行っているように、Raspberry Piで動画配信するという方法もありますが、より簡単に試すには、Androidスマートフォン(以下「別スマホ」と表記)を用意してその上でIPWebcamというアプリを動かすのが簡単です。以下、この方法を簡単に示します。

  1. 別スマホで、IPWebcamをインストールして起動します。設定は「Video preference / Video resolution を640x480」、「FPS Limit を15または10」程度に設定し、「Start server」。起動すると画面にIPアドレスとポート番号が表示されるのでメモします。FPS Limitが小さいほうがWear側のアプリは安定します
  2. WearとペアリングしたスマホでMjpegViewWearを起動。メニューの設定で、IPアドレスと番号をセットします。コマンドは「videofeed」。「画像スキップの頻度 n」は「n回に一回、Wearに画像を送る」の意味です。大きくすると安定しますが遅いです。小さくすると不安定になるので、nは3より小さくできなくしています。4か5程度にするとWear側のアプリが安定します
  3. ペアリングしたスマホで画像が表示されたら、メニューから「Wearアプリ起動」を実行します。Wearがスリープ状態のときは画面を一回タップしないと映像が表示されません。
注意
(2014.12追記) スマホとWear間の通信ですが、データを大量に送りすぎると、通信が切れてしまうことがあります。これは、Wear側の時計画面でクラウドアイコンに斜線が入ることでわかります。以前は、「通信が一度切れると、スマホ側かWear側の本体を再起動しないと通信が再開しない」ということがありましたが、Android Wearがアップデートされるにともない、その問題は起こりにくくなっているように思います。現在は「通信が一度切れたら、スマホ側とWear側のアプリを終了して通信が回復するのを待つ」で済むことが多いです。

展示

この内容を、2014年12月21日に東海大学高輪キャンパスで開催されたAndroid Bazaar and Conference 2014 Winterで展示しました(週アスPLUSさんTAPPLIさん、星影さんのブログにも写真があります)。


この時は下記の構成でデモしました。

  • 映像送信:Raspberry Pi + カメラモジュール (10fps)
  • ペアリングされたAndroid:Nexus 10 (画像スキップの頻度 5)
  • Android Wear:LG G Watch R

映像送信の頻度はかなり安全側に振って設定しましたが、その甲斐あってか10:00~17:00の展示時間中、かなり安定して動作しました。

たくさんの方にお越しいただき、ありがとうございました。

余談

今回実現したのは、2013年に「i'm Watch」というAndroidベースのスマートウォッチで実現したことの焼き直しです。下にリンクがあります。

それと比べると、Android Wearを搭載した、Googleにより正式に認証を受けた端末で実現した、というのが今回の違いです。

「i'm Watch」でのデモは「i'm Watch」という時計でしか実現できなかったのに対し、今回のデモは今後増えていくであろうAndroid Wear搭載の時計ならばどれでも動作する(はず)、というメリットがあります。

こちらもどうぞ

三輪オムニホイールロボットの操作について
Raspberry Piでの映像配信について
時計での模型操作について(i'm Watchという時計でのデモ)

2014年8月6日水曜日

Android Wear (LG G Watch) で三輪ロボットを操作してみた

はじめに

Android wear (LG G Watch) で三輪オムニホイールロボットをラジコンのように操作してみました。
動画はこちら。




仕組みなど

システム全体の模式図は下記のようになります。


まず、三輪ロボットに搭載されたRaspberry Piではnode.jsが動作しており、操作命令をWeb経由で受け付けています。

それに対してAndroid Wearとペアリングされたスマートフォンから指令を送りますが、その際には「Androidアプリからnode.js+Socket.IOと双方向通信する」の解説を参考に、Gottox/socket.io-java-clientを使いました。

そして、その操作命令の決定に、Android Wearからのタッチ情報を用いています。

スマートフォンとAndroid Wear用のアプリはAndroid SDK (API 20)に含まれているサンプルwearable/DataLayerをベースに作成します。時計と電話の間のデータのやり取りには下記のページのようにいくつかありますが、今回は送信データ量が大きくないので、シンプルなMessageApiを用います。

参考


解説用に簡単なサンプルを作成してみました。スマートフォンとAndroid Wear間の通信だけを実装しています。Android Studioでインポートして利用できます。

Wear側のアプリ

タッチ位置を電話のアプリにMessageApiにより送ります。ただし、タッチイベントから得た座標を毎回送るとデータ送信回数が多すぎ、通信が止まってしまうことがありました。その場合、Wearの時計画面に戻ると、クラウドアイコンに斜線が入り、通信が切れていることがわかります。

そこで、下記の対策を施し、通信を安定化させました。
  • タッチの座標の解像度を20ピクセル刻みとし、座標が変化したときのみ座標データを送信する
  • 連続的に送信するのではなく、「時計から座標データ送信」→「電話側でデータを受け取ったことを時計へ通知」→「時計側は電話からの通知を待ってから次の座標データ送信」…を繰り返すようにする
2番目の変更が安定化には重要のようでした。

(追記 2014.12 エントリ追加時は、「データを送りすぎて通信が切れると、Wearかスマホの本体を再起動しないと通信が再開されない」ということが起こっていました。現在は「通信が切れたらWearとスマホのアプリをそれぞれ終了してしばらく待つことで通信が復活する」という動作になっているように思えます。しかしいずれにせよ、通信量を減らすことは重要のようです)



電話側のアプリ

Wearから送られたWearのタッチ位置を表示します。また、既に述べたように、Wearからデータを受信したらその受信通知をWear側に送り返しています。




こちらもどうぞ

三輪ロボットに搭載したカメラからの映像をWearに表示する
三輪オムニホイールロボットの操作について