ロボットアーム製作日誌(ソフト編:後編 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厚だとなかなか自重やモーターのトルクに負けて曲がってしまったり振動してしまうことがありました。
これは全体を作り直す必要がありますので、またロボットアームを作りたくなったら挑戦したいと考えています。
IoTLTで初LTしてきた話
最近このブログ更新が滞っていたので、何か書かなきゃと思い。。。
ーーー
11/28に行われたIoTLT大阪vol4で初LTしてきました。
テーマはIoT with Unityで、IoTで何か作るとき、Unityでインターフェース作ったら楽なんじゃない?みたいな内容でした。
かなり緊張しててアレだったんですが、また機会があったら登壇したいと思ったりしましたね。
ちなみにこのときのスライド↓
ーーー
あと、会場がHDMI対応してなくて、変換アダプターはやっぱり必要だと痛感しました…
UnityでNCMB使用時にAndroidビルドするとインストール出来ない問題
NiftyCloudMobileBackend(NCMB)を最近使うことがあったのだが、Android向けにビルドすると何故かインストール出来ない事があったのでここに書いておこうかと
ビルドは成功するが端末に入れてもインストール出来ない
(パッケージの解析中にエラーが発生しました。と出る)
バージョン、サイズ、パッケージ名が不明になっているのでManifestあたりかなと思ったら、
案の定Manifest.xmlがおかしかった模様。
(なぜ変更されてるのかはよくわからない・・。)
ここのAndroidManifest.xml上のPACKAGENAMEとかになってるところを下リンクを参考に自分の作ってるパッケージ名に直せばオッケー
(3~4個位ある感じ)
Google VRをUnityに適用する際の諸々
UnityでVR化する際、今まではGoogleCardboardのSDKを適用してきたが、
今年の5月のGoogle I/O 2016でGoogleVRが発表されSDKの仕様が変更された。
基本的な使い方はあまり変わらないが一応載せておこうかと。
1.GoogleVRの適用の仕方
下記のリンク先のUnityタブからSample&Downloadをクリックする。
GithubからでもDirectlyの直接ダウンロードのどちらでも可
解凍したら、VR化したいProjectを開きながら、GoogleVRForUnity.unitypackageを実行するとProjectのAssset内にGoogleVRが追加される。
その後、GvrViewerMainを適用したいScene内のGameObjectにAddComponetする。
以上
Unityで5/11 Clustering 1jobsから動かなくなった時の解決法
UnityでNavmeshをベイクした時、5/11 Clustering 1jobsから動かなくなったので調べてみたら、ここに書いてあったので。
つまりはLightingのBakedGIのResolutionが小さいのが原因らしい
が、別にそんなに光にこだわりがないのであれば外しちゃうのも手かと。
手順としては
を選択して
のチェックを外すだけ。
BlenderからUnityにオブジェクトをインポートする際のTips
自分の備忘録的な感じでこれから続けていこうと思います。(Unity,C#,java,Blender等)
1.Blender内でマテリアルの管理をする際に、名前が重複しないように気をつける
Blenderではマテリアルを作成すると、「マテリアル」「マテリアル2」のように名前が自動で付けられる。
そのため、Blenderで作成したオブジェクトをUnity内で複数使用する際にマテリアルの名前が重複しやすい。
重複すると同じ色になってしまうので、マテリアルを作成した時には名前を逐一つけるのが妥当