Skip to content

Commit ad51d89

Browse files
Added support for controlling the gripper with the pygame interface of gamepad
Minor modifications in gym_manipulator to quantize the gripper actions clamped the observations after F.resize in ConvertToLeRobotObservation wrapper due to a bug in F.resize, images were returned exceeding the maximum value of 1.0
1 parent d87d640 commit ad51d89

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

lerobot/scripts/server/end_effector_control_utils.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,25 @@ def update(self):
258258
elif event.button == 0:
259259
self.episode_end_status = "rerecord_episode"
260260

261+
# RB button (6) for opening gripper
262+
elif event.button == 6:
263+
self.open_gripper_command = True
264+
265+
# LT button (7) for closing gripper
266+
elif event.button == 7:
267+
self.close_gripper_command = True
268+
261269
# Reset episode status on button release
262270
elif event.type == pygame.JOYBUTTONUP:
263271
if event.button in [0, 2, 3]:
264272
self.episode_end_status = None
265273

274+
elif event.button == 6:
275+
self.open_gripper_command = False
276+
277+
elif event.button == 7:
278+
self.close_gripper_command = False
279+
266280
# Check for RB button (typically button 5) for intervention flag
267281
if self.joystick.get_button(5):
268282
self.intervention_flag = True
@@ -298,10 +312,6 @@ def get_deltas(self):
298312
logging.error("Error reading gamepad. Is it still connected?")
299313
return 0.0, 0.0, 0.0
300314

301-
def should_intervene(self):
302-
"""Return True if intervention flag was set."""
303-
return self.intervention_flag
304-
305315

306316
class GamepadControllerHID(InputController):
307317
"""Generate motion deltas from gamepad input using HIDAPI."""
@@ -471,10 +481,6 @@ def should_save(self):
471481
"""Return True if save button was pressed."""
472482
return self.save_requested
473483

474-
def should_intervene(self):
475-
"""Return True if intervention flag was set."""
476-
return self.intervention_flag
477-
478484

479485
def test_forward_kinematics(robot, fps=10):
480486
logging.info("Testing Forward Kinematics")

lerobot/scripts/server/gym_manipulator.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,8 @@ def step(self, action):
552552

553553
obs[k] = F.crop(obs[k], *self.crop_params_dict[k])
554554
obs[k] = F.resize(obs[k], self.resize_size)
555+
# TODO(michel-aractingi): Bug in resize, it returns values outside [0, 1]
556+
obs[k] = obs[k].clamp(0.0, 1.0)
555557

556558
# Check for NaNs after processing
557559
if torch.isnan(obs[k]).any():
@@ -569,6 +571,7 @@ def reset(self, seed=None, options=None):
569571
obs[k] = obs[k].cpu()
570572
obs[k] = F.crop(obs[k], *self.crop_params_dict[k])
571573
obs[k] = F.resize(obs[k], self.resize_size)
574+
obs[k] = obs[k].clamp(0.0, 1.0)
572575
obs[k] = obs[k].to(device)
573576
return obs, info
574577

@@ -588,7 +591,7 @@ def observation(self, observation):
588591
key: observation[key].to(self.device, non_blocking=self.device.type == "cuda")
589592
for key in observation
590593
}
591-
observation = {k: torch.tensor(v, device=self.device) for k, v in observation.items()}
594+
592595
return observation
593596

594597

@@ -817,7 +820,14 @@ def action(self, action):
817820
fk_func=self.fk_function,
818821
)
819822
if self.use_gripper:
820-
gripper_command = gripper_command * MAX_GRIPPER_COMMAND
823+
# Quantize gripper command to -1, 0 or 1
824+
if gripper_command < -0.2:
825+
gripper_command = -1.0
826+
elif gripper_command > 0.2:
827+
gripper_command = 1.0
828+
else:
829+
gripper_command = 0.0
830+
821831
gripper_state = self.unwrapped.robot.follower_arms["main"].read("Present_Position")[-1]
822832
gripper_action = np.clip(gripper_state + gripper_command, 0, MAX_GRIPPER_COMMAND)
823833
target_joint_pos[-1] = gripper_action
@@ -1248,7 +1258,6 @@ def record_dataset(env, policy, cfg):
12481258

12491259
# Process observation for dataset
12501260
obs = {k: v.cpu().squeeze(0).float() for k, v in obs.items()}
1251-
obs["observation.images.side"] = torch.clamp(obs["observation.images.side"], 0, 1)
12521261

12531262
# Add frame to dataset
12541263
frame = {**obs, **recorded_action}

0 commit comments

Comments
 (0)