Implementation:Facebookresearch Habitat lab Sensor Measure Action base classes
Appearance
| Knowledge Sources | |
|---|---|
| Domains | Software_Architecture, Embodied_AI |
| Last Updated | 2026-02-15 02:00 GMT |
Overview
Concrete base classes for defining custom sensors, measures, and actions in the Habitat task framework, provided by habitat-lab core.
Description
Habitat provides three base classes for extension:
- Sensor (in
habitat.core.simulator): Subclass and override_get_uuid,_get_sensor_type,_get_observation_space, andget_observation - Measure (in
habitat.core.embodied_task): Subclass and override_get_uuid,reset_metric, andupdate_metric - SimulatorTaskAction (in
habitat.core.embodied_task): Subclass and overridestepto define action effects
Usage
Import the appropriate base class, create a subclass with required method overrides, then register it with the Habitat registry (next step).
Code Reference
Source Location
- Repository: habitat-lab
- File: habitat-lab/habitat/core/simulator.py (Sensor: L74-111), habitat-lab/habitat/core/embodied_task.py (Measure: L83-127, SimulatorTaskAction: L60-81)
Signature
# Sensor base class
class Sensor:
uuid: str
config: DictConfig
sensor_type: SensorTypes
def __init__(self, *args, config, sim, **kwargs):
self.uuid = self._get_uuid(*args, **kwargs)
self.config = config
self.sensor_type = self._get_sensor_type(*args, **kwargs)
def _get_uuid(self, *args, **kwargs) -> str: ...
def _get_sensor_type(self, *args, **kwargs) -> SensorTypes: ...
def _get_observation_space(self, *args, **kwargs) -> spaces.Space: ...
def get_observation(self, *args, **kwargs) -> Any: ...
# Measure base class
class Measure:
_metric: Any
def __init__(self, *args, config, **kwargs):
self._metric = None
def _get_uuid(self, *args, **kwargs) -> str: ...
def reset_metric(self, *args, **kwargs) -> None: ...
def update_metric(self, *args, **kwargs) -> None: ...
# Action base class
class SimulatorTaskAction:
def __init__(self, *args, config, sim, **kwargs):
self._config = config
self._sim = sim
def step(self, *args, **kwargs):
"""Execute action in simulator."""
...
Import
from habitat.core.simulator import Sensor, SensorTypes
from habitat.core.embodied_task import Measure, SimulatorTaskAction
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| sim | Simulator | Yes | Simulator instance (provides scene state) |
| config | DictConfig | Yes | Component-specific configuration |
| episode | Episode | Yes | Current episode (for Sensors/Measures) |
| task | EmbodiedTask | Yes | Task instance (for Measures) |
Outputs
| Name | Type | Description |
|---|---|---|
| Sensor.get_observation | Any | Observation value (ndarray, scalar, etc.) |
| Measure._metric | Any | Metric value (scalar, dict) |
| SimulatorTaskAction.step | Observations | New observations after action |
Usage Examples
Custom Sensor
import numpy as np
from gym import spaces
from habitat.core.simulator import Sensor, SensorTypes
class MyProximitySensor(Sensor):
cls_uuid = "my_proximity"
def _get_uuid(self, *args, **kwargs):
return self.cls_uuid
def _get_sensor_type(self, *args, **kwargs):
return SensorTypes.MEASUREMENT
def _get_observation_space(self, *args, **kwargs):
return spaces.Box(low=0.0, high=10.0, shape=(1,), dtype=np.float32)
def get_observation(self, observations, episode, *args, **kwargs):
agent_pos = self._sim.get_agent_state().position
goal_pos = np.array(episode.goals[0].position)
distance = np.linalg.norm(agent_pos - goal_pos)
return np.array([distance], dtype=np.float32)
Custom Measure
from habitat.core.embodied_task import Measure
class MySuccessMeasure(Measure):
cls_uuid = "my_success"
def _get_uuid(self, *args, **kwargs):
return self.cls_uuid
def reset_metric(self, episode, task, *args, **kwargs):
self._metric = 0.0
self.update_metric(episode=episode, task=task)
def update_metric(self, episode, task, *args, **kwargs):
distance = task.measurements.measures["distance_to_goal"].get_metric()
self._metric = float(distance < self.config.success_distance)
Custom Action
from habitat.core.embodied_task import SimulatorTaskAction
class MyStrafeAction(SimulatorTaskAction):
def step(self, *args, **kwargs):
# Move agent sideways
current_state = self._sim.get_agent_state()
# ... compute strafe movement ...
return self._sim.step("strafe_left")
Related Pages
Implements Principle
Page Connections
Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment