opengnc.mission_design package

Submodules

opengnc.mission_design.budgeting module

Propellant budgeting and orbital lifetime prediction tools.

class opengnc.mission_design.budgeting.ManeuverSequence(initial_mass: float, isp: float)[source]

Bases: object

Tracks a sequence of maneuvers and accurately budgets propellant consumption over time.

add_maneuver(name: str, dv: float, description: str = '') None[source]

Adds a maneuver to the sequence and updates the current mass.

Parameters:
  • name (str) – Name of the maneuver.

  • dv (float) – Delta-V of the maneuver (km/s).

  • description (str) – Optional description.

get_budget_history() list[dict][source]

Returns the history of the maneuver budget.

Returns:

list[dict]

Return type:

List of dictionaries with installment details.

get_total_dv() float[source]

Total Delta-V applied.

get_total_propellant() float[source]

Total propellant consumed.

opengnc.mission_design.budgeting.calculate_delta_v(initial_mass: float, propellant_mass: float, isp: float) float[source]

Calculate available Delta-V from propellant mass.

Equation: $Delta V = I_{sp} g_0 lnleft(frac{m_0}{m_f}right)$

Parameters:
  • initial_mass (float) – Initial mass $m_0$ (kg).

  • propellant_mass (float) – Mass of propellant to burn (kg).

  • isp (float) – Specific impulse (s).

Returns:

Available Delta-V (km/s).

Return type:

float

opengnc.mission_design.budgeting.calculate_propellant_mass(initial_mass: float, dv: float, isp: float) float[source]

Calculate required propellant mass via the Rocket Equation.

Equation: $m_p = m_0 left( 1 - expleft(-frac{Delta V}{I_{sp} g_0}right) right)$

Parameters:
  • initial_mass (float) – Initial spacecraft mass $m_0$ (kg).

  • dv (float) – Required Delta-V (km/s).

  • isp (float) – Specific impulse (s).

Returns:

Required propellant mass (kg).

Return type:

float

opengnc.mission_design.budgeting.calculate_staged_delta_v(stages: list[dict]) float[source]

Calculate total Delta-V for a multi-stage system.

Summation: $Delta V_{total} = sum_{i=1}^n I_{sp,i} g_0 lnleft(frac{m_{0,i}}{m_{f,i}}right)$

Parameters:

stages (list[dict]) – List of stage definitions (ordered 1 to N). Each dict requires ‘m_dry’, ‘m_prop’, ‘isp’.

Returns:

Total Delta-V (km/s).

Return type:

float

opengnc.mission_design.budgeting.predict_lifetime(r_eci: ndarray, v_eci: ndarray, mass: float, area: float, cd: float, density_model: Any, jd_epoch: float, max_days: float = 30, dt: float = 100.0) dict[source]

Predicts the orbital lifetime due to atmospheric drag using numerical integration. Saves and returns the time of reentry (altitude < 100km).

Parameters:
  • r_eci (np.ndarray) – Initial position vector [km].

  • v_eci (np.ndarray) – Initial velocity vector [km/s].

  • mass (float) – Spacecraft mass [kg].

  • area (float) – Equivalent cross-sectional area [m^2].

  • cd (float) – Drag coefficient.

  • density_model – Object with get_density(r_eci, jd) method.

  • jd_epoch (float) – Julian Date epoch.

  • max_days (float) – Maximum prediction duration in days.

  • dt (float) – Approximate time step for solver output [s].

Returns:

dict

  • ‘reentry_detected’ (bool)

  • ’lifetime_days’ (float)

  • ’final_altitude’ (float)

  • ’trajectory’ (dict with ‘t’, ‘r’, ‘v’)

Return type:

Breakdown of prediction results:

opengnc.mission_design.communications module

Link budget calculations and RF analysis tools.

opengnc.mission_design.communications.calculate_atmospheric_attenuation(elevation_deg: float, frequency_hz: float) float[source]

Calculates atmospheric attenuation using a simplified cosecant model.

Formula:

L_atm = A_zenith / sin(elevation) where A_zenith is a base attenuation dependent on frequency band.

Parameters:
  • elevation_deg (float) – Elevation angle [deg].

  • frequency_hz (float) – Frequency [Hz].

Returns:

float

Return type:

Atmospheric attenuation [dB].

opengnc.mission_design.communications.calculate_doppler_shift(f_tx_hz: float, r_ecef_rx: ndarray, v_ecef_rx: ndarray, r_ecef_tx: ndarray, v_ecef_tx: ndarray) dict[str, float][source]

Calculates the Doppler shift for a signal sent from TX to RX.

Formula:

delta_f = - f_tx * (v_rel / c) where v_rel = dot(r_rel, v_rel_vec) / |r_rel| r_rel = r_rx - r_tx v_rel_vec = v_rx - v_tx

Parameters:
  • f_tx_hz (float) – Transmitter frequency [Hz].

  • r_ecef_rx (np.ndarray) – Receiver position in ECEF [m], shape (3,).

  • v_ecef_rx (np.ndarray) – Receiver velocity in ECEF [m/s], shape (3,).

  • r_ecef_tx (np.ndarray) – Transmitter position in ECEF [m], shape (3,).

  • v_ecef_tx (np.ndarray) – Transmitter velocity in ECEF [m/s], shape (3,).

Returns:

dict – ‘f_rx_hz’ (float): Received frequency [Hz]. ‘doppler_shift_hz’ (float): Doppler shift [Hz].

Return type:

Containing:

Calculates the link budget using Friis transmission equation.

Formula:

Pr (dBW) = Pt (dBW) + Gt (dB) + Gr (dB) - Lfs (dB) - Latm (dB) - Lmisc (dB) Lfs = 20 * log10(d) + 20 * log10(f) + 20 * log10(4*pi/c)

Parameters:
  • p_tx_w (float) – Transmitter power [W].

  • g_tx_db (float) – Transmitter antenna gain [dB].

  • g_rx_db (float) – Receiver antenna gain [dB].

  • frequency_hz (float) – Carrier frequency [Hz].

  • distance_m (float) – Distance between Tx and Rx [m].

  • losses_misc_db (float, optional) – Miscellaneous losses (pointing, line, etc.) [dB]. Default 0.

  • l_atm_db (float, optional) – Atmospheric attenuation [dB]. Default 0.

Returns:

dict – ‘p_rx_dbw’ (float): Received power [dBW]. ‘p_rx_w’ (float): Received power [W]. ‘l_fs_db’ (float): Free space path loss [dB].

Return type:

Containing:

opengnc.mission_design.coverage module

Ground station access and lighting conditions analysis utilities.

opengnc.mission_design.coverage.calculate_access_windows(t_array: ndarray, r_eci_array: ndarray, gs_lat_deg: float, gs_lon_deg: float, gs_alt_m: float, min_elevation_deg: float = 5.0, jdut1: float = 2451545.0) dict[str, Any][source]

Calculates access windows (visibility) from a Ground Station for a given trajectory.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array (np.ndarray) – Position history in ECI [m], shape (N, 3).

  • gs_lat_deg (float) – Ground Station Latitude [deg].

  • gs_lon_deg (float) – Ground Station Longitude [deg].

  • gs_alt_m (float) – Ground Station Altitude [m].

  • min_elevation_deg (float) – Minimum elevation for visibility [deg].

  • jdut1 (float) – Julian Date UT1 at t=0.

Returns:

dict

Return type:

Containing ‘visible_intervals’ (list of dicts), ‘elevation_history’ (degrees).

opengnc.mission_design.coverage.calculate_constellation_coverage(t_array: ndarray, r_eci_array_list: list[ndarray], target_points_llh: ndarray, min_elevation_deg: float = 5.0, jdut1: float = 2451545.0) list[dict[str, float]][source]

Evaluates coverage statistics (gap, revisit time) for a constellation over a list of ground targets.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array_list (list of np.ndarray) – List of position histories in ECI [m], each shape (N, 3).

  • target_points_llh (np.ndarray) – Target locations as (M, 2) or (M, 3) matrix [Lat(deg), Lon(deg), Alt(m)]. Altitude defaults to 0 if only 2 columns provided.

  • min_elevation_deg (float) – Minimum elevation for visibility [deg]. Defaults to 5.0.

  • jdut1 (float) – Julian Date UT1 at t=0. Defaults to 2451545.0.

