opengnc.sensors package

Submodules

opengnc.sensors.altimeter module

Radar / Altimeter sensor model.

class opengnc.sensors.altimeter.Altimeter(noise_std: float = 1.0, bias: float = 0.0, name: str = 'Altimeter')[source]

Bases: Sensor

Radar / Altimeter sensor model.

Measures height above a reference surface (altitude).

Parameters:
  • noise_std (float, optional) – Standard deviation of measurement noise (m). Default is 1.0.

  • bias (float, optional) – Constant bias in altitude (m). Default is 0.0.

  • name (str, optional) – Sensor name. Default is “Altimeter”.

measure(true_altitude: float | None = None, *args: Any, **kwargs: Any) float[source]

Generate altitude measurement.

Parameters:
  • true_altitude (float) – True altitude above surface (m).

  • **kwargs (dict) – Additional parameters.

Returns:

Measured altitude (m). Guaranteed to be non-negative.

Return type:

float

opengnc.sensors.camera module

Simple pinhole camera model.

class opengnc.sensors.camera.Camera(focal_length: float = 1.0, resolution: tuple[int, int] = (1024, 1024), sensor_size: tuple[float, float] = (1.0, 1.0), noise_std: float = 0.0, name: str = 'Camera')[source]

Bases: Sensor

Simple pinhole camera model.

Projects 3D points in the body frame onto a 2D image plane.

Parameters:
  • focal_length (float, optional) – Focal length (m). Default is 1.0.

  • resolution (tuple[int, int], optional) – (width, height) in pixels. Default is (1024, 1024).

  • sensor_size (tuple[float, float], optional) – (width, height) in physical units (e.g., m). Default is (1.0, 1.0).

  • noise_std (float, optional) – Pixel noise standard deviation. Default is 0.0.

  • name (str, optional) – Sensor name. Default is “Camera”.

measure(true_point_body: ndarray | None = None, *args: Any, **kwargs: Any) ndarray | None[source]

Project 3D point onto image plane.

Parameters:
  • true_point_body (np.ndarray) – 3D point in the camera/body frame (m). Assumes Z is along the optical axis.

  • **kwargs (dict) – Additional parameters.

Returns:

(u, v) pixel coordinates, or None if outside FOV or behind camera.

Return type:

np.ndarray | None

opengnc.sensors.gnss_receiver module

GNSS Receiver sensor model.

class opengnc.sensors.gnss_receiver.GNSSReceiver(pos_noise_std: float = 10.0, vel_noise_std: float = 0.1, name: str = 'GNSS', pos_bias: ndarray | None = None, vel_bias: ndarray | None = None, **kwargs: Any)[source]

Bases: Sensor

GNSS Receiver sensor model.

Simulates position and velocity measurements in ECEF or ECI frame.

Parameters:
  • pos_noise_std (float, optional) – Position measurement noise standard deviation (m). Default is 10.0.

  • vel_noise_std (float, optional) – Velocity measurement noise standard deviation (m/s). Default is 0.1.

  • name (str, optional) – Sensor name. Default is “GNSS”.

  • pos_bias (np.ndarray, optional) – Constant position bias (3,).

  • vel_bias (np.ndarray, optional) – Constant velocity bias (3,).

measure(true_pos: ndarray | None = None, true_vel: ndarray | None = None, *args: Any, **kwargs: Any) tuple[ndarray, ndarray][source]

Generate GNSS position and velocity measurements.

Measurements are simulated by adding Gaussian noise and bias to the true values. The coordinate frame (ECEF/ECI) is determined by the input true_pos and true_vel.

Parameters:
  • true_pos (np.ndarray) – True position vector (m).

  • true_vel (np.ndarray) – True velocity vector (m/s).

  • **kwargs (dict) – Additional parameters.

Returns:

(meas_pos, meas_vel).

Return type:

tuple[np.ndarray, np.ndarray]

opengnc.sensors.gyroscope module

Gyroscope sensor model.

class opengnc.sensors.gyroscope.Gyroscope(noise_std: float = 0.0, bias_stability: float = 0.0, initial_bias: ndarray | None = None, dt: float = 0.1, misalignment: ndarray | None = None, scale_factor: float | ndarray = 1.0, name: str = 'Gyroscope')[source]

