Skip to content

Sensor Models

Simulated SSN ground sensor producing az/el/range (radar) or angles-only az/el (optical) measurements.


SensorType

SensorType()

Sensor measurement type, driving measurement-model selection.

Parsed from the sensor_type dataset property: AZEL_RANGE sensors (radar/phased-array/mechanical trackers, dataset value "azel_range") measure [az, el, range]; AZEL sensors (angles-only optical trackers, dataset value "azel") measure [az, el].

Example
1
2
3
4
5
import brahe as bh
sites = bh.datasets.ssn_sensors.load()
sensor = bh.SimpleSSNSensor.from_location(sites[0])
if sensor.sensor_type == bh.SensorType.AZEL_RANGE:
    print("radar sensor")

Initialize instance.

AZEL class-attribute

AZEL: Any = SensorType.AZEL

Sensor measurement type, driving measurement-model selection.

Parsed from the sensor_type dataset property: AZEL_RANGE sensors (radar/phased-array/mechanical trackers, dataset value "azel_range") measure [az, el, range]; AZEL sensors (angles-only optical trackers, dataset value "azel") measure [az, el].

Example
1
2
3
4
5
import brahe as bh
sites = bh.datasets.ssn_sensors.load()
sensor = bh.SimpleSSNSensor.from_location(sites[0])
if sensor.sensor_type == bh.SensorType.AZEL_RANGE:
    print("radar sensor")

AZEL_RANGE class-attribute

AZEL_RANGE: Any = SensorType.AZEL_RANGE

Sensor measurement type, driving measurement-model selection.

Parsed from the sensor_type dataset property: AZEL_RANGE sensors (radar/phased-array/mechanical trackers, dataset value "azel_range") measure [az, el, range]; AZEL sensors (angles-only optical trackers, dataset value "azel") measure [az, el].

Example
1
2
3
4
5
import brahe as bh
sites = bh.datasets.ssn_sensors.load()
sensor = bh.SimpleSSNSensor.from_location(sites[0])
if sensor.sensor_type == bh.SensorType.AZEL_RANGE:
    print("radar sensor")

SimpleSSNSensor

SimpleSSNSensor(location: Any, az_min: Any = 0.0, az_max: Any = 360.0, el_min: Any = 0.0, el_max: Any = 90.0, range_max: Any = None, bias: Any = Ellipsis, noise: Any = Ellipsis, seed: Any = None)

A simulated SSN ground sensor producing az/el/range or angles-only az/el measurements.

Pairs a sensor site (location, field-of-view limits, bias/noise calibration) with measurement generation. Radar (azel_range) sensors measure [az, el, range]; optical sensors measure [az, el]. Angles are in degrees, range in meters. The azimuth window is wrap-aware: az_min > az_max means the window crosses north (e.g. Cape Cod 347deg -> 227deg).

Example
1
2
3
import brahe as bh
sites = bh.datasets.ssn_sensors.load()
sensors = bh.SimpleSSNSensor.from_locations(sites, seed=42)

Initialize instance.

az_max property

az_max: float

Azimuth window end (degrees).

Returns:

Name Type Description
float float

Azimuth window end.

az_min property

az_min: float

Azimuth window start (degrees).

Returns:

Name Type Description
float float

Azimuth window start.

calibrated property

calibrated: bool

Whether the sensor's site supplied full noise calibration.

Returns:

Name Type Description
bool bool

True if all three noise fields were present; False for sensors loaded with default zero noise.

el_max property

el_max: float

Maximum elevation (degrees).

Returns:

Name Type Description
float float

Maximum elevation.

el_min property

el_min: float

Minimum elevation (degrees).

Returns:

Name Type Description
float float

Minimum elevation.

location property

location: PointLocation

Sensor site location.

Returns:

Name Type Description
PointLocation PointLocation

Sensor site location.

measurement_dim property

measurement_dim: int

Measurement dimension: 3 for radar (az/el/range), 2 for optical (az/el).