Returns:

list of dict – ‘mean_revisit_time’, and ‘total_coverage_time’.

Return type:

For each target point, statistics including ‘max_revisit_time_gap’,

opengnc.mission_design.coverage.calculate_ground_track(t_array: ndarray, r_eci_array: ndarray, jdut1: float = 2451545.0) dict[str, ndarray][source]

Calculates ground track coordinates (Lat, Lon, Alt) over time.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array (np.ndarray) – Position history in ECI [m], shape (N, 3).

  • jdut1 (float) – Julian Date UT1 at t=0.

Returns:

dict

Return type:

Containing ‘lat_deg’, ‘lon_deg’, ‘alt_m’ arrays.

opengnc.mission_design.coverage.calculate_lighting_conditions(t_array: ndarray, r_eci_array: ndarray, v_eci_array: ndarray, jdut1: float = 2451545.0) dict[str, ndarray][source]

Calculates Beta angle and Eclipse status over time.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array (np.ndarray) – Position history in ECI [m], shape (N, 3).

  • v_eci_array (np.ndarray) – Velocity history in ECI [m/s], shape (N, 3).

  • jdut1 (float) – Julian Date UT1 at t=0.

Returns:

dict

Return type:

Containing ‘beta_angle_deg’, ‘eclipse_state’ (1 for Sun, 0 for shade).

opengnc.mission_design.launch module

Launch window and injection state computation utilities.

opengnc.mission_design.launch.calculate_deployment_sequence(planes: int, sats_per_plane: int, phasing_parameter_f: int, inc_deg: float, base_raan_deg: float = 0.0, base_ta_deg: float = 0.0) list[dict[str, Any]][source]

Computes target RAAN and True Anomaly for each satellite in a Walker-Delta Constellation (T/P/F).

Parameters:
  • planes (int) – Number of orbital planes (P).

  • sats_per_plane (int) – Number of satellites per plane (S).

  • phasing_parameter_f (int) – Phasing parameter (F) between adjacent planes (0 <= F <= P-1).

  • inc_deg (float) – Inclination of all planes [deg] (not actively changing sequence logic, kept for reference).

  • base_raan_deg (float) – RAAN of Plane 0 [deg].

  • base_ta_deg (float) – True anomaly of Satellite 0 in Plane 0 [deg].

Returns:

list of dict

Return type:

Each satellite’s parameters including ‘plane_id’, ‘sat_id’, ‘global_id’, ‘raan_deg’, ‘ta_deg’

opengnc.mission_design.launch.calculate_launch_windows(jd_start: float, jd_end: float, inc_deg: float, raan_deg: float, lat_deg: float, lon_deg: float, step_sec: float = 60) list[dict[str, Any]][source]

Calculates launch windows by finding times when the launch site intersects the target orbit plane.

Parameters:
  • jd_start (float) – Start Julian Date.

  • jd_end (float) – End Julian Date.

  • inc_deg (float) – Target Inclination [deg].

  • raan_deg (float) – Target RAAN [deg].

  • lat_deg (float) – Launch site Latitude [deg].

  • lon_deg (float) – Launch site Longitude [deg].

  • step_sec (float) – Search step size [s].

Returns:

dict

Return type:

list of dicts with ‘jd’, ‘type’ (Ascending/Descending), and ‘azimuth_deg’.

opengnc.mission_design.launch.compute_injection_state(lat_deg: float, lon_deg: float, alt_m: float, azimuth_deg: float, flight_path_angle_deg: float, speed_mps: float, jd: float) tuple[ndarray, ndarray][source]

Computes ECI state vector at insertion.

Parameters:
  • lat_deg (float) – Latitude [deg].

  • lon_deg (float) – Longitude [deg].

  • alt_m (float) – Altitude [m].

  • azimuth_deg (float) – Azimuth from North [deg].

  • flight_path_angle_deg (float) – Flight Path Angle from horizontal [deg].

  • speed_mps (float) – Speed magnitude [m/s].

  • jd (float) – Julian Date at injection.

