Unity

モータ動作をUnityで実装する(Hinge Joint)

はじめに

先日、ロボットアームをスマートフォンアプリから動作させるアプリをUnityで作成しました。

この中でモーターを動かす際に、transform.Rotationで動かすのを試したのですが、CADデータからインポートしたためか、親子関係がめちゃくちゃで思った通りの回し方が実現できませんでした。

そこで色々と調べた所、HingeJoint機能を使うと、割りと思った通りの動きをしてくれることがわかったので、備忘録がてらまとめておこうと思います。

HingeJointとは

HingeJoint機能自体は、その名の通りドアのヒンジ部分に使用したり、鎖とか変わった敵キャラクタなどに使用できるようです。
今回はサーボモータ動作をこのコンポーネントを使用して実装します。

モータ動作

HingeJointコンポーネントにはMotorクラスが用意されています。
Use MotorをtrueにするとTarget Velocity(到達目標速度),Force(適用される力),Free Spin(ブレーキを有効にするかの真偽)で指定した値で指定したjoint部分がモータとして動き出します。
言ってみればこれだけなのですが、このJoint部分のアタッチが意外と面倒だったので、そこも書いていきます。

Hinge Jointのアタッチ

モータをつけたいGameObjectを選択します。

20171020-080801.png

Add ComponentからHinge Jointを選択します。

20171020-080822.png

まずConnected Bodyにモータの先でつながるRigidBody(ココ割りと重要。RigidBody同士でないと使えません。)を選択します
20171020-081217.png

すると下の図で赤色の線で囲った矢印が何処かに現れるかと思います。
Inked20171020-081352_LI.jpg

これをAnchorとAxisの値を弄ってモータの中心に鉛直方向に下図のように置くことで完成です。
Inked20171020-081553_LI.jpg

以上でアタッチ完了です。

スクリプトでの制御

大ざぱなスクリプトでの制御例(180度まで動かす例)です。

jointmotor.cs
......
    HingeJoint joint;
    JointMotor jointmotor;
    JointLimits limit;
.....
    void Start(){
       joint = gameObject.GetComponent<HingeJoint>();
       jointmotor = joint.motor;
       limit = joint.limits;
    }
.....
    void motor_on(){
       joint.useMotor = true;
       jointmotor.targetVelocity = 10;
       limit.max = 180;
    }
.....
    void motor_off(){
       joint.useMotor = false;
    }

実際には急に止めてもうまく止まらないので、フィードバック的に制御するようにしています。

実際の動作

実際の動作はこんな感じ
movearm.gif

今回作ったロボットアームに関しては以下のブログで4回に分けて記事を書いています。
ロボットアーム製作日誌
興味があったら覗いてみてください。