def reconfigure(self, config) -> None: dataset = config.SCENE.split('/')[2] scene_name = config.SCENE.split('/')[3] is_same_scene = config.SCENE == self._current_scene self.config = config self.sim_config = self.create_sim_config(self._sensor_suite) if not is_same_scene: self._current_scene = config.SCENE self._sim.close() del self._sim # HabitatSim is a wrapper class of habitat_sim, which is the backend renderer self._sim = habitat_sim.Simulator(self.sim_config) logging.info('Loaded scene {}'.format(scene_name)) if not is_same_scene or self.points is None or self.graph is None: # can happen during initialization or reconfiguration metadata_dir = os.path.join('data/metadata', dataset, scene_name) self.points, self.graph = load_metadata(metadata_dir) # after env calls reconfigure to update the config with current episode, # simulation needs to update the agent position, rotation in accordance with the new config file self._update_agents_state() # set agent positions self._receiver_position_index = self._position_to_index(self.config.AGENT_0.START_POSITION) self._source_position_index = self._position_to_index(self.config.AGENT_0.GOAL_POSITION) self._rotation = int(np.around(np.rad2deg(quat_to_angle_axis(quat_from_coeffs( self.config.AGENT_0.START_ROTATION))[0]))) % 360 self.set_agent_state(list(self.graph.nodes[self._receiver_position_index]['point']), self.config.AGENT_0.START_ROTATION) logging.debug("Initial source, agent at: {}, {}, orientation: {}". format(self._source_position_index, self._receiver_position_index, self._rotation))
def to_angle(rot): agent_rot = hutil.quat_to_angle_axis(rot) # sometimes? reports 2pi rotation around x axis if no rotation if agent_rot[1][1] == 0: return 0 else: return (agent_rot[0] * agent_rot[1][1]) % (2 * np.pi)
def reconfigure(self, config: Config) -> None: self.config = config is_same_sound = config.AGENT_0.SOUND_ID == self._current_sound if not is_same_sound: self._current_sound = self.config.AGENT_0.SOUND_ID is_same_scene = config.SCENE == self._current_scene if not is_same_scene: self._current_scene = config.SCENE logging.debug('Current scene: {} and sound: {}'.format(self.current_scene_name, self._current_sound)) if not self.config.USE_RENDERED_OBSERVATIONS: self._sim.close() del self._sim self.sim_config = self.create_sim_config(self._sensor_suite) self._sim = habitat_sim.Simulator(self.sim_config) self._update_agents_state() self._frame_cache = dict() else: with open(self.current_scene_observation_file, 'rb') as fo: self._frame_cache = pickle.load(fo) logging.debug('Loaded scene {}'.format(self.current_scene_name)) self.points, self.graph = load_metadata(self.metadata_dir) for node in self.graph.nodes(): self._position_to_index_mapping[self.position_encoding(self.graph.nodes()[node]['point'])] = node if not is_same_scene or not is_same_sound: self._audiogoal_cache = dict() self._spectrogram_cache = dict() self._episode_step_count = 0 # set agent positions self._receiver_position_index = self._position_to_index(self.config.AGENT_0.START_POSITION) self._source_position_index = self._position_to_index(self.config.AGENT_0.GOAL_POSITION) # the agent rotates about +Y starting from -Z counterclockwise, # so rotation angle 90 means the agent rotate about +Y 90 degrees self._rotation_angle = int(np.around(np.rad2deg(quat_to_angle_axis(quat_from_coeffs( self.config.AGENT_0.START_ROTATION))[0]))) % 360 if not self.config.USE_RENDERED_OBSERVATIONS: self.set_agent_state(list(self.graph.nodes[self._receiver_position_index]['point']), self.config.AGENT_0.START_ROTATION) else: self._sim.set_agent_state(list(self.graph.nodes[self._receiver_position_index]['point']), quat_from_coeffs(self.config.AGENT_0.START_ROTATION)) logging.debug("Initial source, agent at: {}, {}, orientation: {}". format(self._source_position_index, self._receiver_position_index, self.get_orientation()))
def reconfigure(self, config: Config) -> None: self.config = config if hasattr(self.config.AGENT_0, 'OFFSET'): self._offset = int(self.config.AGENT_0.OFFSET) else: self._offset = 0 if self.config.AUDIO.EVERLASTING: self._duration = 500 else: assert hasattr(self.config.AGENT_0, 'DURATION') self._duration = int(self.config.AGENT_0.DURATION) self._audio_index = 0 is_same_sound = config.AGENT_0.SOUND_ID == self._current_sound if not is_same_sound: self._current_sound = self.config.AGENT_0.SOUND_ID self._load_single_source_sound() logging.debug("Switch to sound {} with duration {} seconds".format(self._current_sound, self._duration)) is_same_scene = config.SCENE == self._current_scene if not is_same_scene: self._current_scene = config.SCENE logging.debug('Current scene: {} and sound: {}'.format(self.current_scene_name, self._current_sound)) if self.config.USE_RENDERED_OBSERVATIONS: with open(self.current_scene_observation_file, 'rb') as fo: self._frame_cache = pickle.load(fo) else: self._sim.close() del self._sim self.sim_config = self.create_sim_config(self._sensor_suite) self._sim = habitat_sim.Simulator(self.sim_config) self._update_agents_state() self._frame_cache = dict() logging.debug('Loaded scene {}'.format(self.current_scene_name)) self.points, self.graph = load_metadata(self.metadata_dir) for node in self.graph.nodes(): self._position_to_index_mapping[self.position_encoding(self.graph.nodes()[node]['point'])] = node self._instance2label_mapping = None if not is_same_scene or not is_same_sound: self._audiogoal_cache = dict() self._spectrogram_cache = dict() self._episode_step_count = 0 # set agent positions self._receiver_position_index = self._position_to_index(self.config.AGENT_0.START_POSITION) self._source_position_index = self._position_to_index(self.config.AGENT_0.GOAL_POSITION) # the agent rotates about +Y starting from -Z counterclockwise, # so rotation angle 90 means the agent rotate about +Y 90 degrees self._rotation_angle = int(np.around(np.rad2deg(quat_to_angle_axis(quat_from_coeffs( self.config.AGENT_0.START_ROTATION))[0]))) % 360 if self.config.USE_RENDERED_OBSERVATIONS: self._sim.set_agent_state(list(self.graph.nodes[self._receiver_position_index]['point']), quat_from_coeffs(self.config.AGENT_0.START_ROTATION)) else: self.set_agent_state(list(self.graph.nodes[self._receiver_position_index]['point']), self.config.AGENT_0.START_ROTATION) if self.config.AUDIO.HAS_DISTRACTOR_SOUND: self._distractor_position_index = self.config.AGENT_0.DISTRACTOR_POSITION_INDEX self._current_distractor_sound = self.config.AGENT_0.DISTRACTOR_SOUND_ID self._load_single_distractor_sound() if self._use_oracle_planner: self._oracle_actions = self.compute_oracle_actions() logging.debug("Initial source, agent at: {}, {}, orientation: {}". format(self._source_position_index, self._receiver_position_index, self.get_orientation()))