ロボットアーム製作日誌(ソフト編:後編 IoT,Unity)
ロボットアーム製作日誌最終回です。
前回まででとりあえず動くところまで行きましたので、今回はスマートフォンアプリからロボットアームを動かす所を書きます。
4.Websocket
まず、アプリからの制御と言っても、インターネットを介して制御するため、そこの部分の実装がまず必要になります。
今回はリアルタイム性が必要なことを考え、Websocketを使用しました。
学祭で展示するため、大学のポートを開けられないことから、VPSを経由する実装にしました。
まず、スマートフォンからVPSにwsで接続し、VPSがechoするだけ(送られてきたのを返すだけ)のサーバーとして働き、ロボットアームのラズパイもVPSに接続しておくことで、そちらにも送られるという形を取っています。
ラズパイ上はPythonのwebsocketclientを使用し、VPSではnode.jsでechoサーバーを実装しました。
5.アプリ制御
上記でのwebsocket通信によって、角度をjson形式で送るとロボットの関節が動くようになりましたので、今度はアプリからwsを投げられるようにします。
アプリは直感的にどこの部分が動くのかがわかるようにするため3Dを使いたく、Unityを使用しました。
ロボットアームの3Dモデルは、Fusion360にて設計した際のCADデータを.objにコンバート、エクスポートして、Unityにインポートしました。
コンバートの手順は以下のリンク先を参考にしました。
http://home3ddo.blog.jp/fusion360-import-export
ただ、CADデータといえどもOBJにしてしまえば締結部分のデータなどは失われてしまいます。今回は回転部分が多くありましたが、ここの部分のデータが無くなってしまったので、Unity上で設定する必要があります。
Unity上でサーボモーターを再現するの方法として、transform.Rotateなどをいじる方法もありますが、今回の場合オブジェクトが大量に親子属性を持っており、それぞれがlocal座標を持っており、パラメータをいじるだけでこれを実現するのは困難です。
そこで、今回はHingejointコンポーネントを使用しました。これは本来ドアや、ドアノブなどのjoint部分に使用するようですが、motorクラスが用意されており、サーボモータとしても使用することができます。(後日Qiitaに記事を書くつもりです)
これを6つの関節全てに適用して完了です。
あとはスライドバーを用意してUIは完成です。
あとはUnityからWebsocketを使用する為、websocket-sharpを利用しました。
websocket-sharpは以下のリンクを参考にしました。
https://qiita.com/oishihiroaki/items/bb2977c72052f5dd5bd9
できたアプリはこんな感じです。
デザインにこだわる時間がなかったのでアレですが、下のスライドバーで角度を指定することで、
このように動かすことができます。
すべての関節が動かすことができるので、この様に動かせ、さらに、実際のアームもwebsocketを経由して動かすことができます。
6.まとめ
とりあえず、アプリから動くところまでは完成しましたが、課題が多くできました。
一番問題なのが、アルミの強度で、1mm厚だとなかなか自重やモーターのトルクに負けて曲がってしまったり振動してしまうことがありました。
これは全体を作り直す必要がありますので、またロボットアームを作りたくなったら挑戦したいと考えています。