saitetu diary

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

移転しました。

約3秒後に自動的にリダイレクトします。

ロボットアーム製作日誌(ソフト編:後編 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厚だとなかなか自重やモーターのトルクに負けて曲がってしまったり振動してしまうことがありました。

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

IoTLTで初LTしてきた話

最近このブログ更新が滞っていたので、何か書かなきゃと思い。。。

ーーー

11/28に行われたIoTLT大阪vol4で初LTしてきました。

 テーマはIoT with Unityで、IoTで何か作るとき、Unityでインターフェース作ったら楽なんじゃない?みたいな内容でした。

かなり緊張しててアレだったんですが、また機会があったら登壇したいと思ったりしましたね。

ちなみにこのときのスライド↓

 

 

ーーー

 

あと、会場がHDMI対応してなくて、変換アダプターはやっぱり必要だと痛感しました…

UnityでNCMB使用時にAndroidビルドするとインストール出来ない問題

NiftyCloudMobileBackend(NCMB)を最近使うことがあったのだが、Android向けにビルドすると何故かインストール出来ない事があったのでここに書いておこうかと

ビルドは成功するが端末に入れてもインストール出来ない
(パッケージの解析中にエラーが発生しました。と出る)
f:id:saitetutan:20160916225910p:plain

バージョン、サイズ、パッケージ名が不明になっているのでManifestあたりかなと思ったら、

案の定Manifest.xmlがおかしかった模様。
(なぜ変更されてるのかはよくわからない・・。)

f:id:saitetutan:20160916224730p:plain

ここのAndroidManifest.xml上のPACKAGENAMEとかになってるところを下リンクを参考に自分の作ってるパッケージ名に直せばオッケー
(3~4個位ある感じ)

参考
stackoverflow.com

Google VRをUnityに適用する際の諸々

UnityでVR化する際、今まではGoogleCardboardのSDKを適用してきたが、
今年の5月のGoogle I/O 2016でGoogleVRが発表されSDKの仕様が変更された。

基本的な使い方はあまり変わらないが一応載せておこうかと。

1.GoogleVRの適用の仕方


下記のリンク先のUnityタブからSample&Downloadをクリックする。

developers.google.com

GithubからでもDirectlyの直接ダウンロードのどちらでも可

解凍したら、VR化したいProjectを開きながら、GoogleVRForUnity.unitypackageを実行するとProjectのAssset内にGoogleVRが追加される。
f:id:saitetutan:20160711222516p:plain

その後、GvrViewerMainを適用したいScene内のGameObjectにAddComponetする。
f:id:saitetutan:20160711222703p:plain

以上
f:id:saitetutan:20160711223633p:plain


2.特定のカメラを加速度によって動かないようにする(GvrHeadの無効化)


このSDKでは全カメラに頭の加速度に追従して動くためのスクリプト(GvrHead.cs)が生成される。

個人的に加速度に追従してほしくないカメラがあったので、その時の対処法を一応。
(需要あるかな・・・。)

とは言っても超絶簡単で、スクリプトを作って(ここではignore.cs)中に

を書いて、追従無視したいカメラにAddするだけ。

GvrHead.csでTagをつけたCameraをFindするのも手かと


参考
answers.unity3d.com

Unityで5/11 Clustering 1jobsから動かなくなった時の解決法

UnityでNavmeshをベイクした時、5/11 Clustering 1jobsから動かなくなったので調べてみたら、ここに書いてあったので。

answers.unity3d.com

つまりはLightingのBakedGIのResolutionが小さいのが原因らしい
が、別にそんなに光にこだわりがないのであれば外しちゃうのも手かと。

手順としては


f:id:saitetutan:20160709161940p:plain

を選択して


f:id:saitetutan:20160709162140p:plain


のチェックを外すだけ。

BlenderからUnityにオブジェクトをインポートする際のTips

自分の備忘録的な感じでこれから続けていこうと思います。(Unity,C#,java,Blender等)


1.Blender内でマテリアルの管理をする際に、名前が重複しないように気をつける

Blenderではマテリアルを作成すると、「マテリアル」「マテリアル2」のように名前が自動で付けられる。
そのため、Blenderで作成したオブジェクトをUnity内で複数使用する際にマテリアルの名前が重複しやすい。

重複すると同じ色になってしまうので、マテリアルを作成した時には名前を逐一つけるのが妥当

f:id:saitetutan:20160709145621p:plain

2.UVmapをとりあえずつけとく

テクスチャなしの簡素なオブジェクトでもUvマップをつけておくとよい

f:id:saitetutan:20160709145456p:plain

稀にUnity内でMesh doesn't have albedo UVs. Please create them in your modelling package.等のエラーが出るため
つけかたは、Blender内右側などにあるプロパティウインドウ内の逆三角ボタンを押して、UVマップの+マークを押すだけ(下図)

f:id:saitetutan:20160709145347p:plain

ちなみにオブジェクトの形式はFBXでも.blenderのままでもいい


参考:
answers.unity3d.com