# `Monty.Simulators.Synthetic.SensorModule`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/simulators/synthetic/sensor_module.ex#L1)

A sensor module for a sensor whose config names a class this port has not
written.

Monty's configs name four sensor classes: `CameraSM`, which is
[`Monty.Frameworks.Models.SensorModules.CameraSM`](../monty/frameworks/models/sensor_modules/camera_sm.ex),
`ExperimentSensorModule`, which is
[`Monty.Experiment.SensorModule.ExperimentSensorModule`](../monty/experiment/sensor_module/experiment_sensor_module.ex),
and the salience and 2D sensor modules, which are still to come. This is what
runs for the last two: the ported observation processor and percept filter
behind the sensor's config, so the run still reports the patch's features, and
no noise, because this quiet stand-in has none.

Use the ported class for anything real. What this is for is running a config
that names a sensor class this port does not have, without pretending that
class ran.

# `state`

```elixir
@type state() :: %{
  sensor_module_id: atom() | String.t(),
  pose: map() | nil,
  processor: Monty.Frameworks.Models.SensorModules.ObservationProcessor.t(),
  filter: struct(),
  filter_memory: term()
}
```

# `new`

```elixir
@spec new(atom() | String.t(), keyword()) :: state()
```

A sensor module for one sensor.

Options: `:features` — the features the sensor's config declares —
`:delta_thresholds` — how much a feature has to change before a point is worth
sending — and the processor's own settings (`:pc1_is_pc2_threshold`,
`:is_surface_sm`, `:weight_curvature`, `:surface_normal_method`).

---

*Consult [api-reference.md](api-reference.md) for complete listing*