Bases: Sensor

Gyroscope sensor model. Measures angular velocity: w_meas = w_true + bias + noise Includes bias instability (random walk).

measure(true_omega: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]
Parameters:
  • true_omega (np.ndarray) – True angular velocity [rad/s].

  • kwargs – Can contain ‘dt’ to update time step if variable.

opengnc.sensors.horizon_sensor module

Earth / Horizon sensor model.

class opengnc.sensors.horizon_sensor.HorizonSensor(noise_std: float = 0.01, bias: ndarray | None = None, name: str = 'HorizonSensor')[source]

Bases: Sensor

Earth / Horizon sensor model.

Measures the nadir vector in the body frame.

Parameters:
  • noise_std (float, optional) – Standard deviation of measurement noise (rad). Default is 0.01.

  • bias (np.ndarray, optional) – Constant bias in roll/pitch equivalent (rad). Default is [0, 0].

  • name (str, optional) – Sensor name. Default is “HorizonSensor”.

measure(true_nadir_vec: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]

Generate nadir vector measurement.

Parameters:
  • true_nadir_vec (np.ndarray) – True nadir unit vector in body frame.

  • **kwargs (dict) – Additional parameters.

Returns:

Measured nadir unit vector in body frame.

Return type:

np.ndarray

opengnc.sensors.imu module

Inertial Measurement Unit (IMU) with Accelerometer and Gyroscope.

class opengnc.sensors.imu.Accelerometer(noise_std: float = 0.0, bias: ndarray | None = None, scale_factor: float = 1.0, name: str = 'Accelerometer')[source]

Bases: Sensor

Accelerometer sensor model.

Measures non-gravitational acceleration: a_meas = a_true + bias + noise.

Parameters:
  • noise_std (float, optional) – Standard deviation of measurement noise (m/s^2). Default is 0.0.

  • bias (np.ndarray, optional) – Constant bias vector (m/s^2). Default is zero vector.

  • scale_factor (float, optional) – Scale factor error (1.0 = no error). Default is 1.0.

  • name (str, optional) – Sensor name. Default is “Accelerometer”.

measure(true_accel: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]

Generate acceleration measurement.

Equation: $mathbf{a}_{meas} = S mathbf{a}_{true} + mathbf{b} + mathbf{eta}$

Parameters:
  • true_accel (np.ndarray) – True non-gravitational acceleration ($m/s^2$).

  • **kwargs (Any) – Additional parameters.

Returns:

Measured acceleration vector ($m/s^2$).

Return type:

np.ndarray

class opengnc.sensors.imu.IMU(gyro_params: dict | None = None, accel_params: dict | None = None, name: str = 'IMU')[source]

Bases: Sensor

Inertial Measurement Unit (IMU) combining Gyroscope and Accelerometer.

Parameters:
  • gyro_params (dict, optional) – Parameters for Gyroscope initialization.

  • accel_params (dict, optional) – Parameters for Accelerometer initialization.

  • name (str, optional) – Sensor name. Default is “IMU”.

measure(true_omega: ndarray | None = None, true_accel: ndarray | None = None, *args: Any, **kwargs: Any) tuple[ndarray, ndarray][source]

Generate dual IMU measurements.

Parameters:
  • true_omega (np.ndarray) – True angular velocity (rad/s).

  • true_accel (np.ndarray) – True non-gravitational acceleration ($m/s^2$).

  • **kwargs (Any) – Additional parameters.

Returns:

(measured_omega, measured_accel).

Return type:

tuple[np.ndarray, np.ndarray]

opengnc.sensors.lidar module

Lidar sensor model.

class opengnc.sensors.lidar.Lidar(range_noise_std: float = 0.01, los_noise_std: float = 0.001, name: str = 'Lidar')[source]

Bases: Sensor

Lidar sensor model.

Measures range and line-of-sight (LOS) vector to a target point.

Parameters:
  • range_noise_std (float, optional) – Range measurement noise standard deviation (m). Default is 0.01.

  • los_noise_std (float, optional) – Angular noise standard deviation for LOS vector (rad). Default is 0.001.

  • name (str, optional) – Sensor name. Default is “Lidar”.

