把持メカニズム設計
FixedJoint を捨て、IsKinematic 追従に切り替えた
ArticulationBody 階層内で FixedJoint は機能しない。スクリプト層で毎フレーム position を同期する方式に移行した。
01 — セクションを選択
01
ステートマシン
4ステートの遷移フロー
02
把持方式比較
FixedJoint vs IsKinematic
03
CSV データ
イベントログと記録項目
ステートマシン — Pick-and-Place フロー
REACH_CUP
EndEffector を HandlePoint に向けて CCD IK で接近する
dist ≤ graspThreshold (0.08m) → 遷移
↓ GRASP_THRESHOLD 到達
GRASP
cupRb.isKinematic = true / 毎フレーム cup.position = endEffector.position
即時遷移(1フレーム)
↓ FixedJoint 廃止・position 追従開始
REACH_PLACE
カップを保持したまま PlaceTarget へ移動。カップは EndEffector に追従
dist ≤ graspThreshold → 遷移
↓ PlaceTarget 到達
PLACE
cupRb.isKinematic = false → 重力に戻す。1.5秒後にカップを初期位置にリセット
即時遷移 → クールダウン 2.0秒
REACH_CUP に戻る — カップは初期位置にリセット済み
把持方式比較 — FixedJoint vs IsKinematic 追従
LOG92 / 廃止
FixedJoint
ARM ✗ CUP ArticulationBody 内で無効
  • ArticulationBody 階層内で機能しない
  • connectedBody への接続が破綻
  • カップが落下し続ける
LOG93 / 現行
IsKinematic 追従
ARM EE → CUP pos = EE.position
  • isKinematic=true で物理から切り離す
  • 毎フレーム position 強制同期
  • カップが確実に追従する
なぜ FixedJoint が失敗したか
Unity の ArticulationBody は Rigidbody とは異なる物理ソルバーを使用する。FixedJoint は Rigidbody 同士の接続を前提としており、ArticulationBody 階層内の IsKinematic な Rigidbody との結合は保証されていない。IsKinematic 追従方式はこの制約を物理層ではなくスクリプト層で回避する。
CSV データ — ステート遷移ログ
robot_event_log.csv ステート遷移ログ
timeeventdistee_xee_y
0.0619TO_GRASP0.166-0.329-0.015
0.0701GRASP_START0.175-0.293-0.098
0.0701TO_REACH_PLACE0.175-0.293-0.098
1.5618TO_PLACE0.030-0.0710.193
1.5667PLACE_DONE0.030-0.0710.193
1.5667TO_REACH_CUP0.030-0.0710.193
3.0616TO_GRASP0.009-0.0790.031
3.0657GRASP_START0.009-0.0790.031
ループ周期は約 1.5秒。2サイクル目の TO_GRASP の dist が 0.009m(9mm) まで改善 — IK がカップに正確に収束している証拠。ee_y の変化(−0.098 → 0.193)からアームが約 29cm 上昇 して PlaceTarget に到達していることが分かる。
FRAME LOG — 毎フレーム記録項目
j0〜j5_pos j0〜j5_vel j0〜j5_force ee_x / ee_y / ee_z state / dist
01
REACH
CUP
→
02
GRASP
→
03
REACH
PLACE
→
04
PLACE
↺
LOOP
REACH
CUP へ