LOG137 — Pick & Place: Real → Render
実機データ移植マップ
実機ポーズ名
→
CSV label / ジョイント角度 [J1〜J6]
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]
シミュレーション動作フロー(クリックで詳細)
01 HOME → GRIPPER_OPEN 初期化
アームをホームポジションに戻し、グリッパーを開く。Rigidbodyの isKinematic は初期状態で true(重力無効)。
02 APPROACH_PICK → PICK アプローチ
グリッパーが開いたままブロックの上方から接近し、PICK姿勢まで降下する。Lerp補間で滑らかに遷移。
03 GRIPPER_CLOSE アタッチ
グリッパーが閉じる。同時にコードでブロックをEndEffectorの子オブジェクトとしてアタッチ。isKinematic=true で重力を無効にしてアームに追従させる。
Rigidbody rb = cupObject.GetComponent<Rigidbody>(); if (rb != null) rb.isKinematic = true; cupObject.transform.SetParent(endEffector, worldPositionStays: true);
04 APPROACH_PLACE → PLACE 搬送
ブロックがアームに追従したまま、箱の上まで移動する。ブロックはEndEffectorの子なので自動的に一緒に動く。
05 GRIPPER_OPEN_PLACE デタッチ→落下
グリッパーが開く。コードでブロックをデタッチし、isKinematic=false に切り替えて重力を有効化。BoxCollider同士の衝突で箱の中に落ちて止まる。
cupObject.transform.SetParent(null, worldPositionStays: true); Rigidbody rb = cupObject.GetComponent<Rigidbody>(); if (rb != null) { rb.isKinematic = false; rb.useGravity = true; }
06 HOME_RETURN 完了
アームがホームポジションに戻る。ブロックは箱の中に残る。1サイクル完了。

▲ 各ステップをクリックすると詳細が開きます