Source code for cubesat_specs.launch_providers

"""Launch provider and deployer specifications.

Sources
-------
- CubeSat Design Specification (CDS) Rev 14.1, Cal Poly, 2022
  https://static1.squarespace.com/static/5418c831e4b0fa4ecac1bacd/
  t/62193b7fc9e72e0053f00910/1645820809779/CDS+REV14_1+2022-02-09.pdf
- NanoRacks NRCSD-E IDD
  https://nanoracks.com/wp-content/uploads/Nanoracks-External-Cygnus-Deployer-E-NRCSD-IDD.pdf
- NanoRacks NRCSD IDD Rev D
  https://nanoracks.com/wp-content/uploads/Nanoracks-CubeSat-Deployer-NRCSD-IDD.pdf
- Cal Poly P-POD Mk III Rev E User Guide
  https://static1.squarespace.com/static/5418c831e4b0fa4ecac1bacd/
  t/5806854d6b8f5b8eb57b83bd/1476822350599/P-POD_MkIIIRevE_UserGuide.pdf
- ISIS ISIPOD datasheet  https://www.isispace.nl
- Exolaunch EXOpod User Manual  https://exolaunch.com
- Rocket Lab customer guide  https://www.rocketlabusa.com
- SpaceFlight Inc. Sherpa-FX guide  https://spaceflight.com
- JAXA JEM Payload Accommodation Handbook Vol. 8 (JX-ESPC-101133)
  https://aerospacebiz.jaxa.jp/solution/satellite/
- D-Orbit ION platform documentation  https://www.dorbit.space
- Maverick Space Systems product pages  https://maverickspace.com
- SSMS Vega-C User's Manual Issue 1 Rev 0, Sept 2020
  https://www.ariane.group
- Firefly Alpha Payload User's Guide v2.0, Aug 2019
  https://fireflyspace.com
"""

from typing import Dict, List

from cubesat_specs._models import DeployerSpec, LaunchProvider

# ---------------------------------------------------------------------------
# Deployer Specifications
# ---------------------------------------------------------------------------

PPOD_MK3 = DeployerSpec(
    name="P-POD Mk III",
    provider="Cal Poly",
    max_units=3.0,
    supported_form_factors=["1U", "2U", "3U"],
    max_payload_mass_kg=6.0,
    deployment_velocity_min_ms=1.5,
    deployment_velocity_max_ms=2.0,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    notes=(
        "Original CubeSat standard deployer. Internal volume 340 × 100 × 100 mm. "
        "Accepts 1U+1U+1U, 2U+1U, or 3U configurations. "
        "Exit velocity ~2.0 m/s for 4 kg payload (P-POD Mk III Rev E User Guide)."
    ),
)

NRCSD = DeployerSpec(
    name="NanoRacks CubeSat Deployer (NRCSD)",
    provider="NanoRacks / Voyager Space",
    max_units=6.0,
    supported_form_factors=["1U", "2U", "3U", "4U", "5U", "6U"],
    max_payload_mass_kg=14.0,
    deployment_velocity_min_ms=0.5,
    deployment_velocity_max_ms=2.0,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    inclination_deg=51.6,
    altitude_km_min=400.0,
    altitude_km_max=420.0,
    notes=(
        "ISS-based deployment via JEM airlock. Up to 6U per silo (1U–6U). "
        "Battery: ≤100 Wh total stored chemical energy (FAA requirement). "
        "Deployment velocity 0.5–2.0 m/s; tip-off target < 2 deg/s/axis."
    ),
)

NRCSD_E = DeployerSpec(
    name="NanoRacks External Cygnus Deployer (NRCSD-E)",
    provider="NanoRacks / Voyager Space",
    max_units=6.0,
    supported_form_factors=["1U", "2U", "3U", "4U", "5U", "6U"],
    max_payload_mass_kg=14.0,
    deployment_velocity_min_ms=0.5,
    deployment_velocity_max_ms=2.0,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    inclination_deg=51.6,
    altitude_km_min=400.0,
    altitude_km_max=450.0,
    notes=(
        "External ISS deployment via Cygnus robotic arm. "
        "Six silos × 6U = 36U total capacity per NRCSD-E unit. "
        "Deployment occurs after Cygnus departs ISS, nominally ~450 km altitude. "
        "Min three deployment switches required on payload."
    ),
)

