こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
害虫や埃など、家屋の衛生環境を悪化させる要因は多々存在する。 特に、家電や家具の裏側など、人間の手が届かない場所は駆除・清掃が後回しになりやすく、 衛生環境の悪化が進行しやすい。もし人間の手が届かない場所の駆除・清掃を補助するロボットがあれば、 こういった環境の悪化を回避しやすくなるだろう。
そこで、人間の手が届かない場所の駆除・清掃を補助するロボットであるInsect Destroyer(下図)を制作した。このロボットは、 手の届かない場所や汚染された場所でも手軽に駆除・清掃を行うために、 Android端末からの遠隔操作を受け付ける。また、視界の悪い場所での駆除・清掃を補助するため、 全面にとり付けられたカメラからの映像をAndroid端末に送信する。このロボットがあれば、 手の届かない場所や視界の悪い場所の清掃が容易に行えるようになる。
Insect Destroyerの設計
上述したInsect Destroyerの機能を実現するため、下図のような構成でソフトウェアを設計した。 Androidアプリ、Raspberry Pi、Arduinoはそれぞれ独立して動作し、 TCPによる通信でAndroidアプリとRaspberry Piが連携し、 USBシリアル通信でRaspberry PiとArduinoが連携する設計になっている。
ロボットの操作は、下図に示す、AndroidアプリのコントローラUI(バーチャルスティック)から行う。Androidアプリはバーチャルスティックへの入力をRaspberry Piに送信し、 その入力を受け取ったRaspberry PiはArduinoにその情報を転送する。 Raspberry Piから情報を受け取ったArduinoはPWM信号によってモータードライバを制御し、 モーターに流す電流の方向と大きさを調整する。
ロボットからのカメラ映像はRaspberry PiからAndroid端末に配信される。 Raspberry PiからAndroidへの映像配信にはnginx-rtmp-moduleを用いた。また、Androidでの映像受信にはExoPlayerを用いた。
Android側の設計と実装
アプリの操作画面は以下のようになる。Androidアプリの機能はカメラの映像を映す部分とコントローラー部分の大きく2つに分けることができる.なお,右下のボタンは未実装であるためこの2つの機能には含まれない.
カメラの映像はExoPlayerを使用してタブレットの画面全体に表示している。Insect Destroyerが想定するような狭い空間は視認性が悪いため、このようにできるだけ大きく映像を表示することで、ユーザは車両を操作しやすくなる。コントローラーについては映像の上に表示され、映像が見えにくくなることを避けるために、半透明のバーチャルスティックを採用した(図 左下)。また、バーチャルスティックは、その傾き具合によってモーターの出力を細かく制御することが可能であるため、狭い空間での繊細な動作が可能となった。
バーチャルスティックは画像から分かるように、半透明の背景部分(大きな円)と不透明なスティック部分(小さな円)で構成されている。このうち、実際にユーザのタッチ操作を受け取るのは背景部分である。背景部分にTouchListenerを実装することにはいくつかの利点がある。一つは最初にコントローラー内をタッチしていれば、ユーザがドラッグの最中にコントローラー外に指をはみ出してしまっても操作が継続される点である。もう一つは、指を動かしてコントローラーの出力が変更されたときにだけ実行されるため、アプリと車両の間に無駄な通信が発生しないという点である。
このようにして取得したタッチ座標はコントローラーを中心としたベクトルに変換され、スティック部分の適切な位置への配置に使用される。また、左右のモーターの出力の決定もこのベクトルを使用して行われている。
Raspberry Pi側の設計と実装
Raspberry Piには、Androidアプリから受け取ったモーター出力の値をArduinoに中継する役割と、 カメラから受け取った映像をAndroidに配信する役割がある。 いずれの役割でも、Raspberry PiとAndroidアプリの連携はTCPを用いて行う。
AndroidアプリとArduinoの連携では、 Raspberry PiでTCPのソケットを受信用に開いておき、 そのソケットに送られたデータをAndroidにそのまま転送する処理を行う。 Raspberry Piからは、ArduinoのUSBシリアル通信を行うためのインタフェースが /dev/ttyACM0という文字デバイスとして認識されるため、 例えば、以下のようなコマンドを実行することでRaspberry PiからArduinoにデータを送ることができる。 なお、BAUD_RATE の値は、Arduino側で指定したボーレートに設定する必要がある。
$ BAUD_RATE=9600
$ stty /dev/ttyACM0 $BAUD_RATE
$ echo abc > /dev/ttyACM0
# abc\n というデータがArduinoのシリアルポートに送信される。
Raspberry Pi側で行う処理のひとつであるAndroidアプリへの映像の送信は、 RTMPモジュールを追加したNginxをRaspberry Piで実行し、AndroidアプリからNginxにTCP上のRTMPプロトコルで接続することにより実現している。
まとめ
生活環境の改善を目的に、車両型ロボット Insect Destroyer の製作を行った。このロボットは左右のモーターが独立して動作し、バーチャルスティックによって繊細な出力の操作が可能であるため、狭い空間でも問題なく活動できる。また、カメラの映像をAndroidアプリで確認しながら操作を行うことで、人間が視界が届かない場所でも活動できる。
現在の機能では、ロボットに除菌シートを装着することで家電や家具の裏側などを清掃することが可能である。今後は殺虫スプレーを噴射する機構や、暗いところでも活動できるようライト機能の搭載等を検討している。
コメント