Returns:

Name Type Description
int int

Length of the vector returned by measure().

name property

name: str

Sensor name (from the site location).

Returns:

Name Type Description
str str

Sensor name.

range_max property

range_max: Union[float, None]

Maximum range (meters), if limited.

Returns:

Type Description
Union[float, None]

float or None: Maximum range, or None if unlimited.

sensor_type property

sensor_type: SensorType

Sensor measurement type.

Returns:

Name Type Description
SensorType SensorType

SensorType.AZEL_RANGE (radar; [az, el, range]) or SensorType.AZEL (optical; [az, el]).

azelrange method descriptor

azelrange(epoch: Epoch, state: ndarray) -> ndarray

True (noise-free, bias-free) az/el/range of a target.

Parameters:

Name Type Description Default
epoch Epoch

Measurement epoch.

required
state ndarray

Target ECI state (first 3 elements used; meters).

required

Returns:

Type Description
ndarray

numpy.ndarray: [azimuth_deg, elevation_deg, range_m].

from_location staticmethod

from_location(location: PointLocation, seed: Union[int, None] = None) -> SimpleSSNSensor

Build a sensor from a dataset site's properties.

Supports sensor_type == "azel_range" (radar; [az, el, range]) and sensor_type == "azel" (angles-only optical trackers; [az, el]). Noise fields default to zero when absent, flagging the sensor uncalibrated; radar sites read az/el/range noise, optical sites read az/el noise. Bias fields default to zero when absent; limits default to an open field of view (azimuth 0-360deg, elevation 0-90deg, unlimited range). Optical sites carry no range fields, so they have no range constraint.

Parameters:

Name Type Description Default
location PointLocation

Site from e.g. bh.datasets.ssn_sensors.load().

required
seed int or None

RNG seed for reproducible measurements.

None

Returns:

Name Type Description
SimpleSSNSensor SimpleSSNSensor

New sensor instance.

Raises:

Type Description
ValueError

If the site is missing a sensor_type property or has an unrecognized one.

from_locations staticmethod

from_locations(locations: list[PointLocation], seed: Union[int, None] = None) -> SimpleSSNSensor

Build sensors from all constructible sites, skipping unsupported ones.

Sites with an unknown sensor_type are skipped, but sites lacking calibration are still included with zero noise. Both radar (azel_range) and optical (azel) sites construct. When seed is provided, sensor i is seeded with seed + i for reproducible measurement generation. Use from_locations_calibrated to keep only fully-calibrated sites.

Parameters:

Name Type Description Default
locations list[PointLocation]

Candidate sites.

required
seed int or None

Optional base RNG seed.

None

Returns:

Type Description
SimpleSSNSensor

list[SimpleSSNSensor]: One sensor per constructible site.

Example
1
2
3
import brahe as bh
sites = bh.datasets.ssn_sensors.load()
sensors = bh.SimpleSSNSensor.from_locations(sites, seed=42)

from_locations_calibrated staticmethod

from_locations_calibrated(locations: list[PointLocation], seed: Union[int, None] = None) -> SimpleSSNSensor

Build sensors from constructible, fully-calibrated sites only.

Like from_locations but drops sites that did not supply every noise field their type measures (az/el/range for radar, az/el for optical), i.e. sensors whose calibrated is False.

Parameters:

Name Type Description Default
locations list[PointLocation]

Candidate sites.

required
seed int or None

Optional base RNG seed.

None

Returns:

Type Description
SimpleSSNSensor

list[SimpleSSNSensor]: One sensor per constructible, calibrated site.

measure method descriptor

measure(epoch: Epoch, state: ndarray) -> Union[ndarray, None]

Generate one measurement if the target is visible (step-wise API).

Visibility is evaluated on the true geometry; the returned measurement is truth + bias + noise with azimuth normalized into [0, 360). The measurement is 3-dim [az, el, range] for azel_range sensors and 2-dim [az, el] for optical sensors.

Parameters:

