in gym_genesis/tasks/cube_stack.py [0:0]
def _build_scene(self, num_envs, env_spacing):
if not gs._initialized:
gs.init(backend=gs.gpu, precision="32")
self.scene = gs.Scene(
sim_options=gs.options.SimOptions(dt=0.01),
rigid_options=gs.options.RigidOptions(box_box_detection=True),
show_viewer=False,
)
self.plane = self.scene.add_entity(gs.morphs.Plane())
# === Main task cubes ===
self.cube_1 = self.scene.add_entity(
gs.morphs.Box(
size=(0.04, 0.04, 0.04),
pos=(0.6, -0.1, 0.02),
),
surface=gs.surfaces.Plastic(color=(1, 0, 0)),
)
self.cube_2 = self.scene.add_entity(
gs.morphs.Box(
size=(0.04, 0.04, 0.04),
pos=(0.45, 0.15, 0.02),
),
surface=gs.surfaces.Plastic(color=(0, 1, 0)),
)
# === Distractor cubes ===
self.distractor_cubes = []
for _ in range(3): # add 3 distractors (shared across batched envs)
xy = np.random.uniform(low=[0.3, -0.3], high=[0.7, 0.3])
cube = self.scene.add_entity(
gs.morphs.Box(
size=(0.04, 0.04, 0.04),
pos=(xy[0], xy[1], 0.02), # dummy, randomized in reset()
),
surface=gs.surfaces.Plastic(color=(0.5, 0.5, 0.5)), # gray
)
self.distractor_cubes.append(cube)
# === Franka arm ===
self.franka = self.scene.add_entity(
gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml"),
vis_mode="collision",
)
if self.enable_pixels:
self.cam = self.scene.add_camera(
res=(self.observation_width, self.observation_height),
pos=(3.5, 0.0, 2.5),
lookat=(0, 0, 0.5),
fov=30,
GUI=False
)
self.scene.build(n_envs=num_envs, env_spacing=env_spacing)
self.motors_dof = np.arange(7)
self.fingers_dof = np.arange(7, 9)
self.eef = self.franka.get_link("hand")