Returns:

tuple

Return type:

(r_eci [m], v_eci [m/s])

opengnc.mission_design.launch.eci2_ecef_or_inverse_wrapper(recef: ndarray, jd: float) tuple[ndarray, ndarray][source]

Temporary local wrapper to use ecef2eci avoiding import loop or correct usage

Module contents

class opengnc.mission_design.ManeuverSequence(initial_mass: float, isp: float)[source]

Bases: object

Tracks a sequence of maneuvers and accurately budgets propellant consumption over time.

add_maneuver(name: str, dv: float, description: str = '') None[source]

Adds a maneuver to the sequence and updates the current mass.

Parameters:
  • name (str) – Name of the maneuver.

  • dv (float) – Delta-V of the maneuver (km/s).

  • description (str) – Optional description.

get_budget_history() list[dict][source]

Returns the history of the maneuver budget.

Returns:

list[dict]

Return type:

List of dictionaries with installment details.

get_total_dv() float[source]

Total Delta-V applied.

get_total_propellant() float[source]

Total propellant consumed.

opengnc.mission_design.calculate_access_windows(t_array: ndarray, r_eci_array: ndarray, gs_lat_deg: float, gs_lon_deg: float, gs_alt_m: float, min_elevation_deg: float = 5.0, jdut1: float = 2451545.0) dict[str, Any][source]

Calculates access windows (visibility) from a Ground Station for a given trajectory.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array (np.ndarray) – Position history in ECI [m], shape (N, 3).

  • gs_lat_deg (float) – Ground Station Latitude [deg].

  • gs_lon_deg (float) – Ground Station Longitude [deg].

  • gs_alt_m (float) – Ground Station Altitude [m].

  • min_elevation_deg (float) – Minimum elevation for visibility [deg].

  • jdut1 (float) – Julian Date UT1 at t=0.

Returns:

dict

Return type:

Containing ‘visible_intervals’ (list of dicts), ‘elevation_history’ (degrees).

opengnc.mission_design.calculate_atmospheric_attenuation(elevation_deg: float, frequency_hz: float) float[source]

Calculates atmospheric attenuation using a simplified cosecant model.

Formula:

L_atm = A_zenith / sin(elevation) where A_zenith is a base attenuation dependent on frequency band.

Parameters:
  • elevation_deg (float) – Elevation angle [deg].

  • frequency_hz (float) – Frequency [Hz].

Returns:

float

Return type:

Atmospheric attenuation [dB].

opengnc.mission_design.calculate_constellation_coverage(t_array: ndarray, r_eci_array_list: list[ndarray], target_points_llh: ndarray, min_elevation_deg: float = 5.0, jdut1: float = 2451545.0) list[dict[str, float]][source]

Evaluates coverage statistics (gap, revisit time) for a constellation over a list of ground targets.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array_list (list of np.ndarray) – List of position histories in ECI [m], each shape (N, 3).

  • target_points_llh (np.ndarray) – Target locations as (M, 2) or (M, 3) matrix [Lat(deg), Lon(deg), Alt(m)]. Altitude defaults to 0 if only 2 columns provided.

  • min_elevation_deg (float) – Minimum elevation for visibility [deg]. Defaults to 5.0.

  • jdut1 (float) – Julian Date UT1 at t=0. Defaults to 2451545.0.

Returns:

list of dict – ‘mean_revisit_time’, and ‘total_coverage_time’.

Return type:

For each target point, statistics including ‘max_revisit_time_gap’,

opengnc.mission_design.calculate_delta_v(initial_mass: float, propellant_mass: float, isp: float) float[source]

Calculate available Delta-V from propellant mass.

Equation: $Delta V = I_{sp} g_0 lnleft(frac{m_0}{m_f}right)$

Parameters:
  • initial_mass (float) – Initial mass $m_0$ (kg).

  • propellant_mass (float) – Mass of propellant to burn (kg).

  • isp (float) – Specific impulse (s).

Returns:

Available Delta-V (km/s).

Return type:

float

opengnc.mission_design.calculate_deployment_sequence(planes: int, sats_per_plane: int, phasing_parameter_f: int, inc_deg: float, base_raan_deg: float = 0.0, base_ta_deg: float = 0.0) list[dict[str, Any]][source]