Name Type Description Default
epoch Epoch

Measurement epoch.

required
state ndarray

True target ECI state (meters).

required

Returns:

Type Description
Union[ndarray, None]

numpy.ndarray or None: [az_deg, el_deg, range_m] ([az_deg, el_deg] for optical) when visible, None otherwise.

measurement_model method descriptor

measurement_model() -> Any

Filter-side measurement model matching this sensor.

The model uses the sensor's noise standard deviations for its noise covariance and the sensor's bias in predict(), so an estimator configured with this model is consistent with measurements generated by measure(). Returns an AzElRangeMeasurementModel for radar (az/el/range) sensors and an AzElMeasurementModel for optical (angles-only) sensors.

Returns:

Type Description
Any

AzElRangeMeasurementModel | AzElMeasurementModel: Matching model in degrees.

simulate_observations method descriptor

simulate_observations(trajectory: OrbitTrajectory, start: Epoch, end: Epoch, dt: float, model_index: int) -> list[Observation]

Generate observations over a trajectory segment (batched API).

Samples the trajectory at cadence dt over [start, end] (inclusive) and calls measure() at each sample; non-visible samples are skipped. Pass detection is intentionally not performed here.

Parameters:

Name Type Description Default
trajectory OrbitTrajectory

Interpolatable ECI trajectory of the target.

required
start Epoch

First sample epoch.

required
end Epoch

Last sample epoch (inclusive).

required
dt float

Sample interval (seconds, > 0).

required
model_index int

Observation.model_index to tag measurements with.

required

Returns:

Type Description
list[Observation]

list[Observation]: Observations for every visible sample.

Raises:

Type Description
ValueError

If dt <= 0.

visible method descriptor

visible(epoch: Epoch, state: ndarray) -> bool

Whether a target is inside the sensor's field of view.

Checks elevation limits, the wrap-aware azimuth window, and maximum range.

Parameters:

Name Type Description Default
epoch Epoch

Measurement epoch.

required
state ndarray

Target ECI state (first 3 elements used; meters).

required

Returns:

Name Type Description
bool bool

True if the target is within the field of view.

with_bias method descriptor

with_bias(bias_az_deg: float, bias_el_deg: float, bias_range_m: float) -> SimpleSSNSensor

Override the sensor's measurement bias.

The derived measurement_model reads these values.

Parameters:

Name Type Description Default
bias_az_deg float

Azimuth bias (degrees).

required
bias_el_deg float

Elevation bias (degrees).

required
bias_range_m float

Range bias (meters).

required

Returns:

Name Type Description
SimpleSSNSensor SimpleSSNSensor

The sensor with updated bias.

Raises:

Type Description
ValueError

If any bias is non-finite.

with_constraint method descriptor

Add an extra field-of-view constraint (extension point).

The constraint is evaluated by visible alongside the limits-derived constraints, so users can extend visibility with arbitrary access constraints (e.g. ElevationConstraint, AzimuthConstraint, RangeConstraint, LookDirectionConstraint).

Parameters:

Name Type Description Default
constraint AccessConstraint

An access constraint object, e.g. ElevationConstraint, AzimuthConstraint, or RangeConstraint.

required

Returns:

Name Type Description
SimpleSSNSensor SimpleSSNSensor

The sensor with the constraint appended.

with_noise method descriptor

with_noise(sigma_az_deg: float, sigma_el_deg: float, sigma_range_m: float) -> SimpleSSNSensor

Override the sensor's noise standard deviations.

The derived measurement_model reads these values.

Parameters:

Name Type Description Default
sigma_az_deg float

Azimuth noise standard deviation (degrees).

required
sigma_el_deg float

Elevation noise standard deviation (degrees).

required
sigma_range_m float

Range noise standard deviation (meters).

required

Returns:

Name Type Description
SimpleSSNSensor SimpleSSNSensor

The sensor with updated noise.

Raises:

Type Description
ValueError

If any sigma is negative or non-finite.

See Also