Make the Push EE yaw offset a per-robot property - #109
Merged
Conversation
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.
…/predicators into fix-panda-push-yaw
amburger66
force-pushed
the
fix-panda-push-yaw
branch
from
July 31, 2026 15:58
3b9eeca to
369bf43
Compare
amburger66
marked this pull request as ready for review
July 31, 2026 16:00
yichao-liang
approved these changes
Jul 31, 2026
yichao-liang
left a comment
Collaborator
There was a problem hiding this comment.
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?
Author
|
I think they're both side pushes... I think the coordinate axes of the Panda hand and the Fetch gripper may be different |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 to0.0(side push, the Fetch-verified behavior).PandaPyBulletRobotoverrides it withnp.pi / 2(front push, knuckles spanning the object's face).skill_push_ee_yaw_offsetbecomesNone; when set it still forces one offset for every robot, so the two can be compared.push.pyresolves via a smallresolve_ee_yaw_offset(config)helper.Blast radius
pybullet_robotdefaults to"fetch"and only thedomino_realenv config selects"panda", so coffee / fan / boil are unchanged (0.0before and after).Verification
mypy,pylint,yapf,isort,docformatterclean.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.