in occant_baselines/generate_topdown_maps/generate_occant_gt_maps.py [0:0]
def get_episode_map(env, mapper, M, config, device):
"""Given the environment and the configuration, compute the global
top-down wall and seen area maps by sampling maps for individual locations
along a uniform grid in the environment, and registering them.
"""
# Initialize a global map for the episode
global_wall_map = torch.zeros(1, 2, M, M).to(device)
global_seen_map = torch.zeros(1, 2, M, M).to(device)
grid_size = config.TASK.GT_EGO_MAP.MAP_SCALE
coordinate_max = maps.COORDINATE_MAX
coordinate_min = maps.COORDINATE_MIN
resolution = (coordinate_max - coordinate_min) / grid_size
grid_resolution = (int(resolution), int(resolution))
top_down_map = maps.get_topdown_map(
env.habitat_env.sim, grid_resolution, 20000, draw_border=False,
)
map_w, map_h = top_down_map.shape
intervals = (max(int(0.5 / grid_size), 1), max(int(0.5 / grid_size), 1))
x_vals = np.arange(0, map_w, intervals[0], dtype=int)
y_vals = np.arange(0, map_h, intervals[1], dtype=int)
coors = np.stack(np.meshgrid(x_vals, y_vals), axis=2) # (H, W, 2)
coors = coors.reshape(-1, 2) # (H*W, 2)
map_vals = top_down_map[coors[:, 0], coors[:, 1]]
valid_coors = coors[map_vals > 0]
real_x_vals = coordinate_max - valid_coors[:, 0] * grid_size
real_z_vals = coordinate_min + valid_coors[:, 1] * grid_size
start_y = env.habitat_env.sim.get_agent_state().position[1]
for j in range(real_x_vals.shape[0]):
for theta in np.arange(-np.pi, np.pi, np.pi / 3.0):
position = [
real_x_vals[j].item(),
start_y.item(),
real_z_vals[j].item(),
]
rotation = [
0.0,
np.sin(theta / 2).item(),
0.0,
np.cos(theta / 2).item(),
]
sim_obs = env.habitat_env.sim.get_observations_at(
position, rotation, keep_agent_at_new_pose=True,
)
episode = env.habitat_env.current_episode
obs = env.habitat_env.task.sensor_suite.get_observations(
observations=sim_obs, episode=episode, task=env.habitat_env.task
)
ego_map_gt = torch.Tensor(obs["ego_map_gt"]).to(device)
ego_map_gt = rearrange(ego_map_gt, "h w c -> () c h w")
ego_wall_map_gt = torch.Tensor(obs["ego_wall_map_gt"]).to(device)
ego_wall_map_gt = rearrange(ego_wall_map_gt, "h w c -> () c h w")
pose_gt = torch.Tensor(obs["pose_gt"]).unsqueeze(0).to(device)
global_seen_map = mapper.ext_register_map(
global_seen_map, ego_map_gt, pose_gt
)
global_wall_map = mapper.ext_register_map(
global_wall_map, ego_wall_map_gt, pose_gt
)
global_wall_map_np = asnumpy(rearrange(global_wall_map, "b c h w -> b h w c")[0])
global_seen_map_np = asnumpy(rearrange(global_seen_map, "b c h w -> b h w c")[0])
return global_seen_map_np, global_wall_map_np