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." )
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
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
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.")
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