Skip to content

Make the Push EE yaw offset a per-robot property - #109

Merged
amburger66 merged 4 commits into
masterfrom
fix-panda-push-yaw
Jul 31, 2026
Merged

Make the Push EE yaw offset a per-robot property#109
amburger66 merged 4 commits into
masterfrom
fix-panda-push-yaw

Conversation

@amburger66

Copy link
Copy Markdown

Problem

Which face of the gripper leads into the pushed object is a fact about the hand, not the task — but it was a single global flag, skill_push_ee_yaw_offset = 0.0, tuned for the Fetch.

On the Franka that 0.0 turns the Franka Hand so its body reaches the domino before the intended contact face does. It wedges into the block and launches it rather than tipping it — which still satisfies Toppled, so it reads as a success in logs. Caught by rendering the push on a captured domino scene.

Fix

  • SingleArmPyBulletRobot.push_ee_yaw_offset — new property, defaults to 0.0 (side push, the Fetch-verified behavior).
  • PandaPyBulletRobot overrides it with np.pi / 2 (front push, knuckles spanning the object's face).
  • skill_push_ee_yaw_offset becomes None; when set it still forces one offset for every robot, so the two can be compared.
  • push.py resolves via a small resolve_ee_yaw_offset(config) helper.

Blast radius

pybullet_robot defaults to "fetch" and only the domino_real env config selects "panda", so coffee / fan / boil are unchanged (0.0 before and after).

Verification

  • Replay of a push on the start domino of a captured scene, with no override: reproduces the front push rather than the side push.
  • mypy, pylint, yapf, isort, docformatter clean.
  • tests/test_skill_factories.py, tests/pybullet_helpers/robots/test_panda.py, tests/envs/test_pybullet_domino_{composed,real}.py, tests/ground_truth_models, tests/test_skill_factories_integration.py — all pass.

Which face of the gripper leads into the pushed object is a fact about
the hand, not the task, but it was a single global flag
(skill_push_ee_yaw_offset = 0.0) tuned for the Fetch. On the Franka that
0.0 turns the Franka Hand so its body reaches the domino before the
intended contact face does: it wedges into the block and launches it
instead of tipping it, which still sets Toppled and so reads as a
success.

SingleArmPyBulletRobot.push_ee_yaw_offset now defaults to the Fetch's
side push (0.0) and the Panda overrides it with the front push (pi/2).
skill_push_ee_yaw_offset becomes None and, when set, still forces one
offset for every robot so the two can be compared.

Verified by rendering both pushes on a captured domino scene: with no
override the Panda now reproduces the front push.

Blast radius: pybullet_robot defaults to "fetch" and only the
domino_real env config selects "panda", so coffee/fan/boil are
unchanged.
@amburger66
amburger66 force-pushed the fix-panda-push-yaw branch from 3b9eeca to 369bf43 Compare July 31, 2026 15:58
@amburger66 amburger66 self-assigned this Jul 31, 2026
@amburger66
amburger66 marked this pull request as ready for review July 31, 2026 16:00

@yichao-liang yichao-liang left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! I used a side push rather than a front push for Fetch because it resulted in fewer collisions. But I guess the shape of the Panda’s gripper makes side pushing difficult?

@amburger66
amburger66 merged commit 2a8e94c into master Jul 31, 2026
14 checks passed
@amburger66

Copy link
Copy Markdown
Author

I think they're both side pushes... I think the coordinate axes of the Panda hand and the Fetch gripper may be different

@amburger66
amburger66 deleted the fix-panda-push-yaw branch July 31, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants