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に表示する
三輪オムニホイールロボットの操作について