in gym_genesis/tasks/cube_stack.py [0:0]
def reset(self):
B = self.num_envs
z = 0.02
quat = torch.tensor([0, 0, 0, 1], dtype=torch.float32, device=gs.device).repeat(B, 1)
# === Reset cube_1 (to be picked) ===
x1 = self._random.uniform(0.45, 0.75, size=(B,))
y1 = self._random.uniform(-0.2, 0.2, size=(B,))
pos1 = torch.tensor(np.stack([x1, y1, np.full(B, z)], axis=1), dtype=torch.float32, device=gs.device)
self.cube_1.set_pos(pos1)
self.cube_1.set_quat(quat)
# === Reset cube_2 (target) ===
x2 = self._random.uniform(0.3, 0.7, size=(B,))
y2 = self._random.uniform(-0.3, 0.3, size=(B,))
pos2 = torch.tensor(np.stack([x2, y2, np.full(B, z)], axis=1), dtype=torch.float32, device=gs.device)
self.cube_2.set_pos(pos2)
self.cube_2.set_quat(quat)
# === Distractor cubes ===
if hasattr(self, "distractor_cubes"):
for cube in self.distractor_cubes:
xd = self._random.uniform(0.3, 0.7, size=(B,))
yd = self._random.uniform(-0.3, 0.3, size=(B,))
pos_d = torch.tensor(np.stack([xd, yd, np.full(B, z)], axis=1), dtype=torch.float32, device=gs.device)
cube.set_pos(pos_d)
cube.set_quat(quat)
# === Reset robot to home pose ===
qpos = np.array([0.0, -0.4, 0.0, -2.2, 0.0, 2.0, 0.8, 0.04, 0.04])
qpos_tensor = torch.tensor(qpos, dtype=torch.float32, device=gs.device).repeat(B, 1)
self.franka.set_qpos(qpos_tensor, zero_velocity=True)
self.franka.control_dofs_position(qpos_tensor[:, :7], self.motors_dof)
self.franka.control_dofs_position(qpos_tensor[:, 7:], self.fingers_dof)
# === Optional control stability tweaks ===
self.franka.set_dofs_kp(np.array([4500, 4500, 3500, 3500, 2000, 2000, 2000, 100, 100]))
self.franka.set_dofs_kv(np.array([450, 450, 350, 350, 200, 200, 200, 10, 10]))
self.franka.set_dofs_force_range(
np.array([-87] * 7 + [-100, -100]),
np.array([87] * 7 + [100, 100]),
)
self.scene.step()
if self.enable_pixels:
self.cam.start_recording()
return self.get_obs()