Exemplo n.º 1
0
 def get_observation(
     self,
     observations,
     *args: Any,
     episode: NavigationEpisode,
     **kwargs: Any,
 ) -> Optional[int]:
     if self.config.GOAL_SPEC == "TASK_CATEGORY_ID":
         if len(episode.goals) == 0:
             logger.error(
                 f"No goal specified for episode {episode.episode_id}."
             )
             return None
         if not isinstance(episode.goals[0], ObjectGoal):
             logger.error(
                 f"First goal should be ObjectGoal, episode {episode.episode_id}."
             )
             return None
         category_name = episode.goals[0].object_category
         return np.array(
             [self._dataset.category_to_task_category_id[category_name]],
             dtype=np.int64,
         )
     elif self.config.GOAL_SPEC == "OBJECT_ID":
         return np.array([episode.goals[0].object_name_id], dtype=np.int64)
     else:
         raise RuntimeError(
             "Wrong GOAL_SPEC specified for ObjectGoalSensor."
         )
Exemplo n.º 2
0
    def update_metric(
        self, episode: NavigationEpisode, *args: Any, **kwargs: Any
    ):
        current_position = self._sim.get_agent_state().position

        if self._previous_position is None or not np.allclose(
            self._previous_position, current_position, atol=1e-4
        ):
            if self._config.DISTANCE_TO == "POINT":
                distance_to_target = self._sim.geodesic_distance(
                    current_position,
                    [goal.position for goal in episode.goals],
                    episode,
                )
            elif self._config.DISTANCE_TO == "VIEW_POINTS":
                distance_to_target = self._sim.geodesic_distance(
                    current_position, self._episode_view_points, episode
                )
            else:
                logger.error(
                    f"Non valid DISTANCE_TO parameter was provided: {self._config.DISTANCE_TO}"
                )

            self._previous_position = current_position
            self._metric = distance_to_target
Exemplo n.º 3
0
    def update_metric(self, episode: Episode, task: EmbodiedTask, *args: Any,
                      **kwargs: Any):
        current_position = self._sim.get_agent_state().position

        if self.goal_idx == -1: self.goal_idx = 0
        else:
            self.goal_idx = task.measurements.measures[
                GoalIndex.cls_uuid].get_metric()['curr_goal_index']

        if self._previous_position is None or not np.allclose(
                self._previous_position, current_position, atol=1e-4):
            if self._config.DISTANCE_TO == "POINT":
                distance_to_target = self._sim.geodesic_distance(
                    current_position,
                    episode.goals[self.goal_idx].position,
                    episode,
                )
            elif self._config.DISTANCE_TO == "VIEW_POINTS":
                distance_to_target = self._sim.geodesic_distance(
                    current_position, self._episode_view_points, episode)
            else:
                logger.error(
                    f"Non valid DISTANCE_TO parameter was provided: {self._config.DISTANCE_TO}"
                )

            self._previous_position = current_position
            self._metric = distance_to_target
Exemplo n.º 4
0
 def get_observation(
     self,
     observations,
     *args: Any,
     episode: ObjectGoalNavEpisode,
     **kwargs: Any,
 ) -> Optional[int]:
     if self.config.GOAL_SPEC == "TASK_CATEGORY_ID":
         if len(episode.goals) == 0:
             logger.error(
                 f"No goal specified for episode {episode.episode_id}.")
             return None
         if not isinstance(episode.goals[0], ObjectGoal):
             logger.error(
                 f"First goal should be ObjectGoal, episode {episode.episode_id}."
             )
             return None
         category_name = episode.object_category
         return np.array(
             [self._dataset.category_to_task_category_id[category_name]],
             dtype=np.int64,
         )
     elif self.config.GOAL_SPEC == "OBJECT_ID":
         return np.array([episode.goals[0].object_name_id], dtype=np.int64)
     elif self.config.GOAL_SPEC == "OBJECT_IMG":
         episode_id = episode.episode_id
         scene_id = episode.scene_id
         if (self.curr_episode_id != episode_id) and (self.curr_scene_id !=
                                                      scene_id):
             closest = episode.info['closest_goal_object_id']
             for goal in episode.goals:
                 if goal.object_id == int(closest):
                     viewpoint = goal.view_points[0].agent_state
                     break
             obs = self._sim.get_observations_at(
                 episode.info['best_viewpoint_position'],
                 viewpoint.rotation)
             rgb_array = obs['rgb'] / 255.0
             depth_array = obs['depth']
             category_array = np.ones_like(
                 depth_array) * self._dataset.category_to_task_category_id[
                     episode.object_category]
             self.goal_obs = np.concatenate(
                 [rgb_array, depth_array, category_array], 2)
             self.curr_episode_id = episode_id
             self.curr_scene_id = scene_id
         return self.goal_obs
     else:
         raise RuntimeError(
             "Wrong GOAL_SPEC specified for ObjectGoalSensor.")
Exemplo n.º 5
0
    def update_metric(self, episode, *args: Any, **kwargs: Any):
        current_position = self._sim.get_agent_state().position.tolist()

        if self._config.DISTANCE_TO == "POINT":
            distance_to_target = self._sim.geodesic_distance(
                current_position, [goal.position for goal in episode.goals])
        elif self._config.DISTANCE_TO == "VIEW_POINTS":
            distance_to_target = self._sim.geodesic_distance(
                current_position, self._episode_view_points)
        else:
            logger.error(
                f"Non valid DISTANCE_TO parameter was provided: {self._config.DISTANCE_TO}"
            )

        self._agent_episode_distance += self._euclidean_distance(
            current_position, self._previous_position)

        self._previous_position = current_position

        self._metric = distance_to_target