お習字ロボットアームのAndroidアプリ


スクリーンショット
【ソース】
http://licheng.sakura.ne.jp/roboarm/RobotArm_Android.zip


お習字ロボットアームアプリは、microbridgeのServoControlというデモアプリをベースに作成しました。ServoControlは、microbridgeのWEBページからダウンロードできます。
microbridge: http://code.google.com/p/microbridge/


通信処理
お習字ロボットアームアプリは、通信処理部(package org.microbridge.server)とアプリ本体(package org.microbridge.servocontrol)からなります。通信処理部は元のServoControlアプリのものをそのまま使っています。microbridgeはUSB接続ですが、ADB(Android Debug Bridge)を利用してTCP over USBの通信をおこないます。なので、Androidのアプリ層から見ると単なるTCPのソケット通信であり、Android端末側がサーバ、Arduino側がクライアントとなります。
Serverは、簡易なTCPサーバのクラスです。指定のポート番号でサーバソケットが接続を待ちうけ、アプリからsendメソッドが呼ばれたら現在接続している全てのクライアントにデータを送信します。またクライアントからreceiveメソッドが呼ばれたらイベントリスナにイベントを発行して受信データを渡します。このアプリではポート番号は4567、通信は一対一で、サーバからクライアントへの送信のみ使用します。
ServerListenerおよびAbstractServerListenerは、Serverがハンドルするイベントリスナのインターフェースおよび抽象クラスです。抽象クラスはアプリ側でイベントリスナを無名クラスとして実装するときに使います。このアプリでは送信のみで受信はないので、イベントリスナは使用しません。
Clientは、ソケットに接続してくる各々の外部機器(ここではArduino)を扱うためのクラスです。Serverからsendメソッドが呼ばれたら外部機器にデータを送信します。また外部機器から受信があったらServerのreceiveメソッドを呼んでデータを渡します。


アプリ本体
RobotArmはアプリ本体のアクティビティです。このアクティビティは、[START/STOP]ボタン、[PLAY]ボタン、お習字Viewを画面上に持ち、また前述の通信処理をするサーバと、後述の逆キネマティクス計算オブジェクトを持ちます。[START/STOP]ボタンは初期状態では[START]ボタンです。ボタンを押すと記録中状態となり、ボタンは[STOP]ボタンに変わります。記録中状態ではお習字Viewへのタッチが有効となり、指で書いた文字の運筆を記録します。[STOP]ボタンを押すと記録を終了し、ボタンは[START]ボタンに変わり、それまで無効であった[PLAY]ボタンが有効になります。[PLAY]ボタンを押すと、記録した運筆データをArduinoに送信して筆ペンで字を書かせます。
運筆の記録は、お習字Viewから来るイベントに応じておこないます。(このアクティビティ自身がお習字Viewのイベントリスナです。) 指が触れたとき、指が動いたとき、指が離れたときに、その座標を取得し、逆キネマティクス計算で各サーボの角度を求め、運筆データに追加していきます。
運筆の再生は、記録した運筆データの最初から順に角度データを取得してサーボのパルス幅に換算し、これをArduino側との間で取り決めた通信フォーマットで送信します。この通信フォーマットについては下記を参照してください。また、運筆がギクシャクしないよう、記録した各点の間をなるべく細かく補間しています。補間はとりあえず簡単に線形補間でおこなっています。
参照URL: http://d.hatena.ne.jp/licheng/20120925
InvKinemaは逆キネマティクス計算のクラスです。逆キネマティクス計算については、下記を参照してください。
参照URL: http://d.hatena.ne.jp/licheng/20120924
BrushViewは、お習字Viewのクラスです。お習字ViewはOnTouchListenerを実装したViewです。指を触れると新しいPathを生成し、指を動かし離すまでの座標をその都度取得して一筆の線として画面に描画します。またこれらのイベントの度にその座標をアプリ本体にイベントで送ります。