Computes target RAAN and True Anomaly for each satellite in a Walker-Delta Constellation (T/P/F).

Parameters:
  • planes (int) – Number of orbital planes (P).

  • sats_per_plane (int) – Number of satellites per plane (S).

  • phasing_parameter_f (int) – Phasing parameter (F) between adjacent planes (0 <= F <= P-1).

  • inc_deg (float) – Inclination of all planes [deg] (not actively changing sequence logic, kept for reference).

  • base_raan_deg (float) – RAAN of Plane 0 [deg].

  • base_ta_deg (float) – True anomaly of Satellite 0 in Plane 0 [deg].

Returns:

list of dict

Return type:

Each satellite’s parameters including ‘plane_id’, ‘sat_id’, ‘global_id’, ‘raan_deg’, ‘ta_deg’

opengnc.mission_design.calculate_doppler_shift(f_tx_hz: float, r_ecef_rx: ndarray, v_ecef_rx: ndarray, r_ecef_tx: ndarray, v_ecef_tx: ndarray) dict[str, float][source]

Calculates the Doppler shift for a signal sent from TX to RX.

Formula:

delta_f = - f_tx * (v_rel / c) where v_rel = dot(r_rel, v_rel_vec) / |r_rel| r_rel = r_rx - r_tx v_rel_vec = v_rx - v_tx

Parameters:
  • f_tx_hz (float) – Transmitter frequency [Hz].

  • r_ecef_rx (np.ndarray) – Receiver position in ECEF [m], shape (3,).

  • v_ecef_rx (np.ndarray) – Receiver velocity in ECEF [m/s], shape (3,).

  • r_ecef_tx (np.ndarray) – Transmitter position in ECEF [m], shape (3,).

  • v_ecef_tx (np.ndarray) – Transmitter velocity in ECEF [m/s], shape (3,).

Returns:

dict – ‘f_rx_hz’ (float): Received frequency [Hz]. ‘doppler_shift_hz’ (float): Doppler shift [Hz].

Return type:

Containing:

Calculates the link budget using Friis transmission equation.

Formula:

Pr (dBW) = Pt (dBW) + Gt (dB) + Gr (dB) - Lfs (dB) - Latm (dB) - Lmisc (dB) Lfs = 20 * log10(d) + 20 * log10(f) + 20 * log10(4*pi/c)

Parameters:
  • p_tx_w (float) – Transmitter power [W].

  • g_tx_db (float) – Transmitter antenna gain [dB].

  • g_rx_db (float) – Receiver antenna gain [dB].

  • frequency_hz (float) – Carrier frequency [Hz].

  • distance_m (float) – Distance between Tx and Rx [m].

  • losses_misc_db (float, optional) – Miscellaneous losses (pointing, line, etc.) [dB]. Default 0.

  • l_atm_db (float, optional) – Atmospheric attenuation [dB]. Default 0.

Returns:

dict – ‘p_rx_dbw’ (float): Received power [dBW]. ‘p_rx_w’ (float): Received power [W]. ‘l_fs_db’ (float): Free space path loss [dB].

Return type:

Containing:

opengnc.mission_design.calculate_ground_track(t_array: ndarray, r_eci_array: ndarray, jdut1: float = 2451545.0) dict[str, ndarray][source]

Calculates ground track coordinates (Lat, Lon, Alt) over time.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array (np.ndarray) – Position history in ECI [m], shape (N, 3).

  • jdut1 (float) – Julian Date UT1 at t=0.

Returns:

dict

Return type:

Containing ‘lat_deg’, ‘lon_deg’, ‘alt_m’ arrays.

opengnc.mission_design.calculate_launch_windows(jd_start: float, jd_end: float, inc_deg: float, raan_deg: float, lat_deg: float, lon_deg: float, step_sec: float = 60) list[dict[str, Any]][source]

Calculates launch windows by finding times when the launch site intersects the target orbit plane.