NRCSD_DOUBLEWIDE = DeployerSpec(
    name="NanoRacks NRCSD DoubleWide",
    provider="NanoRacks / Voyager Space",
    max_units=12.0,
    supported_form_factors=["6U", "12U"],
    max_payload_mass_kg=28.0,
    deployment_velocity_min_ms=0.5,
    deployment_velocity_max_ms=2.0,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    inclination_deg=51.6,
    altitude_km_min=400.0,
    altitude_km_max=420.0,
    notes="Accommodates 2 × 6U (12U equivalent). ISS-based. Up to 48U per mission cycle.",
)

ISIPOD_3U = DeployerSpec(
    name="ISIS ISIPOD 3U",
    provider="Innovative Solutions In Space (ISIS)",
    max_units=3.0,
    supported_form_factors=["1U", "2U", "3U"],
    max_payload_mass_kg=6.0,
    deployment_velocity_min_ms=1.5,
    deployment_velocity_max_ms=2.5,
    tip_off_rate_max_deg_s=3.0,
    mechanism="spring",
    notes="Standard ISIS deployer. Internal 340.5 × 100 × 100 mm. PC/104 compatible.",
)

ISIPOD_6U = DeployerSpec(
    name="ISIS ISIPOD 6U",
    provider="Innovative Solutions In Space (ISIS)",
    max_units=6.0,
    supported_form_factors=["6U"],
    max_payload_mass_kg=12.0,
    deployment_velocity_min_ms=1.5,
    deployment_velocity_max_ms=2.5,
    tip_off_rate_max_deg_s=3.0,
    mechanism="spring",
    notes="Internal 226.3 × 100 × 366 mm. Widely used on PSLV and Falcon rideshare.",
)

EXOPOD_6U = DeployerSpec(
    name="Exolaunch EXOpod 6U",
    provider="Exolaunch GmbH",
    max_units=6.0,
    supported_form_factors=["6U"],
    max_payload_mass_kg=12.0,
    deployment_velocity_min_ms=1.2,
    deployment_velocity_max_ms=2.4,
    tip_off_rate_max_deg_s=10.0,
    mechanism="spring",
    notes=(
        "Primary deployer on SpaceX Transporter rideshare missions. "
        "Passive tip-off damping; max <10 deg/s all axes (EXOpod User Manual). "
        "Customizable ejection velocity available."
    ),
)

EXOPOD_12U = DeployerSpec(
    name="Exolaunch EXOpod 12U",
    provider="Exolaunch GmbH",
    max_units=12.0,
    supported_form_factors=["12U"],
    max_payload_mass_kg=24.0,
    deployment_velocity_min_ms=1.2,
    deployment_velocity_max_ms=2.4,
    tip_off_rate_max_deg_s=10.0,
    mechanism="spring",
    notes="Used on SpaceX Transporter rideshare missions. Max tip-off <10 deg/s all axes.",
)

SHERPA_FX = DeployerSpec(
    name="SpaceFlight Sherpa-FX OTV Deployer",
    provider="SpaceFlight Inc.",
    max_units=12.0,
    supported_form_factors=["1U", "2U", "3U", "6U", "12U"],
    max_payload_mass_kg=300.0,
    deployment_velocity_min_ms=1.0,
    deployment_velocity_max_ms=3.0,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    notes=(
        "Orbital transfer vehicle; orbit depends on rideshare primary mission. "
        "Supports multiple deployer rail configurations."
    ),
)

ROCKETLAB_ELECTRON = DeployerSpec(
    name="Rocket Lab Electron Rideshare Deployer",
    provider="Rocket Lab",
    max_units=12.0,
    supported_form_factors=["1U", "2U", "3U", "6U", "12U"],
    max_payload_mass_kg=30.0,
    deployment_velocity_min_ms=1.0,
    deployment_velocity_max_ms=2.5,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    notes=(
        "Electron launch vehicle. Primarily SSO (97–98°) at 400–1200 km. "
        "Kick Stage enables precise orbit insertion."
    ),
)

