Problem
Surface placement (robot.place("worktop"), robot.place("cracker_box")) plans to a pose 5mm above the destination surface, then releases. In physics mode the object drops and settles. In kinematic mode the object floats 5mm above the surface.
Solution
After reaching the clearance pose, execute a guarded move downward before releasing:
Physics mode: Move down until F/T sensor detects contact, then release. The wrist F/T sensors (added in #94) can detect when the held object touches the surface.
Kinematic mode: Move down by the clearance distance (5mm) directly, since there's no F/T feedback. Alternatively, snap the object to the surface pose after release.
Design
The place BT subtree (mj_manipulator/bt/subtrees.py:place()) currently does:
plan_to_tsr → sync → release → sync
For surface placement, it should be:
plan_to_tsr → sync → guarded_move_down → sync → release → sync
This requires GeneratePlaceTSRs to signal whether the placement is a container drop (no guarded move needed) or a surface placement (guarded move needed). Options:
- Blackboard flag:
{ns}/placement_type = "container" or "surface"
- Geodude-specific place subtree that inserts the guarded move step
The guarded move itself could live in mj_manipulator as a generic GuardedMoveZ BT node that moves the end-effector along -Z until F/T threshold or distance limit.
Follows from
#109 (generalized place)
Problem
Surface placement (
robot.place("worktop"),robot.place("cracker_box")) plans to a pose 5mm above the destination surface, then releases. In physics mode the object drops and settles. In kinematic mode the object floats 5mm above the surface.Solution
After reaching the clearance pose, execute a guarded move downward before releasing:
Physics mode: Move down until F/T sensor detects contact, then release. The wrist F/T sensors (added in #94) can detect when the held object touches the surface.
Kinematic mode: Move down by the clearance distance (5mm) directly, since there's no F/T feedback. Alternatively, snap the object to the surface pose after release.
Design
The place BT subtree (
mj_manipulator/bt/subtrees.py:place()) currently does:For surface placement, it should be:
This requires
GeneratePlaceTSRsto signal whether the placement is a container drop (no guarded move needed) or a surface placement (guarded move needed). Options:{ns}/placement_type="container"or"surface"The guarded move itself could live in
mj_manipulatoras a genericGuardedMoveZBT node that moves the end-effector along -Z until F/T threshold or distance limit.Follows from
#109 (generalized place)