Source code for tbp.monty.experiment.sensor_modules.telemetry

# Copyright 2026 Thousand Brains Project
#
# Copyright may exist in Contributors' modifications
# and/or contributions to the work.
#
# Use of this source code is governed by the MIT
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT.
from __future__ import annotations

from typing import Any

import numpy as np
import quaternion as qt
from typing_extensions import Self

from tbp.monty.experiment.sensor_module import ExperimentTransform
from tbp.monty.observations import SensorObservation
from tbp.monty.sensor_modules.sensor_module import Payload, TransformContext


[docs]class Snapshot(ExperimentTransform): """Appends observation and sensor pose to the payload telemetry. Reads: - `ctx.sensor_state.rotation` - `ctx.sensor_state.position` - `payload.observation` Writes: - `payload.telemetry["raw_observations"]` - `payload.telemetry["sm_properties"]` Appends the current observation to ``payload.telemetry["raw_observations"]``. Appends the current sensor pose to ``payload.telemetry["sm_properties"]``. After a reset is triggered, both ``payload.telemetry["raw_observations"]`` and ``payload.telemetry["sm_properties"]`` are cleared before appending new data. """ _reset: bool = False def __call__(self: Self, ctx: TransformContext, payload: Payload) -> Payload: if self._reset: payload.telemetry["raw_observations"] = [] payload.telemetry["sm_properties"] = [] self._reset = False raw_observations: list[SensorObservation] = payload.telemetry.setdefault( "raw_observations", [] ) raw_observations.append(payload.observation) sm_properties: list[dict[str, Any]] = payload.telemetry.setdefault( "sm_properties", [] ) sm_rotation = qt.as_float_array(ctx.sensor_state.rotation) sm_location = np.array(ctx.sensor_state.position) sm_properties.append({"sm_rotation": sm_rotation, "sm_location": sm_location}) return payload
[docs] def reset(self) -> None: self._reset = True