saitetu diary

ロボット,IoT,アプリ開発などの備忘録的なブログです。機械加工,電子工作とかも。。

Unity,Blender,C#,Javaなどの備忘録的なブログです。電子工作やArduinoなんかも。

ロボットアーム製作日誌(ソフト編:後編 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に記事を書くつもりです)


f:id:saitetutan:20171117100505j:image

 

これを6つの関節全てに適用して完了です。

あとはスライドバーを用意してUIは完成です。

あとはUnityからWebsocketを使用する為、websocket-sharpを利用しました。

websocket-sharpは以下のリンクを参考にしました。

https://qiita.com/oishihiroaki/items/bb2977c72052f5dd5bd9

 

できたアプリはこんな感じです。


f:id:saitetutan:20171117092850j:image

 

デザインにこだわる時間がなかったのでアレですが、下のスライドバーで角度を指定することで、

 


f:id:saitetutan:20171117092940j:image

 

このように動かすことができます。

 


f:id:saitetutan:20171117093005j:image

 

すべての関節が動かすことができるので、この様に動かせ、さらに、実際のアームもwebsocketを経由して動かすことができます。

 

6.まとめ

とりあえず、アプリから動くところまでは完成しましたが、課題が多くできました。

 

一番問題なのが、アルミの強度で、1mm厚だとなかなか自重やモーターのトルクに負けて曲がってしまったり振動してしまうことがありました。

これは全体を作り直す必要がありますので、またロボットアームを作りたくなったら挑戦したいと考えています。