in gym_genesis/tasks/cube_stack.py [0:0]
def get_obs(self):
eef_pos = self.eef.get_pos() # (B, 3)
eef_rot = self.eef.get_quat() # (B, 4)
gripper = self.franka.get_dofs_position()[:, 7:9] # (B, 2)
cube1_pos = self.cube_1.get_pos() # (B, 3)
cube1_rot = self.cube_1.get_quat() # (B, 4)
cube2_pos = self.cube_2.get_pos() # (B, 3)
diff = eef_pos - cube1_pos # (B, 3)
dist = torch.norm(diff, dim=1, keepdim=True) # (B, 1) (privileged)
agent_pos = torch.cat([eef_pos, eef_rot, gripper], dim=1).float() # (B, 9)
environment_state = torch.cat([cube1_pos, cube1_rot, diff, dist, cube2_pos], dim=1).float() # (B, 14)
obs = {
"agent_pos": agent_pos,
"environment_state": environment_state,
}
if self.enable_pixels:
#TODO (jadechoghari): it's hacky but keep it for the sake of saving time
if self.strip_environment_state is True:
del obs["environment_state"]
if self.camera_capture_mode == "per_env":
# Capture a separate image for each environment
batch_imgs = []
for i in range(self.num_envs):
pos_i = self.scene.envs_offset[i] + np.array([3.5, 0.0, 2.5])
lookat_i = self.scene.envs_offset[i] + np.array([0, 0, 0.5])
self.cam.set_pose(pos=pos_i, lookat=lookat_i)
img = self.cam.render()[0]
batch_imgs.append(img)
pixels = np.stack(batch_imgs, axis=0) # shape: (B, H, W, 3)
assert pixels.ndim == 4, f"pixels shape {pixels.shape} is not 4D (B, H, W, 3)"
elif self.camera_capture_mode == "global":
# Capture a single global/overview image
pixels = self.cam.render()[0] # shape: (H, W, 3)
assert pixels.ndim == 3, f"pixels shape {pixels.shape} is not 3D (H, W, 3)"
else:
raise ValueError(f"Unknown camera_capture_mode: {self.camera_capture_mode}")
obs["pixels"] = pixels
return obs