measure(true_relative_pos: ndarray | None = None, *args: Any, **kwargs: Any) tuple[float, ndarray][source]

Generate Lidar range and LOS measurement.

Parameters:
  • true_relative_pos (np.ndarray) – True relative position vector in body frame (m).

  • **kwargs (dict) – Additional parameters.

Returns:

(measured_range, measured_los_vec). measured_range : Range to target (m). measured_los_vec : Unit LOS vector in body frame.

Return type:

tuple[float, np.ndarray]

opengnc.sensors.magnetometer module

Magnetometer sensor model.

class opengnc.sensors.magnetometer.Magnetometer(noise_std: float = 0.0, bias: ndarray | None = None, misalignment: ndarray | None = None, scale_factor: float | ndarray = 1.0, name: str = 'Magnetometer')[source]

Bases: Sensor

Magnetometer sensor model.

Measures magnetic field vector in body frame.

Parameters:
  • noise_std (float, optional) – Standard deviation of measurement noise (Tesla). Default is 0.0.

  • bias (np.ndarray, optional) – Hard-iron bias vector (Tesla). Default is zero vector.

  • misalignment (np.ndarray, optional) – 3x3 soft-iron / misalignment matrix. Default is None.

  • scale_factor (float | np.ndarray, optional) – Scale factor error. Default is 1.0.

  • name (str, optional) – Sensor name. Default is “Magnetometer”.

measure(true_mag_vec_body: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]

Generate magnetic field measurement.

Parameters:
  • true_mag_vec_body (np.ndarray) – True magnetic field vector in body frame (Tesla).

  • **kwargs (dict) – Additional parameters.

Returns:

Measured magnetic field vector (Tesla).

Return type:

np.ndarray

opengnc.sensors.sensor module

Abstract base class for all sensors.

class opengnc.sensors.sensor.Sensor(name: str = 'Sensor')[source]

Bases: ABC

Abstract Base Class for all sensors.

Parameters:

name (str, optional) – Sensor name. Default “Sensor”.

add_gaussian_noise(value: ndarray | float, std_dev: float) ndarray | float[source]

Helper to add zero-mean Gaussian noise.

Parameters:
  • value (np.ndarray | float) – Nominal value.

  • std_dev (float) – Standard deviation of noise.

Returns:

Noisy value.

Return type:

np.ndarray | float

apply_calibration(value: ndarray | float, misalignment: ndarray | None = None, scale_factor: ndarray | float = 1.0, bias: ndarray | float | None = None) ndarray | float[source]

Apply calibration residuals: val_cal = (I + M) * S * val_true + b.

Parameters:
  • value (np.ndarray | float) – True value to be calibrated.

  • misalignment (np.ndarray, optional) – Skew/misalignment matrix (3x3 for vectors).

  • scale_factor (np.ndarray | float, optional) – Scale factor error (scalar or vector). Default is 1.0.

  • bias (np.ndarray | float, optional) – Constant bias vector or scalar.

Returns:

Calibrated value.

Return type:

np.ndarray | float

apply_faults(value: ndarray | float) ndarray | float[source]

Inject faults into the measurement.

Parameters:

value (np.ndarray | float) – Clean measurement value.

Returns:

Faulted measurement value.

Return type:

np.ndarray | float

apply_fogm_noise(current_val: ndarray | float, sigma: float, tau: float, dt: float) ndarray | float[source]

Apply First-Order Gauss-Markov (FOGM) noise.

x[k+1] = exp(-dt/tau) * x[k] + sigma * sqrt(1 - exp(-2*dt/tau)) * w[k]

Parameters:
  • current_val (np.ndarray | float) – Current noise state value.

  • sigma (float) – Steady-state standard deviation.

  • tau (float) – Correlation time constant (s).

  • dt (float) – Time step (s).

Returns:

Updated noise state.

Return type:

np.ndarray | float

abstractmethod measure(*args: Any, **kwargs: Any) Any[source]

Generate a measurement.

Parameters:
  • *args (Any) – Input state(s) or signals required by the sensor.

  • **kwargs (Any) – Additional parameters.

Returns:

Measured value.

Return type:

Any

opengnc.sensors.star_catalog module