POCKETQUBE_DEPLOYER = DeployerSpec(
    name="PocketQube Deployer (4p)",
    provider="Alba Orbital / Various",
    max_units=4.0,
    supported_form_factors=["1p", "2p", "3p"],
    max_payload_mass_kg=1.0,
    deployment_velocity_min_ms=0.5,
    deployment_velocity_max_ms=2.0,
    tip_off_rate_max_deg_s=5.0,
    mechanism="spring",
    notes="Standard PocketQube deployer, 4p capacity per tube. Used on PSLV rideshare.",
)

# -- JAXA J-SSOD (JEM Small Satellite Orbital Deployer) --------------------

JSSOD = DeployerSpec(
    name="JAXA J-SSOD (10 cm class)",
    provider="JAXA",
    max_units=6.0,
    supported_form_factors=["1U", "2U", "3U"],
    max_payload_mass_kg=4.0,
    deployment_velocity_min_ms=1.1,
    deployment_velocity_max_ms=1.7,
    mechanism="spring",
    inclination_deg=51.6,
    altitude_km_min=380.0,
    altitude_km_max=420.0,
    notes=(
        "ISS JEM Kibo airlock deployment. Two 3U deployers (JEM-SDP), "
        "deploying 45° nadir-aft. Min fundamental freq ≥100 Hz. "
        "≥3 independent inhibits required. ≥2 deployment switches on −Z face. "
        "30-min post-ejection delay for deployable activation and RF. "
        "Ballistic number ≤100 kg/m². "
        "Thermal: −15 to +60 °C outside ISS. "
        "Source: JAXA JEM Handbook Vol. 8 (JX-ESPC-101133)."
    ),
)

# -- D-Orbit ION Satellite Carrier -----------------------------------------

DORBIT_ION = DeployerSpec(
    name="D-Orbit ION Satellite Carrier",
    provider="D-Orbit",
    max_units=48.0,
    supported_form_factors=["1U", "2U", "3U", "6U", "12U", "16U"],
    max_payload_mass_kg=160.0,
    mechanism="spring",
    notes=(
        "Orbital transfer vehicle with internal CubeSat dispensers. "
        "~48U total capacity; multiple slots, each up to 16U. "
        "Custom orbit insertion 400–750 km (standard), up to 2 000 km with "
        "on-board propulsion. Precise deployment timing and orbit manoeuvres "
        "between releases. Per-slot mass and environment constraints are "
        "mission-specific (ICD required). Ejection velocity and tip-off "
        "rates are proprietary/mission-specific."
    ),
)

# -- Maverick Space Systems Mercury deployers -------------------------------

MAVERICK_MERCURY_3 = DeployerSpec(
    name="Maverick Mercury-3",
    provider="Maverick Space Systems",
    max_units=3.0,
    supported_form_factors=["1U", "2U", "3U"],
    max_payload_mass_kg=6.0,
    mechanism="spring",
    notes=(
        "Lightweight 3U rail-type CubeSat dispenser. "
        "Qualified to NASA GEVS random-vibration levels. "
        "Flight heritage on Firefly Alpha and multiple other vehicles."
    ),
)

MAVERICK_MERCURY_6 = DeployerSpec(
    name="Maverick Mercury-6",
    provider="Maverick Space Systems",
    max_units=6.0,
    supported_form_factors=["3U", "6U"],
    max_payload_mass_kg=12.0,
    mechanism="spring",
    notes=(
        "6U rail-type CubeSat dispenser. "
        "Qualified to NASA GEVS random-vibration levels."
    ),
)

MAVERICK_MERCURY_12 = DeployerSpec(
    name="Maverick Mercury-12",
    provider="Maverick Space Systems",
    max_units=12.0,
    supported_form_factors=["6U", "12U"],
    max_payload_mass_kg=24.0,
    mechanism="spring",
    notes=(
        "12U rail-type CubeSat dispenser. "
        "Pre-qualified at NASA GEVS levels. Pre-assembled."
    ),
)

