in habitat_extensions/measures.py [0:0]
def _get_mesh_occupancy(self):
agent_position = self.current_episode.start_position
agent_rotation = quaternion_xyzw_to_wxyz(self.current_episode.start_rotation)
a_x, a_y = maps.to_grid(
agent_position[0],
agent_position[2],
self._coordinate_min,
self._coordinate_max,
self._map_resolution,
)
# The map size here represents size around the agent, not infront.
mrange = int(self.map_size * 1.5 / 2.0)
# Add extra padding if map range is coordinates go out of bounds
y_start = a_y - mrange
y_end = a_y + mrange
x_start = a_x - mrange
x_end = a_x + mrange
x_l_pad, y_l_pad, x_r_pad, y_r_pad = 0, 0, 0, 0
H, W = self._top_down_map.shape
if x_start < 0:
x_l_pad = int(-x_start)
x_start += x_l_pad
x_end += x_l_pad
if x_end >= W:
x_r_pad = int(x_end - W + 1)
if y_start < 0:
y_l_pad = int(-y_start)
y_start += y_l_pad
y_end += y_l_pad
if y_end >= H:
y_r_pad = int(y_end - H + 1)
ego_map = np.pad(self._top_down_map, ((y_l_pad, y_r_pad), (x_l_pad, x_r_pad)))
ego_map = ego_map[y_start : (y_end + 1), x_start : (x_end + 1)]
if ego_map.shape[0] == 0 or ego_map.shape[1] == 0:
ego_map = np.zeros((2 * mrange + 1, 2 * mrange + 1), dtype=np.uint8)
# Rotate to get egocentric map
# Negative since the value returned is clockwise rotation about Y,
# but we need anti-clockwise rotation
agent_heading = -compute_heading_from_quaternion(agent_rotation)
agent_heading = math.degrees(agent_heading)
half_size = ego_map.shape[0] // 2
center = (half_size, half_size)
M = cv2.getRotationMatrix2D(center, agent_heading, scale=1.0)
ego_map = cv2.warpAffine(
ego_map,
M,
(ego_map.shape[1], ego_map.shape[0]),
flags=cv2.INTER_NEAREST,
borderMode=cv2.BORDER_CONSTANT,
borderValue=(1,),
)
ego_map = ego_map.astype(np.float32)
mrange = int(self.map_size / 2.0)
start_coor = half_size - mrange
end_coor = int(start_coor + self.map_size - 1)
ego_map = ego_map[start_coor : (end_coor + 1), start_coor : (end_coor + 1)]
# This map is currently 0 if occupied and 1 if unoccupied. Flip it.
ego_map = 1.0 - ego_map
# Flip the x axis because to_grid() flips the conventions
ego_map = np.flip(ego_map, axis=1)
# Append explored status in the 2nd channel
ego_map = np.stack([ego_map, np.ones_like(ego_map)], axis=2)
return ego_map