見出し画像

UnityのArticulationBodyの使い方

Unityの「ArticulationBody」の使い方についてまとめました。

・Unity 2020.3

1. ArticulationBody

ArticulationBody」は、Unity 2020.1から利用できる新しい関節コンポーネントです。多くの関節を繋げても、正確で安定した動きを実現できるのが特徴になります。ロボットアームなど多関節ロボットの作成に適しています。

2. 実験環境の作成

実験環境の作成手順は、次のとおりです。

(1) Planeを配置し、Positionに(0, 0, 0)を指定。
(2) 空のGameObjectを配置し、JointAと名前を指定し、Positionに(0, 0.1, 0)を指定。
(3) JoinAの子としてCubeを配置し、Positionに(0, 0.4, 0)、Scaleに(0.2, 1, 0.2)を指定し、色マテリアルを作成して指定。
原点が根本にあるアームを作成できます。

(4) JointAをコピーしてJointBを作成し、JointAの子に配置し、Positionに(0, 0.8, 0.2)を指定。
(5) JointBをコピーしてJointCを作成し、JointBの子に配置し、Positionに(0, 0.8, -0.2)を指定。

(6) 「Main Camera」を以下のように設定。

・Position : (2.5, 2.5, -5)
・Rotations : (15, -25, 0)

3. ArticulationBodyの追加

「ArticulationBody」の追加手順は、次のとおりです。

(1) 「JointA」「JointB」「JointC」に「Add Component」で「Articulation Body」を追加。
各可動部分に「ArticulationBody」を追加します。各可動部分同士は親子関係である必要があります。また、「Rigidbody」は必須ではありません。

(2) 「JointA」の「ArticulationBody」を以下のように設定。

Immovable : True

この設定により土台が動かなくなります。ルートのArticulationBodyの数少ない設定項目の1つになります。

(3) 「JointB」「JointC」の「ArticulationBody」を以下のように設定。

・Articulation Joint Type : Revolute
・Anchor Position : (0, 0, 0)
・Anchor Rotation : (0, 90, 0)

「Articulation Joint Type」は、次の4種類を指定できます。

・Fixed : 2つのオブジェクトを固定するJoint。
・Prismatic : 親のX軸に沿ってスライドするJoint。
・Revolute : 2つのオブジェクトをヒンジのように1軸回転で繋ぐJoint。ドア、鎖、振り子などに利用。
・Spherical : 2つのオブジェクトを球体関節のように多軸回転で繋ぐJoint。ラグドールの関節などに利用。

「Anchor Position」と「Anchor Rotation」はヒンジの軸の位置と方向を指定します。Hierarchyビューで「JointB」「JointC」を選択してsceneビューを見ると、軸の位置と方向が赤い円で表示されます。

(4) 追加で「JointB」「JointC」の「ArticulationBody」を以下のように設定。

・X Drive → Stiffness : 10000
・X Drive → Damping : 100
・X Drive → Force Limit : 100

Drive」は目標(今回はX軸角度)を指定すると、それ維持しようバネのように動作します。設定値の意味は、次のとおりです。

・Stiffness : バネの剛性 (変形しにくさの度合い)
・Damping : バネの減衰 (徐々に静止していく度合い)
・Force Limit : 力の最大値

(5) 「JointA」に新規スクリプト「Controller」を追加し、以下のように編集。

・Controller.cs

using UnityEngine;

public class Controller : MonoBehaviour
{
    public ArticulationBody[] articulationBodies;

    // 定期的に呼ばれる
    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.Q))
        {
            var xDrive = this.articulationBodies[2].xDrive;
            xDrive.target -= 1f;
            this.articulationBodies[2].xDrive = xDrive;
        }
        else if (Input.GetKey(KeyCode.W))
        {
            var xDrive = this.articulationBodies[2].xDrive;
            xDrive.target += 1f;
            this.articulationBodies[2].xDrive = xDrive;
        }
        else if (Input.GetKey(KeyCode.A))
        {
            var xDrive = this.articulationBodies[1].xDrive;
            xDrive.target -= 1f;
            this.articulationBodies[1].xDrive = xDrive;
        }
        else if (Input.GetKey(KeyCode.S))
        {
            var xDrive = this.articulationBodies[1].xDrive;
            xDrive.target += 1f;
            this.articulationBodies[1].xDrive = xDrive;
        }
    }
}

(6) ControllerのArticulationBodiesに「JointA」「JointB」「JointC」をドラッグ&ドロップ。

4. 実行

Playボタンで実行すると、以下の操作方法で操作できます。

・AS : 第1関節の動作
・QW : 第2関節の動作

5. ソルバー種別の設定

「Player Settings」で、以下の2つのソルバー種別を選択できます。

・Projected Gauss Seidel (PGS)
・Temporal Gauss-Seidel  (TGS)

TGSを選択することで、PGSに比べて速度は少し遅くなりますが、より正確なシミュレーションが可能になります。

・収束が劇的に改善。
・高質量比の処理が改善。
・貫通を修正するときに導入されるエネルギーが最小限に抑えられる。
・関節ドライブの精度が向上。

6. 関連



この記事が気に入ったらサポートをしてみませんか?