Utility for managing and searching star catalogs.

class opengnc.sensors.star_catalog.StarCatalog(catalog_path: str | None = None)[source]

Bases: object

Utility for managing and searching star catalogs (e.g., Hipparcos).

get_stars_in_fov(boresight: ndarray, fov_deg: float, min_mag: float | None = None) list[_StarEntry][source]

Filters stars within a given Field of View (FOV).

Parameters:
  • boresight (np.ndarray) – Unit vector of the camera boresight in J2000.

  • fov_deg (float) – Full Field of View in degrees.

  • min_mag (float) – Minimum magnitude (brightness threshold).

Returns:

list

Return type:

Stars within the FOV.

load_catalog(path: str) None[source]

Dummy implementation for catalog loading. In a real scenario, this would parse Hipparcos or similar data.

opengnc.sensors.star_tracker module

Star Tracker sensor model.

class opengnc.sensors.star_tracker.StarTracker(noise_std: float = 0.0, bias: ndarray | None = None, name: str = 'StarTracker')[source]

Bases: Sensor

Star Tracker Attitude Sensor.

Measures the attitude quaternion [x, y, z, w].

Parameters:
  • noise_std (float, optional) – Standard deviation of noise (rad). Default 0.0.

  • bias (np.ndarray | None, optional) – Constant bias rotation vector (rad).

  • name (str, optional) – Sensor name. Default “StarTracker”.

measure(true_quat: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]

Simulate attitude measurement with error quaternion.

Parameters:
  • true_quat (np.ndarray) – True attitude quaternion [x, y, z, w].

  • **kwargs (Any) – Additional parameters.

Returns:

Measured quaternion [x, y, z, w].

Return type:

np.ndarray

opengnc.sensors.sun_sensor module

Sun Sensor model.

class opengnc.sensors.sun_sensor.SunSensor(noise_std: float = 0.0, bias: ndarray | None = None, misalignment: ndarray | None = None, scale_factor: float | ndarray = 1.0, name: str = 'SunSensor')[source]

Bases: Sensor

Sun Sensor model.

Measures the sun vector in the body frame.

Parameters:
  • noise_std (float, optional) – Standard deviation of noise (rad or unitless depending on vector norm). Default is 0.0.

  • bias (np.ndarray, optional) – Bias vector to add. Default is zero vector.

  • misalignment (np.ndarray, optional) – 3x3 misalignment matrix. Default is None.

  • scale_factor (float | np.ndarray, optional) – Scale factor error. Default is 1.0.

  • name (str, optional) – Sensor name. Default is “SunSensor”.

measure(true_sun_vec_body: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]

Generate sun vector measurement.

Parameters:
  • true_sun_vec_body (np.ndarray) – True sun vector in body frame.

  • **kwargs (dict) – Additional parameters.

Returns:

Measured (and normalized) sun vector in body frame.

Return type:

np.ndarray

opengnc.sensors.sun_sensor_array module

Coarse Sun Sensor Array model.

class opengnc.sensors.sun_sensor_array.CoarseSunSensorArray(boresights: list[ndarray] | None = None, i_max: float = 1.0, noise_std: float = 0.01, name: str = 'CSSArray')[source]

Bases: Sensor

Array of Coarse Sun Sensors (CSS).

Each CSS measures the cosine of the angle between the sun vector and its boresight. $I = I_{max} cos(theta) = I_{max} (S cdot N)$

Parameters:
  • boresights (list[np.ndarray], optional) – Unit vectors representing the boresight direction of each CSS in the body frame. Default is 6 faces of a cube.

  • i_max (float, optional) – Maximum current/output when sun is aligned with boresight. Default is 1.0.

  • noise_std (float, optional) – Standard deviation of measurement noise. Default is 0.01.

  • name (str, optional) – Sensor name. Default is “CSSArray”.

measure(true_sun_vec: ndarray | None = None, *args: Any, **kwargs: Any) ndarray[source]

Generate measurements from each CSS in the array.

Parameters:
  • true_sun_vec (np.ndarray) – True sun unit vector in body frame.

  • **kwargs (dict) – Additional parameters.

Returns:

Array of measurements (typically current or voltage) from each CSS.

Return type:

np.ndarray

Module contents