Parameters:
  • jd_start (float) – Start Julian Date.

  • jd_end (float) – End Julian Date.

  • inc_deg (float) – Target Inclination [deg].

  • raan_deg (float) – Target RAAN [deg].

  • lat_deg (float) – Launch site Latitude [deg].

  • lon_deg (float) – Launch site Longitude [deg].

  • step_sec (float) – Search step size [s].

Returns:

dict

Return type:

list of dicts with ‘jd’, ‘type’ (Ascending/Descending), and ‘azimuth_deg’.

opengnc.mission_design.calculate_lighting_conditions(t_array: ndarray, r_eci_array: ndarray, v_eci_array: ndarray, jdut1: float = 2451545.0) dict[str, ndarray][source]

Calculates Beta angle and Eclipse status over time.

Parameters:
  • t_array (np.ndarray) – Time array [s] from starting epoch.

  • r_eci_array (np.ndarray) – Position history in ECI [m], shape (N, 3).

  • v_eci_array (np.ndarray) – Velocity history in ECI [m/s], shape (N, 3).

  • jdut1 (float) – Julian Date UT1 at t=0.

Returns:

dict

Return type:

Containing ‘beta_angle_deg’, ‘eclipse_state’ (1 for Sun, 0 for shade).

opengnc.mission_design.calculate_propellant_mass(initial_mass: float, dv: float, isp: float) float[source]

Calculate required propellant mass via the Rocket Equation.

Equation: $m_p = m_0 left( 1 - expleft(-frac{Delta V}{I_{sp} g_0}right) right)$

Parameters:
  • initial_mass (float) – Initial spacecraft mass $m_0$ (kg).

  • dv (float) – Required Delta-V (km/s).

  • isp (float) – Specific impulse (s).

Returns:

Required propellant mass (kg).

Return type:

float

opengnc.mission_design.calculate_staged_delta_v(stages: list[dict]) float[source]

Calculate total Delta-V for a multi-stage system.

Summation: $Delta V_{total} = sum_{i=1}^n I_{sp,i} g_0 lnleft(frac{m_{0,i}}{m_{f,i}}right)$

Parameters:

stages (list[dict]) – List of stage definitions (ordered 1 to N). Each dict requires ‘m_dry’, ‘m_prop’, ‘isp’.

Returns:

Total Delta-V (km/s).

Return type:

float

opengnc.mission_design.compute_injection_state(lat_deg: float, lon_deg: float, alt_m: float, azimuth_deg: float, flight_path_angle_deg: float, speed_mps: float, jd: float) tuple[ndarray, ndarray][source]

Computes ECI state vector at insertion.

Parameters:
  • lat_deg (float) – Latitude [deg].

  • lon_deg (float) – Longitude [deg].

  • alt_m (float) – Altitude [m].

  • azimuth_deg (float) – Azimuth from North [deg].

  • flight_path_angle_deg (float) – Flight Path Angle from horizontal [deg].

  • speed_mps (float) – Speed magnitude [m/s].

  • jd (float) – Julian Date at injection.

Returns:

tuple

Return type:

(r_eci [m], v_eci [m/s])

opengnc.mission_design.predict_lifetime(r_eci: ndarray, v_eci: ndarray, mass: float, area: float, cd: float, density_model: Any, jd_epoch: float, max_days: float = 30, dt: float = 100.0) dict[source]

Predicts the orbital lifetime due to atmospheric drag using numerical integration. Saves and returns the time of reentry (altitude < 100km).

Parameters:
  • r_eci (np.ndarray) – Initial position vector [km].

  • v_eci (np.ndarray) – Initial velocity vector [km/s].

  • mass (float) – Spacecraft mass [kg].

  • area (float) – Equivalent cross-sectional area [m^2].

  • cd (float) – Drag coefficient.

  • density_model – Object with get_density(r_eci, jd) method.

  • jd_epoch (float) – Julian Date epoch.

  • max_days (float) – Maximum prediction duration in days.

  • dt (float) – Approximate time step for solver output [s].

Returns:

dict

  • ‘reentry_detected’ (bool)

  • ’lifetime_days’ (float)

  • ’final_altitude’ (float)

  • ’trajectory’ (dict with ‘t’, ‘r’, ‘v’)

Return type:

Breakdown of prediction results: