def get_key(input_dict: Dict[str, Any]) -> Tuple[float, float, int, int]: if "x" in input_dict: x = input_dict["x"] z = input_dict["z"] rot = input_dict["rotation"] hor = input_dict["horizon"] else: x = input_dict["position"]["x"] z = input_dict["position"]["z"] rot = input_dict["rotation"]["y"] hor = input_dict["cameraHorizon"] return ( round(x, 2), round(z, 2), round_to_factor(rot, 90) % 360, round_to_factor(hor, 30) % 360, )
def _add_from_to_edge( self, g: nx.DiGraph, s: Tuple[float, float, int, int], t: Tuple[float, float, int, int], ): def ae(x, y): return abs(x - y) < 0.001 s_x, s_z, s_rot, s_hor = s t_x, t_z, t_rot, t_hor = t dist = round(math.sqrt((s_x - t_x) ** 2 + (s_z - t_z) ** 2), 2) angle_dist = (round_to_factor(t_rot - s_rot, 90) % 360) // 90 horz_dist = (round_to_factor(t_hor - s_hor, 30) % 360) // 30 # If source and target differ by more than one action, continue if sum(x != 0 for x in [dist, angle_dist, horz_dist]) != 1: return grid_size = self._grid_size action = None if angle_dist != 0: if angle_dist == 1: action = "RotateRight" elif angle_dist == 3: action = "RotateLeft" elif horz_dist != 0: if horz_dist == 11: action = "LookUp" elif horz_dist == 1: action = "LookDown" elif ae(dist, grid_size): if ( (s_rot == 0 and ae(t_z - s_z, grid_size)) or (s_rot == 90 and ae(t_x - s_x, grid_size)) or (s_rot == 180 and ae(t_z - s_z, -grid_size)) or (s_rot == 270 and ae(t_x - s_x, -grid_size)) ): g.add_edge(s, t, action="MoveAhead") if action is not None: g.add_edge(s, t, action=action)
def query_expert(self, **kwargs) -> Tuple[int, bool]: target = self.task_info["object_type"] if self._is_goal_object_visible(): return self.class_action_names().index(END), True else: key = (self.env.scene_name, target) if self._subsampled_locations_from_which_obj_visible is None: if key not in self._CACHED_LOCATIONS_FROM_WHICH_OBJECT_IS_VISIBLE: obj_ids: List[str] = [] obj_ids.extend( o["objectId"] for o in self.env.last_event.metadata["objects"] if o["objectType"] == target) assert len( obj_ids) != 0, "No objects to get an expert path to." locations_from_which_object_is_visible: List[Tuple[ float, float, int, int]] = [] y = self.env.last_event.metadata["agent"]["position"]["y"] positions_to_check_interactionable_from = [{ "x": x, "y": y, "z": z } for x, z in set( (x, z) for x, z, _, _ in self.env.graph.nodes)] for obj_id in set(obj_ids): self.env.controller.step({ "action": "PositionsFromWhichItemIsInteractable", "objectId": obj_id, "positions": positions_to_check_interactionable_from, }) assert ( self.env.last_action_success ), "Could not get positions from which item was interactable." returned = self.env.last_event.metadata["actionReturn"] locations_from_which_object_is_visible.extend(( round(x, 2), round(z, 2), round_to_factor(rot, 90) % 360, round_to_factor(hor, 30) % 360, ) for x, z, rot, hor, standing in zip( returned["x"], returned["z"], returned["rotation"], returned["horizon"], returned["standing"], ) if standing == 1) self._CACHED_LOCATIONS_FROM_WHICH_OBJECT_IS_VISIBLE[ key] = locations_from_which_object_is_visible self._subsampled_locations_from_which_obj_visible = self._CACHED_LOCATIONS_FROM_WHICH_OBJECT_IS_VISIBLE[ key] if len(self._subsampled_locations_from_which_obj_visible) > 5: self._subsampled_locations_from_which_obj_visible = random.sample( self. _CACHED_LOCATIONS_FROM_WHICH_OBJECT_IS_VISIBLE[key], 5) current_loc_key = self.env.get_key( self.env.last_event.metadata["agent"]) paths = [] for goal_key in self._subsampled_locations_from_which_obj_visible: path = self.env.shortest_state_path( source_state_key=current_loc_key, goal_state_key=goal_key) if path is not None: paths.append(path) if len(paths) == 0: return 0, False shortest_path_ind = int(np.argmin([len(p) for p in paths])) if len(paths[shortest_path_ind]) == 1: warnings.warn( "Shortest path computations suggest we are at the target but episode does not think so." ) return 0, False next_key_on_shortest_path = paths[shortest_path_ind][1] return ( self.class_action_names().index( self.env.action_transitioning_between_keys( current_loc_key, next_key_on_shortest_path)), True, )