# ---------------------------------------------------------------------------
# Launch Providers
# ---------------------------------------------------------------------------

LAUNCH_PROVIDERS: Dict[str, LaunchProvider] = {
    "nanoracks": LaunchProvider(
        name="NanoRacks (Voyager Space)",
        website="https://nanoracks.com",
        deployers=[NRCSD, NRCSD_E, NRCSD_DOUBLEWIDE],
        notes=(
            "ISS-based deployment. Orbit: 51.6° inclination, 400–420 km. "
            "No hazardous materials. Battery energy limits apply."
        ),
    ),
    "calpoly": LaunchProvider(
        name="Cal Poly",
        website="https://www.cubesat.org",
        deployers=[PPOD_MK3],
        notes="Originator of the CubeSat standard and P-POD deployer.",
    ),
    "isis": LaunchProvider(
        name="Innovative Solutions In Space (ISIS)",
        website="https://www.isispace.nl",
        deployers=[ISIPOD_3U, ISIPOD_6U],
        notes="Dutch small satellite manufacturer and launch broker. Flight heritage since 2013.",
    ),
    "exolaunch": LaunchProvider(
        name="Exolaunch GmbH",
        website="https://exolaunch.com",
        deployers=[EXOPOD_6U, EXOPOD_12U],
        notes="German rideshare & integration company; SpaceX Transporter partner.",
    ),
    "spaceflight": LaunchProvider(
        name="SpaceFlight Inc.",
        website="https://spaceflight.com",
        deployers=[SHERPA_FX],
        notes="US rideshare aggregator with dedicated orbital transfer vehicles.",
    ),
    "rocketlab": LaunchProvider(
        name="Rocket Lab",
        website="https://www.rocketlabusa.com",
        deployers=[ROCKETLAB_ELECTRON],
        notes="Electron launch vehicle; primarily SSO missions.",
    ),
    "alba": LaunchProvider(
        name="Alba Orbital",
        website="https://www.albaorbital.com",
        deployers=[POCKETQUBE_DEPLOYER],
        notes="Scottish PocketQube specialist; Pale Blue Dot rideshare missions.",
    ),
    "jaxa": LaunchProvider(
        name="Japan Aerospace Exploration Agency (JAXA)",
        website="https://aerospacebiz.jaxa.jp/solution/satellite/",
        deployers=[JSSOD],
        notes=(
            "ISS-based JEM Small Satellite Orbital Deployer (J-SSOD). "
            "Orbit: 51.6° incl, 380–420 km. Deployment from Kibo airlock."
        ),
    ),
    "dorbit": LaunchProvider(
        name="D-Orbit",
        website="https://www.dorbit.space",
        deployers=[DORBIT_ION],
        notes=(
            "Italian OTV operator. ION Satellite Carrier provides precise "
            "deployment across multiple orbits within a single mission. "
            "Launches as secondary payload on Falcon 9, Vega-C, etc."
        ),
    ),
    "maverick": LaunchProvider(
        name="Maverick Space Systems",
        website="https://maverickspace.com",
        deployers=[MAVERICK_MERCURY_3, MAVERICK_MERCURY_6, MAVERICK_MERCURY_12],
        notes=(
            "US deployer manufacturer (San Luis Obispo, CA). "
            "NASA GEVS-qualified Mercury-series dispensers. "
            "Compatible with Firefly Alpha, ABL RS1, and other launch vehicles."
        ),
    ),
}


[docs] def get_compatible_providers(form_factor_key: str) -> List[LaunchProvider]: """Return all launch providers whose deployers support *form_factor_key*. Parameters ---------- form_factor_key: Form factor key, e.g. ``'1U'``, ``'6U'``, ``'1p'``. Returns ------- list[LaunchProvider] Providers with at least one deployer accepting the given form factor. """ result: List[LaunchProvider] = [] for provider in LAUNCH_PROVIDERS.values(): for deployer in provider.deployers: if form_factor_key in deployer.supported_form_factors: result.append(provider) break return result