Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Facebookresearch Habitat lab Sensor Measure Action base classes

From Leeroopedia
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, and get_observation
  • Measure (in habitat.core.embodied_task): Subclass and override _get_uuid, reset_metric, and update_metric
  • SimulatorTaskAction (in habitat.core.embodied_task): Subclass and override step to 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