diff --git a/habitat/config/default.py b/habitat/config/default.py index 8bd9189b2213f82e4f49213aaf88609d02247cf4..aaad2860ccaa43d019c2c29c5c32109261f059dd 100644 --- a/habitat/config/default.py +++ b/habitat/config/default.py @@ -42,12 +42,23 @@ _C.TASK.POINTGOAL_SENSOR.GOAL_FORMAT = "POLAR" _C.TASK.HEADING_SENSOR = CN() _C.TASK.HEADING_SENSOR.TYPE = "HeadingSensor" # ----------------------------------------------------------------------------- +# # PROXIMITY SENSOR +# ----------------------------------------------------------------------------- +_C.TASK.PROXIMITY_SENSOR = CN() +_C.TASK.PROXIMITY_SENSOR.TYPE = "ProximitySensor" +_C.TASK.PROXIMITY_SENSOR.MAX_DETECTION_RADIUS = 2.0 +# ----------------------------------------------------------------------------- # # SPL MEASUREMENT # ----------------------------------------------------------------------------- _C.TASK.SPL = CN() _C.TASK.SPL.TYPE = "SPL" _C.TASK.SPL.SUCCESS_DISTANCE = 0.2 # ----------------------------------------------------------------------------- +# # COLLISIONS MEASUREMENT +# ----------------------------------------------------------------------------- +_C.TASK.COLLISIONS = CN() +_C.TASK.COLLISIONS.TYPE = "Collisions" +# ----------------------------------------------------------------------------- # SIMULATOR # ----------------------------------------------------------------------------- _C.SIMULATOR = CN() diff --git a/habitat/core/simulator.py b/habitat/core/simulator.py index fbeaac1e96f9f72c9dbec1026b02ca849d95f05d..b2acb18f9e0dfce2fab2716db9444e4a03ecd46e 100644 --- a/habitat/core/simulator.py +++ b/habitat/core/simulator.py @@ -29,6 +29,7 @@ class SensorTypes(Enum): TEXT = 9 MEASUREMENT = 10 HEADING = 11 + TACTILE = 12 class Sensor: diff --git a/habitat/sims/habitat_simulator.py b/habitat/sims/habitat_simulator.py index 3a5311454fa39a4531e845f75549fda79c2f717d..97385c5deb10de28e13d862f36b11de313277a13 100644 --- a/habitat/sims/habitat_simulator.py +++ b/habitat/sims/habitat_simulator.py @@ -399,6 +399,10 @@ class HabitatSim(habitat.Simulator): def index_stop_action(self): return SIM_NAME_TO_ACTION[SimulatorActions.STOP.value] + @property + def index_forward_action(self): + return SIM_NAME_TO_ACTION[SimulatorActions.FORWARD.value] + def _get_agent_config(self, agent_id: Optional[int] = None) -> Any: if agent_id is None: agent_id = self.config.DEFAULT_AGENT_ID @@ -442,3 +446,8 @@ class HabitatSim(habitat.Simulator): def _check_agent_position(self, position, agent_id=0): if not np.allclose(position, self.get_agent_state(agent_id).position): logger.info("Agent state diverges from configured start position.") + + def distance_to_closest_obstacle(self, position, max_search_radius=2.0): + return self._sim.pathfinder.distance_to_closest_obstacle( + position, max_search_radius + ) diff --git a/habitat/tasks/nav/nav_task.py b/habitat/tasks/nav/nav_task.py index bf44de91943dd1fd3ea149c00ee4cf22061faac1..3f703a7df82802296f83664a6e49d1b87196fa6b 100644 --- a/habitat/tasks/nav/nav_task.py +++ b/habitat/tasks/nav/nav_task.py @@ -20,6 +20,8 @@ from habitat.core.simulator import ( ) from habitat.tasks.utils import quaternion_to_rotation, cartesian_to_polar +COLLISION_PROXIMITY_TOLERANCE: float = 1e-3 + def merge_sim_episode_config( sim_config: Config, episode: Type[Episode] @@ -240,6 +242,44 @@ class HeadingSensor(habitat.Sensor): return np.array(phi) +class ProximitySensor(habitat.Sensor): + """ + Sensor for observing the distance to the closest obstacle + + Args: + sim: reference to the simulator for calculating task observations. + config: config for the sensor. + """ + + def __init__(self, sim, config): + self._sim = sim + self._max_detection_radius = getattr( + config, "MAX_DETECTION_RADIUS", 2.0 + ) + super().__init__(config=config) + + def _get_uuid(self, *args: Any, **kwargs: Any): + return "proximity" + + def _get_sensor_type(self, *args: Any, **kwargs: Any): + return SensorTypes.TACTILE + + def _get_observation_space(self, *args: Any, **kwargs: Any): + return spaces.Box( + low=0.0, + high=self._max_detection_radius, + shape=(1,), + dtype=np.float, + ) + + def get_observation(self, observations, episode): + current_position = self._sim.get_agent_state().position + + return self._sim.distance_to_closest_obstacle( + current_position, self._max_detection_radius + ) + + class SPL(habitat.Measure): """SPL (Success weighted by Path Length) @@ -298,6 +338,33 @@ class SPL(habitat.Measure): ) +class Collisions(habitat.Measure): + def __init__(self, sim, config): + self._sim = sim + self._config = config + self._metric = None + + super().__init__() + + def _get_uuid(self, *args: Any, **kwargs: Any): + return "collisions" + + def reset_metric(self, episode): + self._metric = None + + def update_metric(self, episode, action): + if self._metric is None: + self._metric = 0 + + current_position = self._sim.get_agent_state().position + if ( + action == self._sim.index_forward_action + and self._sim.distance_to_closest_obstacle(current_position) + < COLLISION_PROXIMITY_TOLERANCE + ): + self._metric += 1 + + class NavigationTask(habitat.EmbodiedTask): def __init__( self, @@ -310,16 +377,16 @@ class NavigationTask(habitat.EmbodiedTask): for measurement_name in task_config.MEASUREMENTS: measurement_cfg = getattr(task_config, measurement_name) is_valid_measurement = hasattr( - habitat.tasks.nav.nav_task, # type: ignore - measurement_cfg.TYPE, + habitat.tasks.nav.nav_task, + measurement_cfg.TYPE, # type: ignore ) assert is_valid_measurement, "invalid measurement type {}".format( measurement_cfg.TYPE ) task_measurements.append( getattr( - habitat.tasks.nav.nav_task, # type: ignore - measurement_cfg.TYPE, + habitat.tasks.nav.nav_task, + measurement_cfg.TYPE, # type: ignore )(sim, measurement_cfg) ) self.measurements = Measurements(task_measurements) @@ -335,8 +402,10 @@ class NavigationTask(habitat.EmbodiedTask): ) task_sensors.append( getattr( - habitat.tasks.nav.nav_task, sensor_cfg.TYPE # type: ignore - )(sim, sensor_cfg) + habitat.tasks.nav.nav_task, sensor_cfg.TYPE + )( # type: ignore + sim, sensor_cfg + ) ) self.sensor_suite = SensorSuite(task_sensors) diff --git a/habitat/utils/visualizations/maps.py b/habitat/utils/visualizations/maps.py index f845cbf2ccbde8f130e9d4acbc38462bf9ea9db5..b8f226df936e3fbbc9c9d522a09e103c09c9da68 100644 --- a/habitat/utils/visualizations/maps.py +++ b/habitat/utils/visualizations/maps.py @@ -200,15 +200,6 @@ def _from_grid( return realworld_x, realworld_y -def _check_valid_nav_point(sim: Simulator, point: List[float]) -> bool: - """Checks if a given point is inside a wall or other object or not.""" - return ( - 0.01 - < sim.geodesic_distance(point, [point[0], point[1] + 0.1, point[2]]) - < 0.11 - ) - - def _outline_border(top_down_map): left_right_block_nav = (top_down_map[:, :-1] == 1) & ( top_down_map[:, :-1] != top_down_map[:, 1:] @@ -282,17 +273,17 @@ def get_topdown_map( min(range_y[-1] + padding + 1, top_down_map.shape[1]), ) top_down_map[:] = 0 + # Search over grid for valid points. for ii in range(range_x[0], range_x[1]): for jj in range(range_y[0], range_y[1]): realworld_x, realworld_y = _from_grid( ii, jj, COORDINATE_MIN, COORDINATE_MAX, map_resolution ) - valid_point = _check_valid_nav_point( - sim, [realworld_x, start_height + 0.5, realworld_y] + valid_point = sim._sim.pathfinder.is_navigable( + [realworld_x, start_height, realworld_y] ) - if valid_point: - top_down_map[ii, jj] = 1 + top_down_map[ii, jj] = 1 if valid_point else 0 # Draw border if necessary if draw_border: diff --git a/test/data/habitat-sim_trajectory_data.json b/test/data/habitat-sim_trajectory_data.json index 79e09a270743dda5dc67cbd97ca9f103b8b2fb5d..0af0fd9072db05ef86106b475b6ca2d1f44f2f98 100644 --- a/test/data/habitat-sim_trajectory_data.json +++ b/test/data/habitat-sim_trajectory_data.json @@ -1 +1 @@ -{"positions": [[2.9085702896118164, 0.07244700193405151, 0.13949552178382874], [2.692063808441162, 0.17669875919818878, 0.014495700597763062], [2.475557327270508, 0.17669875919818878, -0.11050412058830261], [2.2590508460998535, 0.17669875919818878, -0.12059974670410156], [2.042544364929199, 0.17669875919818878, -0.12059974670410156], [1.826037883758545, 0.17669875919818878, -0.12059974670410156], [1.6095314025878906, 0.17669875919818878, -0.12059974670410156], [1.3930249214172363, 0.17669875919818878, -0.12059974670410156], [1.176518440246582, 0.17669875919818878, -0.12059974670410156], [1.176518440246582, 0.17669875919818878, -0.12059974670410156], [0.941595196723938, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156]], "rotations": [[0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000003576278687, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.6427879929542542, 0.0, 0.7660441398620605], [0.0, 0.6427879929542542, 0.0, 0.7660441398620605], [0.0, 0.6427879929542542, 0.0, 0.7660441398620605], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7660449147224426, 0.0, 0.6427870988845825], [0.0, 0.7660449743270874, 0.0, 0.6427870392799377], [0.0, 0.7660449743270874, 0.0, 0.642786979675293], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403]], "actions": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3]} +{"positions": [[2.9085702896118164, 0.07244700193405151, 0.13949552178382874], [2.692063808441162, 0.17669875919818878, 0.014495700597763062], [2.475557327270508, 0.17669875919818878, -0.11050412058830261], [2.2590508460998535, 0.17669875919818878, -0.12059974670410156], [2.042544364929199, 0.17669875919818878, -0.12059974670410156], [1.826037883758545, 0.17669875919818878, -0.12059974670410156], [1.6095314025878906, 0.17669875919818878, -0.12059974670410156], [1.3930249214172363, 0.17669875919818878, -0.12059974670410156], [1.176518440246582, 0.17669875919818878, -0.12059974670410156], [1.176518440246582, 0.17669875919818878, -0.12059974670410156], [0.941595196723938, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156], [0.8741309642791748, 0.17669875919818878, -0.12059974670410156]], "rotations": [[0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000003576278687, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.5000002980232239, 0.0, 0.8660252094268799], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.5735767483711243, 0.0, 0.8191518187522888], [0.0, 0.573576807975769, 0.0, 0.8191518187522888], [0.0, 0.6427879929542542, 0.0, 0.7660441398620605], [0.0, 0.6427879929542542, 0.0, 0.7660441398620605], [0.0, 0.6427879929542542, 0.0, 0.7660441398620605], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7071071863174438, 0.0, 0.707106351852417], [0.0, 0.7660449147224426, 0.0, 0.6427870988845825], [0.0, 0.7660449743270874, 0.0, 0.6427870392799377], [0.0, 0.7660449743270874, 0.0, 0.642786979675293], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8191525340080261, 0.0, 0.5735757350921631], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403], [0.0, 0.8660258650779724, 0.0, 0.4999992549419403]], "actions": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3], "distances_to_obstacles": [null, 0.2564087510108948, 0.010195869952440262, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]} \ No newline at end of file diff --git a/test/test_sensors.py b/test/test_sensors.py index d6f8d1b503245f2c4a5802f664f8e2fc8723c59a..788bb72968e87c47ea7e9da1ccf6d00c0a12c673 100644 --- a/test/test_sensors.py +++ b/test/test_sensors.py @@ -11,11 +11,35 @@ import random import habitat from habitat.config.default import get_config -from habitat.tasks.nav.nav_task import NavigationEpisode +from habitat.tasks.nav.nav_task import ( + NavigationEpisode, + COLLISION_PROXIMITY_TOLERANCE, +) +from habitat.sims.habitat_simulator import SimulatorActions, SIM_NAME_TO_ACTION CFG_TEST = "test/habitat_all_sensors_test.yaml" +def _random_episode(env, config): + random_location = env._sim.sample_navigable_point() + random_heading = np.random.uniform(-np.pi, np.pi) + random_rotation = [ + 0, + np.sin(random_heading / 2), + 0, + np.cos(random_heading / 2), + ] + env.episodes = [ + NavigationEpisode( + episode_id="0", + scene_id=config.SIMULATOR.SCENE, + start_position=random_location, + start_rotation=random_rotation, + goals=[], + ) + ] + + def test_heading_sensor(): config = get_config(CFG_TEST) if not os.path.exists(config.SIMULATOR.SCENE): @@ -26,7 +50,8 @@ def test_heading_sensor(): config.freeze() env = habitat.Env(config=config, dataset=None) env.reset() - random.seed(1234) + random.seed(123) + np.random.seed(123) for _ in range(100): random_heading = np.random.uniform(-np.pi, np.pi) @@ -51,3 +76,83 @@ def test_heading_sensor(): assert np.allclose(heading, random_heading) env.close() + + +def test_tactile(): + config = get_config(CFG_TEST) + if not os.path.exists(config.SIMULATOR.SCENE): + pytest.skip("Please download Habitat test data to data folder.") + config = get_config() + config.defrost() + config.TASK.SENSORS = ["PROXIMITY_SENSOR"] + config.TASK.MEASUREMENTS = ["COLLISIONS"] + config.freeze() + env = habitat.Env(config=config, dataset=None) + env.reset() + random.seed(1234) + + for _ in range(20): + _random_episode(env, config) + env.reset() + assert env.get_metrics()["collisions"] is None + + my_collisions_count = 0 + action = env._sim.index_forward_action + for _ in range(10): + obs = env.step(action) + collisions = env.get_metrics()["collisions"] + proximity = obs["proximity"] + if proximity < COLLISION_PROXIMITY_TOLERANCE: + my_collisions_count += 1 + + assert my_collisions_count == collisions + + env.close() + + +def test_collisions(): + config = get_config(CFG_TEST) + if not os.path.exists(config.SIMULATOR.SCENE): + pytest.skip("Please download Habitat test data to data folder.") + config = get_config() + config.defrost() + config.TASK.MEASUREMENTS = ["COLLISIONS"] + config.freeze() + env = habitat.Env(config=config, dataset=None) + env.reset() + random.seed(123) + np.random.seed(123) + + actions = [ + SIM_NAME_TO_ACTION[SimulatorActions.FORWARD.value], + SIM_NAME_TO_ACTION[SimulatorActions.LEFT.value], + SIM_NAME_TO_ACTION[SimulatorActions.RIGHT.value], + ] + + for _ in range(20): + _random_episode(env, config) + + env.reset() + assert env.get_metrics()["collisions"] is None + + prev_collisions = 0 + prev_loc = env.sim.get_agent_state().position + for _ in range(50): + action = np.random.choice(actions) + env.step(action) + collisions = env.get_metrics()["collisions"] + + loc = env.sim.get_agent_state().position + if ( + np.linalg.norm(loc - prev_loc) + < 0.9 * config.SIMULATOR.FORWARD_STEP_SIZE + and action == actions[0] + ): + # Check to see if the new method of doing collisions catches all the same + # collisions as the old method + assert collisions == prev_collisions + 1 + + prev_loc = loc + prev_collisions = collisions + + env.close() diff --git a/test/test_trajectory_sim.py b/test/test_trajectory_sim.py index 9123cbf11666ab828c1b66897be0b2d90b972183..db448bc9dd4b9d710821a112b86b156aec1c9c19 100644 --- a/test/test_trajectory_sim.py +++ b/test/test_trajectory_sim.py @@ -54,6 +54,15 @@ def test_sim_trajectory(): ) is True ), "mismatch in rotation " "at step {}".format(i) + + max_search_radius = 2.0 + dist_to_obs = sim.distance_to_closest_obstacle( + state.position, max_search_radius + ) + assert np.isclose( + dist_to_obs, test_trajectory["distances_to_obstacles"][i] + ) + assert sim.action_space.contains(action) sim.step(action)