HOME
→
HOME / [0, 0, 0, 0, 0, -30]
—
→
GRIPPER_OPEN / [0, 0, 0, 0, 0, -30]
APPROACH_PICK
→
APPROACH_PICK / [-54.22, 81.91, -30.14, -8.08, -50.27, -29.44]
PICK
→
PICK / [-46.93, 102.74, -43.33, 3.6, -60.11, -31.9]
—
→
GRIPPER_CLOSE / [-46.93, 102.74, -43.33, 3.6, -60.11, -31.9]
APPROACH_PLACE
→
APPROACH_PLACE / [59.85, 30.0, 27.94, 10.01, -45.17, -35.33]
PLACE
→
PLACE / [54.49, 45.17, 26.63, 2.9, -70.57, -29.26]
—
→
GRIPPER_OPEN_PLACE / [59.85, 30.0, 27.94, 10.01, -45.17, -35.33]
HOME
→
HOME_RETURN / [0, 0, 0, 0, 0, -30]
アームをホームポジションに戻し、グリッパーを開く。Rigidbodyの isKinematic は初期状態で true(重力無効)。
グリッパーが開いたままブロックの上方から接近し、PICK姿勢まで降下する。Lerp補間で滑らかに遷移。
グリッパーが閉じる。同時にコードでブロックをEndEffectorの子オブジェクトとしてアタッチ。isKinematic=true で重力を無効にしてアームに追従させる。
Rigidbody rb = cupObject.GetComponent<Rigidbody>();
if (rb != null) rb.isKinematic = true;
cupObject.transform.SetParent(endEffector, worldPositionStays: true);
ブロックがアームに追従したまま、箱の上まで移動する。ブロックはEndEffectorの子なので自動的に一緒に動く。
グリッパーが開く。コードでブロックをデタッチし、isKinematic=false に切り替えて重力を有効化。BoxCollider同士の衝突で箱の中に落ちて止まる。
cupObject.transform.SetParent(null, worldPositionStays: true);
Rigidbody rb = cupObject.GetComponent<Rigidbody>();
if (rb != null) { rb.isKinematic = false; rb.useGravity = true; }
アームがホームポジションに戻る。ブロックは箱の中に残る。1サイクル完了。