Ephemerista User Manual¶
Table of Contents¶
Introduction¶
Ephemerista is a comprehensive space mission analysis tool that provides capabilities for satellite constellation design, orbital propagation, visibility analysis, communication link budgets, coverage analysis, and navigation performance evaluation. It offers both a web-based graphical user interface (GUI) and a Python API for programmatic access.
Key Features¶
Interactive 3D visualization of satellites and ground stations
Multiple orbital propagation methods (SGP4, numerical, semi-analytical, OEM)
Visibility and coverage analysis for satellite constellations
RF link budget calculations with interference modeling
Navigation dilution of precision (DOP) analysis
Constellation design tools (Walker patterns, Streets-of-Coverage)
Communication system modeling with antenna patterns
Extensible framework for custom analysis workflows
Architecture Overview¶
Ephemerista is built on several core concepts:
Scenarios: Central container for mission configurations (see Scenarios – ephemerista.scenarios)
Assets: Spacecraft and ground stations with associated properties (see Assets – ephemerista.assets)
Propagators: Orbital mechanics engines (SGP4, numerical, semi-analytical) (see Orbit Propagators – ephemerista.propagators)
Ensembles: Collections of propagated trajectories (see Scenarios – ephemerista.scenarios)
Analysis Modules: Specialized calculators for different mission aspects (see Analysis – ephemerista.analysis)
GUI vs Python API¶
Use the GUI when:
Performing interactive mission design
Visualizing orbital scenarios in 3D
Quick prototyping and what-if analyses
Demonstrating concepts to stakeholders
Use the Python API when:
Automating complex analysis workflows
Performing batch processing or optimization
Integrating with other tools
Developing custom analysis modules
For complete API documentation, see the API.
Installation and Setup¶
System Requirements¶
GUI Requirements¶
Modern web browser with WebGL support
Internet connection for initial loading
Recommended: Chrome, Firefox, or Safari
Python API Requirements¶
Python 3.12 or higher
Required data files: Earth Orientation Parameters (EOP), planetary ephemerides, and Orekit data package
Installation¶
GUI Access¶
Navigate to the Ephemerista web interface
The application loads with a default empty scenario

Main application interface showing the three-panel layout with scenario configuration on the left, 3D visualization in the center, and analysis panel on the right¶
Python API Installation¶
pip install ephemerista
Data File Setup¶
Both GUI and Python require data files for high-precision calculations:
Earth Orientation Parameters (EOP)¶
File:
finals2000A.all.csv
from IERSPurpose: High-precision coordinate transformations
Update Frequency: Weekly recommended
Planetary Ephemerides¶
File: DE440s or similar JPL ephemeris file
Purpose: Precise planetary positions for perturbation calculations
Format: SPICE kernel (.bsp)
Initialization¶
GUI Initialization¶
The GUI automatically loads required data files when starting.
Python Initialization¶
import ephemerista
# Initialize with data directory containing EOP and ephemeris files
ephemerista.init(
eop_file="path/to/finals2000A.all.csv",
ephemeris_file="path/to/de440s.bsp",
orekit_data_dir="path/to/orekit-data" # Optional
)
[CODE BLOCK PLACEHOLDER: Complete initialization example with error handling]
Getting Started¶
GUI: Launching the Application¶
The Ephemerista GUI consists of three main sections:
Left Panel: Scenario configuration forms
Center Panel: 3D visualization and analysis results (tabbed interface)
Right Panel: Analysis controls and results

Interface overview with labeled panels showing the main components of the Ephemerista GUI¶
Python: Basic Script Structure¶
#!/usr/bin/env python3
import ephemerista
from ephemerista import Scenario
from ephemerista.time import Epoch, TimeScale
from datetime import datetime, timezone
# Initialize Ephemerista
ephemerista.init(
eop_file="data/finals2000A.all.csv",
ephemeris_file="data/de440s.bsp"
)
# Create a scenario
scenario = Scenario(
name="My First Mission",
start_time=Epoch.from_datetime(
datetime(2024, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
TimeScale.UTC
),
end_time=Epoch.from_datetime(
datetime(2024, 1, 2, 12, 0, 0, tzinfo=timezone.utc),
TimeScale.UTC
),
time_step=60.0 # seconds
)
Quick Example: Simple Scenario¶
GUI Approach¶
Enter scenario name: “LEO Observation Mission”
Set start and end times using the date/time pickers (see Scenario Configuration)
Click “Add Asset” → “Spacecraft”
Select “SGP4” propagator and paste a TLE (see Spacecraft Configuration)
Click “Add Asset” → “Ground Station”
Enter location coordinates (see Ground Station Configuration)
Navigate to “Analyses” tab and select “Visibility” (see Visibility Analysis)
Click “Run Analysis”
Python Approach¶
from ephemerista.assets import Spacecraft, GroundStation
from ephemerista.propagators.sgp4 import Sgp4Propagator
# Create spacecraft from TLE
tle_line1 = "1 25544U 98067A 21001.00000000 .00000000 00000-0 00000+0 0 06"
tle_line2 = "2 25544 51.6400 000.0000 0000000 0.0000 000.0000 15.50000000000000"
spacecraft = Spacecraft(
name="ISS",
propagator=Sgp4Propagator.from_tle(tle_line1, tle_line2)
)
# Create ground station
ground_station = GroundStation(
name="Mission Control",
longitude=-95.4,
latitude=29.6,
altitude=50.0,
minimum_elevation=10.0
)
# Add to scenario
scenario.add_asset(spacecraft)
scenario.add_asset(ground_station)
# Run visibility analysis
from ephemerista.analysis.visibility import Visibility
visibility_analyzer = Visibility(scenario)
results = visibility_analyzer.calculate()
Scenario Configuration¶
Basic Scenario Setup¶
Scenarios are the central containers for mission analysis. They define the temporal boundaries and coordinate systems for all calculations.
See also
For detailed API documentation, see Scenarios – ephemerista.scenarios and Time – ephemerista.time.
GUI Configuration¶
Scenario Name: Enter a descriptive name for your scenario
Time Configuration:
Start Time: Set the simulation start time (UTC)
End Time: Set the simulation end time (UTC)
Time Step: Define the temporal resolution in seconds
Reference Frame: Select the coordinate reference frame (typically ICRF)
Origin: Choose the central body (typically Earth)

Scenario configuration form showing time settings, reference frame selection, and origin selection¶
Python Configuration¶
from ephemerista import Scenario
from ephemerista.time import Epoch, TimeScale
from ephemerista.frames import ReferenceFrame
from datetime import datetime, timezone
# Create a new scenario
scenario = Scenario(
name="Mission Analysis Example",
start_time=Epoch.from_datetime(
datetime(2024, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
TimeScale.UTC
),
end_time=Epoch.from_datetime(
datetime(2024, 1, 2, 12, 0, 0, tzinfo=timezone.utc),
TimeScale.UTC
),
time_step=60.0 # seconds
)
# Configure reference frame (optional, defaults to ICRF)
scenario.reference_frame = ReferenceFrame.ICRF
Time Scale Management¶
Ephemerista supports multiple time scales:
UTC: Coordinated Universal Time
TAI: International Atomic Time
TT: Terrestrial Time
GPS: GPS Time
GUI Time Scale Selection¶

Time scale selection dropdown with available options (UTC, TAI, TT, GPS)¶
Python Time Scale Usage¶
from ephemerista.time import TimeScale
# Available time scales
time_scales = [
TimeScale.UTC, # Coordinated Universal Time
TimeScale.TAI, # International Atomic Time
TimeScale.TT, # Terrestrial Time
TimeScale.GPS # GPS Time
]
# Convert between time scales
utc_epoch = Epoch.from_datetime(datetime.now(timezone.utc), TimeScale.UTC)
tai_epoch = utc_epoch.to_time_scale(TimeScale.TAI)
Reference Frames¶
Configure coordinate reference frames:
See also
For complete reference frame documentation, see Frames – ephemerista.frames.
Common Reference Frames¶
ICRF: International Celestial Reference Frame
GCRF: Geocentric Celestial Reference Frame
ITRF: International Terrestrial Reference Frame
EME2000: Earth Mean Equator 2000
Python Reference Frame Configuration¶
from ephemerista.frames import ReferenceFrame
# Common reference frames
frames = {
"ICRF": ReferenceFrame.ICRF, # International Celestial Reference Frame
"GCRF": ReferenceFrame.GCRF, # Geocentric Celestial Reference Frame
"ITRF": ReferenceFrame.ITRF, # International Terrestrial Reference Frame
"EME2000": ReferenceFrame.EME2000 # Earth Mean Equator 2000
}
scenario.reference_frame = ReferenceFrame.ICRF
Spacecraft and Ground Station Configuration¶
Adding Assets¶
Assets are the physical entities in your scenario - spacecraft orbiting in space and ground stations on Earth.
See also
For complete asset API documentation, see Assets – ephemerista.assets.
GUI: Adding Assets¶
Click the “Add Asset” button in the scenario configuration panel
Choose between:
Spacecraft: Orbiting vehicles
Ground Station: Earth-based facilities
[SCREENSHOT PLACEHOLDER: Asset type selection dialog]
Python: Creating Assets¶
from ephemerista.assets import Spacecraft, GroundStation
Spacecraft Configuration¶
Propagator Types¶
Ephemerista supports multiple propagation methods:
SGP4: For TLE-based propagation
Numerical: High-precision numerical integration
Semi-Analytical: Analytical mean element propagation
OEM: Orbit Ephemeris Message input
See also
For detailed propagator documentation, see Orbit Propagators – ephemerista.propagators.
GUI: Spacecraft Setup¶
Name: Enter a unique identifier for the spacecraft
Propagator Type: Select from dropdown menu
Configure propagator-specific parameters
[SCREENSHOT PLACEHOLDER: Spacecraft configuration form with propagator selection]
Python: Spacecraft Creation¶
Using SGP4 with TLE¶
from ephemerista.propagators.sgp4 import Sgp4Propagator
# Create spacecraft from TLE
tle_line1 = "1 25544U 98067A 21001.00000000 .00000000 00000-0 00000+0 0 06"
tle_line2 = "2 25544 51.6400 000.0000 0000000 0.0000 000.0000 15.50000000000000"
spacecraft_tle = Spacecraft(
name="ISS",
propagator=Sgp4Propagator.from_tle(tle_line1, tle_line2)
)
scenario.add_asset(spacecraft_tle)
Using Keplerian Elements¶
from ephemerista.coords.twobody import KeplerianElements
from ephemerista.propagators.sgp4 import Sgp4Propagator
# Define orbital elements
elements = KeplerianElements(
semi_major_axis=7000.0, # km
eccentricity=0.001,
inclination=98.0, # degrees
raan=0.0, # Right Ascension of Ascending Node
argument_of_periapsis=0.0,
true_anomaly=0.0
)
# Create spacecraft with SGP4 propagator
spacecraft = Spacecraft(
name="Earth Observer 1",
propagator=Sgp4Propagator.from_keplerian_elements(
elements,
epoch=scenario.start_time
)
)
scenario.add_asset(spacecraft)
High-Precision Numerical Propagation¶
from ephemerista.propagators.orekit.numerical import NumericalPropagator
from ephemerista.coords.trajectories import CartesianState
# Define initial state
initial_state = CartesianState(
position=[7000.0, 0.0, 0.0], # km
velocity=[0.0, 7.5, 0.0], # km/s
epoch=scenario.start_time,
frame=ReferenceFrame.ICRF
)
# Configure numerical propagator with force models
numerical_prop = NumericalPropagator(
initial_state=initial_state,
gravity_degree=20, # Gravity field degree
gravity_order=20, # Gravity field order
include_drag=True, # Atmospheric drag
include_srp=True, # Solar radiation pressure
include_third_body=True # Moon/Sun perturbations
)
spacecraft_numerical = Spacecraft(
name="High Precision Satellite",
propagator=numerical_prop
)
Ground Station Configuration¶
Ground stations are fixed locations on Earth’s surface used for communication with spacecraft.
GUI: Ground Station Setup¶
Name: Enter ground station identifier
Location:
Longitude: East longitude in degrees
Latitude: North latitude in degrees
Altitude: Height above sea level (meters)
Minimum Elevation: Minimum satellite elevation angle for visibility (degrees)
[SCREENSHOT PLACEHOLDER: Ground station configuration form with geographic coordinates]
Python: Ground Station Creation¶
# Create ground station
ground_station = GroundStation(
name="Deep Space Network Station",
longitude=243.11, # degrees East
latitude=35.42, # degrees North
altitude=1036.0, # meters above sea level
minimum_elevation=10.0 # degrees
)
scenario.add_asset(ground_station)
Asset Properties and Metadata¶
Assets can have custom properties for advanced analysis:
# Add custom properties to assets
spacecraft.properties = {
"mass": 500.0, # kg
"cross_section": 2.5, # m²
"drag_coefficient": 2.2,
"srp_coefficient": 1.8,
"mission_type": "Earth Observation"
}
# Asset identification and grouping
spacecraft.tags = ["EO", "polar", "sun_synchronous"]
ground_station.tags = ["DSN", "primary", "X_band"]
Propagation Setup¶
Orbit Types and Quick Setup¶
GUI: Quick Orbit Setup¶
Ephemerista provides quick setup options for common orbital regimes:
Low Earth Orbit (LEO)¶
Altitude range: 200-2000 km
Quick setup with altitude and inclination
Automatic calculation of orbital period
[SCREENSHOT PLACEHOLDER: LEO quick setup form]
Medium Earth Orbit (MEO)¶
Altitude range: 2000-35786 km
Common for navigation satellites
Semi-synchronous options available
[SCREENSHOT PLACEHOLDER: MEO quick setup form]
Geostationary Earth Orbit (GEO)¶
Fixed altitude at 35,786 km
Zero inclination and eccentricity
Automatic longitude positioning
[SCREENSHOT PLACEHOLDER: GEO quick setup form]
Sun-Synchronous Orbit (SSO)¶
Maintains consistent solar illumination
Automatic inclination calculation based on altitude
Ideal for Earth observation missions
[SCREENSHOT PLACEHOLDER: SSO quick setup form]
Python: Orbit Type Configuration¶
# LEO Example
leo_elements = KeplerianElements(
semi_major_axis=6878.0, # 500 km altitude
eccentricity=0.0,
inclination=97.4, # Sun-synchronous at this altitude
raan=0.0,
argument_of_periapsis=0.0,
true_anomaly=0.0
)
# GEO Example
geo_elements = KeplerianElements(
semi_major_axis=42164.0, # GEO radius
eccentricity=0.0,
inclination=0.0,
raan=0.0,
argument_of_periapsis=0.0,
true_anomaly=0.0
)
Propagator Selection Guide¶
SGP4 Propagator¶
Best for:
TLE-based analysis
Large constellation studies
Rapid computation requirements
Limitations:
Lower accuracy for long-term predictions
Not suitable for high-precision maneuver planning
Numerical Propagator¶
Best for:
High-precision mission analysis
Maneuver planning
Formation flying studies
Configuration:
numerical_prop = NumericalPropagator(
initial_state=initial_state,
gravity_degree=50,
gravity_order=50,
atmospheric_model="NRLMSISE00",
solar_activity="STRONG",
integrator="DormandPrince853",
min_step=1e-3,
max_step=300.0
)
Semi-Analytical Propagator¶
Best for:
Long-term evolution studies
Constellation maintenance analysis
Orbit lifetime predictions
from ephemerista.propagators.orekit.semianalytical import SemiAnalyticalPropagator
semi_analytical_prop = SemiAnalyticalPropagator(
initial_state=initial_state,
propagation_type="DSST", # Draper Semi-analytical Satellite Theory
mean_elements=True,
short_period_corrections=True
)
OEM (Orbit Ephemeris Message) Support¶
For precise ephemeris data:
GUI: OEM Import¶
Select OEM propagator type
Upload or paste OEM file content
Validate ephemeris data format
Set interpolation parameters
[SCREENSHOT PLACEHOLDER: OEM file upload interface]
Python: OEM Usage¶
from ephemerista.propagators.oem import OemPropagator
# Load OEM file
oem_prop = OemPropagator.from_file("spacecraft_ephemeris.oem")
# Create spacecraft from OEM
spacecraft_oem = Spacecraft(
name="Precision Ephemeris Satellite",
propagator=oem_prop
)
Ensemble Propagation¶
For efficient analysis of multiple assets:
# Propagate entire scenario
ensemble = scenario.propagate()
# Access individual trajectories
for asset_id, trajectory in ensemble.trajectories.items():
asset_name = ensemble.get_asset_name(asset_id)
times = trajectory.times
positions = trajectory.positions
velocities = trajectory.velocities
Visibility Analysis¶
Understanding Visibility¶
Visibility analysis determines when spacecraft are visible from ground stations, accounting for elevation constraints and Earth obstruction.
See also
For complete visibility analysis API documentation, see Visibility – ephemerista.analysis.visibility.
GUI: Running Visibility Analysis¶
Navigate to the “Analyses” tab
Select “Visibility” from the analysis type dropdown
Click “Run Analysis”
[SCREENSHOT PLACEHOLDER: Analysis panel with visibility option selected]
Visibility Results Display¶
The GUI displays visibility results in multiple formats:
Pass Summary Table: Shows all visibility windows
Pass Timeline: Visual representation of passes
Detailed Pass Information: Elevation, azimuth, and range data
[SCREENSHOT PLACEHOLDER: Visibility results table showing pass data]
Python: Visibility Analysis¶
from ephemerista.analysis.visibility import Visibility
# Create visibility analyzer
visibility_analyzer = Visibility(scenario)
# Compute visibility
visibility_results = visibility_analyzer.calculate()
# Access visibility windows
for observer_id, observer_results in visibility_results.items():
for target_id, passes in observer_results.items():
for pass_data in passes:
print(f"Pass from {pass_data.start_time} to {pass_data.end_time}")
print(f"Maximum elevation: {pass_data.max_elevation} degrees")
Advanced Visibility Options¶
Custom Elevation Masks¶
from ephemerista.analysis.visibility import ElevationMask
# Define complex elevation mask
elevation_mask = ElevationMask({
0: 10.0, # 10° minimum at azimuth 0°
90: 15.0, # 15° minimum at azimuth 90°
180: 8.0, # 8° minimum at azimuth 180°
270: 12.0 # 12° minimum at azimuth 270°
})
# Apply mask to ground station
ground_station.elevation_mask = elevation_mask
Visibility Constraints¶
# Configure constraints
visibility_analyzer = Visibility(
scenario,
min_elevation=5.0, # degrees
max_range=2000.0, # km
eclipse_constraint=True, # Exclude eclipsed satellites
sun_elevation_limit=-6.0 # Twilight constraint
)
Visualization Options¶
GUI: 3D Visualization¶
Ground Track: Satellite orbital path projected onto Earth surface
Visibility Cones: Ground station coverage areas
Real-time Position: Current satellite locations
[SCREENSHOT PLACEHOLDER: 3D visualization showing satellite ground tracks and visibility cones]
Python: Plotting Visibility¶
from ephemerista.plot.visibility import plot_visibility_pass
# Plot individual pass details
pass_plot = plot_visibility_pass(
pass_data=passes[0],
show_elevation=True,
show_azimuth=True,
show_range=True
)
Communication Systems Configuration¶
Overview¶
Communication systems model the RF links between spacecraft and ground stations, including antennas, transmitters, receivers, and channels.
See also
For complete communication systems API documentation, see Comms – ephemerista.comms.
Antenna Configuration¶
GUI: Adding Antennas¶
In the asset configuration, expand the “Communication Systems” section
Click “Add Communication System”
Configure antenna parameters
[SCREENSHOT PLACEHOLDER: Communication system configuration section]
Python: Antenna Types¶
Simple Antenna¶
from ephemerista.comms.antennas import SimpleAntenna
# Create simple antenna
antenna = SimpleAntenna(
gain=20.0, # Peak gain in dB
beamwidth=10.0, # Half-power beamwidth in degrees
design_frequency=2.4e9, # Hz
boresight_vector=[0, 0, 1] # Antenna pointing direction
)
Complex Antenna Patterns¶
from ephemerista.comms.antennas import (
GaussianPattern,
ParabolicPattern,
DipolePattern
)
# Gaussian pattern antenna
gaussian_antenna = GaussianPattern(
peak_gain=25.0,
half_power_beamwidth=3.0,
design_frequency=8.4e9
)
# Parabolic reflector
parabolic_antenna = ParabolicPattern(
diameter=2.4, # meters
efficiency=0.65,
design_frequency=8.4e9,
feed_blockage_ratio=0.1
)
Transmitter and Receiver Configuration¶
GUI Configuration¶
Transmitter:
Power (watts)
Frequency (Hz)
Line losses (dB)
Output back-off (dB)
Receiver:
Frequency (Hz)
System noise temperature (Kelvin)
Implementation losses (dB)
[SCREENSHOT PLACEHOLDER: Transmitter and receiver configuration forms]
Python Configuration¶
from ephemerista.comms.transmitter import Transmitter
from ephemerista.comms.receiver import Receiver
transmitter = Transmitter(
power=10.0, # Transmit power in watts
frequency=8.4e9, # Operating frequency in Hz
line_loss=1.5, # System losses in dB
output_backoff=3.0, # Power amplifier backoff in dB
modulation="QPSK", # Modulation scheme
symbol_rate=1e6 # Symbols per second
)
receiver = Receiver(
frequency=8.4e9,
system_noise_temperature=150.0, # System noise temperature in Kelvin
implementation_loss=1.0, # Implementation losses in dB
adc_bits=12, # ADC resolution
bandwidth=2e6 # Receiver bandwidth in Hz
)
Channel Configuration¶
Channels define the communication link characteristics:
GUI: Channel Setup¶
Channel Name: Descriptive identifier
Link Type:
Uplink: Ground-to-satellite
Downlink: Satellite-to-ground
Crosslink: Satellite-to-satellite
Data Rate: Information rate in bits per second
Required Eb/N0: Energy per bit to noise ratio (dB)
Link Margin: Additional margin for link reliability (dB)
[SCREENSHOT PLACEHOLDER: Channel configuration form with all parameters]
Python: Channel Definition¶
from ephemerista.comms.channels import Channel
# Define communication channel
uplink_channel = Channel(
name="S-band Uplink",
link_type="uplink",
frequency=2.1e9,
data_rate=1e6, # bits per second
required_eb_n0=9.6, # Required Eb/N0 in dB
link_margin=3.0, # Design margin in dB
modulation="QPSK",
forward_error_correction=0.5, # Coding rate
roll_off_factor=0.35
)
Communication System Integration¶
from ephemerista.comms.systems import CommunicationSystem
# Create integrated communication system
comm_system = CommunicationSystem(
name="Primary Communication System",
antenna=gaussian_antenna,
transmitter=transmitter,
receiver=receiver,
channels=[uplink_channel]
)
# Add to spacecraft
spacecraft.add_communication_system(comm_system)
Link Budget Analysis¶
Overview¶
Link budget analysis calculates the performance of RF communication links, accounting for all gains and losses in the signal path.
See also
For complete link budget analysis API documentation, see Link Budgets – ephemerista.analysis.link_budget.
GUI: Running Link Budget Analysis¶
Ensure communication systems are configured for all assets
Navigate to the “Analyses” tab
Select “Link Budget” from the analysis dropdown
Configure analysis options:
Include Interference: Enable interference calculations
Include Environmental Losses: Account for atmospheric effects
Click “Run Analysis”
[SCREENSHOT PLACEHOLDER: Link budget analysis configuration options]
Python: Link Budget Calculation¶
from ephemerista.analysis.link_budget import LinkBudget
# Create link budget analyzer
link_budget_analyzer = LinkBudget(scenario)
# Compute link budgets
link_budget_results = link_budget_analyzer.calculate()
# Access link performance metrics
for link_id, link_data in link_budget_results.items():
transmitter_name = link_data.transmitter_name
receiver_name = link_data.receiver_name
print(f"Link: {transmitter_name} -> {receiver_name}")
print(f"EIRP: {link_data.eirp} dBW")
print(f"Free Space Path Loss: {link_data.fspl} dB")
print(f"C/N0: {link_data.cn0} dB-Hz")
print(f"Eb/N0: {link_data.eb_n0} dB")
print(f"Link Margin: {link_data.link_margin} dB")
Understanding Link Budget Results¶
Key Metrics¶
EIRP: Equivalent Isotropically Radiated Power (dBW)
Free Space Path Loss: Signal attenuation due to distance (dB)
G/T: Receiver figure of merit (dB/K)
C/N0: Carrier-to-noise density ratio (dB-Hz)
Eb/N0: Energy per bit to noise density ratio (dB)
Link Margin: Available margin above required threshold (dB)
[SCREENSHOT PLACEHOLDER: Link budget results table showing all performance metrics]
Environmental Effects¶
Atmospheric Losses¶
# Configure atmospheric model
link_budget_analyzer = LinkBudget(
scenario,
atmospheric_model="ITU-R_P.676",
surface_pressure=1013.25, # hPa
surface_temperature=15.0, # °C
relative_humidity=50.0, # %
)
Rain Attenuation¶
# Configure rain model
link_budget_analyzer = LinkBudget(
scenario,
rain_model="ITU-R_P.618",
rain_rate=25.0, # mm/hr exceeded 0.01% of time
rain_height=2.0, # km
)
Interference Analysis¶
When enabled, interference analysis provides:
Interference power: Unwanted signal levels
C/I ratio: Carrier-to-interference ratio
Overall degradation: Combined effect on link performance
[SCREENSHOT PLACEHOLDER: Interference analysis results with C/I ratios]
Constellation Configuration¶
Constellation Design Patterns¶
Ephemerista supports several constellation architectures:
See also
For complete constellation design API documentation, see Constellations – ephemerista.constellation.
Walker Constellations¶
GUI: Walker Configuration¶
Select “Add Constellation” in the scenario panel
Choose constellation type:
Walker Star: Symmetric distribution
Walker Delta: Phased distribution
[SCREENSHOT PLACEHOLDER: Walker constellation configuration form]
Python: Walker Star¶
from ephemerista.constellation.design import WalkerStar
walker_star = WalkerStar(
num_satellites=24, # Total satellites
num_planes=4, # Number of orbital planes
inclination=55.0, # Orbital inclination in degrees
altitude=20200, # Orbital altitude in km
phasing_parameter=1 # Inter-plane phasing
)
# Generate constellation
constellation_assets = walker_star.generate_assets(
base_name="GPS",
start_epoch=scenario.start_time
)
# Add to scenario
for asset in constellation_assets:
scenario.add_asset(asset)
Python: Walker Delta¶
from ephemerista.constellation.design import WalkerDelta
walker_delta = WalkerDelta(
num_satellites=27,
num_planes=3,
inclination=86.4,
altitude=1414,
pattern_factor=1 # Delta pattern phasing
)
constellation_assets = walker_delta.generate_assets(
base_name="Iridium",
start_epoch=scenario.start_time,
include_spares=True # Include spare satellites
)
Streets-of-Coverage¶
Streets-of-Coverage patterns provide continuous coverage along specific latitudes:
from ephemerista.constellation.design import StreetOfCoverage
street_pattern = StreetOfCoverage(
latitude_coverage=(-70, 70), # Coverage latitude bounds
longitude_spacing=22.5, # Longitude separation in degrees
inclination=99.5, # Sun-synchronous inclination
altitude=700, # LEO altitude in km
local_time_ascending_node=10.5 # LTAN in hours
)
street_constellation = street_pattern.generate_assets(
base_name="EarthObserver",
start_epoch=scenario.start_time
)
Custom Constellation Design¶
from ephemerista.constellation.plane import OrbitalPlane
# Define custom orbital planes
plane_1 = OrbitalPlane(
inclination=98.7,
raan=0.0,
satellites_per_plane=5,
altitude=600,
true_anomaly_offset=0.0
)
plane_2 = OrbitalPlane(
inclination=98.7,
raan=120.0,
satellites_per_plane=5,
altitude=600,
true_anomaly_offset=72.0 # Phase offset
)
# Combine into custom constellation
custom_constellation = [plane_1, plane_2]
Constellation Visualization¶
GUI: 3D Constellation Display¶
The 3D viewer displays:
All constellation satellites simultaneously
Orbital planes and satellite distribution
Ground track patterns
Real-time constellation evolution
[SCREENSHOT PLACEHOLDER: 3D visualization of a Walker constellation showing multiple orbital planes]
Coverage Analysis¶
Overview¶
Coverage analysis determines how well a satellite constellation covers geographic areas of interest over time.
See also
For complete coverage analysis API documentation, see Coverage – ephemerista.analysis.coverage.
Defining Areas of Interest¶
GUI: Area Definition¶
Click “Add Area of Interest” in the scenario configuration
Define the geographic region:
GeoJSON Import: Upload polygon definitions
Manual Definition: Enter coordinate points
Shape Tools: Use built-in drawing tools
[SCREENSHOT PLACEHOLDER: Area of interest definition interface with map view]
Python: Area Definition¶
See also
For area shapes API documentation, see Orbit Shapes – ephemerista.coords.shapes.
from ephemerista.coords.shapes import CircularArea, RectangularArea
# Circular coverage area
circular_area = CircularArea(
center_latitude=40.7128, # New York City
center_longitude=-74.0060,
radius=500.0,
name="NYC Metropolitan Area"
)
# Rectangular coverage area
rectangular_area = RectangularArea(
southwest_corner=(25.0, -125.0), # lat, lon
northeast_corner=(49.0, -66.0), # Continental US
name="Continental United States"
)
scenario.add_area_of_interest(circular_area)
scenario.add_area_of_interest(rectangular_area)
Running Coverage Analysis¶
GUI: Coverage Configuration¶
Select “Coverage” analysis type
Specify parameters:
Temporal Resolution: Time step for coverage calculation
Minimum Elevation: Required satellite elevation
Minimum Contact Duration: Required visibility time
[SCREENSHOT PLACEHOLDER: Coverage analysis configuration panel]
Python: Coverage Calculation¶
from ephemerista.analysis.coverage import Coverage
# Create coverage analyzer
coverage_analyzer = Coverage(
scenario,
temporal_resolution=300, # 5-minute intervals
spatial_resolution=1.0, # 1-degree grid
min_elevation=10.0,
include_eclipse_periods=False
)
# Compute coverage
coverage_results = coverage_analyzer.calculate()
# Access coverage statistics
for area_id, area_results in coverage_results.items():
area_name = area_results.area_name
coverage_percentage = area_results.coverage_percentage
max_gap_hours = area_results.max_gap_duration / 3600
mean_revisit_time_hours = area_results.mean_revisit_time / 3600
print(f"Area: {area_name}")
print(f"Coverage: {coverage_percentage:.1f}%")
print(f"Max gap: {max_gap_hours:.1f} hours")
print(f"Mean revisit: {mean_revisit_time_hours:.1f} hours")
Understanding Coverage Results¶
Coverage Metrics¶
Coverage Percentage: Fraction of area covered
Maximum Gap: Longest period without coverage
Revisit Time: Time between successive coverage events
Mean Access Duration: Average contact time
[SCREENSHOT PLACEHOLDER: Coverage metrics summary table]
Coverage Visualization¶
Spatial Coverage Maps: Geographic distribution of coverage
Temporal Coverage: Coverage availability over time
Gap Analysis: Identification of coverage holes
[SCREENSHOT PLACEHOLDER: Coverage map showing colored regions indicating coverage levels]
Visualization and Data Export¶
GUI: 3D Visualization¶
Visualization Controls¶
Orbit: Click and drag to rotate view
Pan: Right-click and drag to pan
Zoom: Mouse wheel or pinch to zoom
Reset View: Return to default perspective
[SCREENSHOT PLACEHOLDER: 3D viewer with visible camera control indicators]
Display Elements¶
Earth Model: High-resolution Earth texture
Satellite Models: 3D satellite representations
Orbital Paths: Historical and predicted trajectories
Ground Station Markers: Fixed Earth locations
Visibility Cones: Ground station coverage areas
Coverage Areas: Color-coded coverage regions
Time Controls¶
Play/Pause: Start/stop time animation
Time Slider: Manually control simulation time
Speed Control: Adjust animation speed
Time Display: Current simulation time
[SCREENSHOT PLACEHOLDER: Time control interface at bottom of 3D viewer]
Python: Plotting and Visualization¶
See also
For complete plotting API documentation, see Plotting Tools – ephemerista.plot.
from ephemerista.plot.ground_track import plot_ground_track
from ephemerista.plot.visibility import plot_visibility_pass
# Plot ground track with visibility
fig = plot_ground_track(
scenario=scenario,
asset_names=["Earth Observer 1"],
show_ground_stations=True,
show_visibility_circles=True
)
# Plot individual pass details
pass_plot = plot_visibility_pass(
pass_data=passes[0],
show_elevation=True,
show_azimuth=True,
show_range=True
)
Data Export¶
GUI: Export Options¶
Click the “Export” button
Choose export format:
JSON: Native Ephemerista format
CSV: Tabular data for spreadsheet analysis
CCSDS: Standard space data formats
[SCREENSHOT PLACEHOLDER: Export dialog with format options]
Python: Data Export¶
# Export scenario
scenario.save("mission_scenario.json")
# Export analysis results to CSV
visibility_results.to_csv("visibility_passes.csv")
coverage_results.to_csv("coverage_statistics.csv")
# Export to CCSDS format
from ephemerista.io.ccsds import export_oem
export_oem(ensemble, "satellite_ephemeris.oem")
Advanced Features¶
Custom Analysis Modules (Python)¶
Create custom analysis modules by extending the base class:
from ephemerista.analysis.base import AnalysisModule
class CustomInterferenceAnalysis(AnalysisModule):
"""Custom interference analysis implementation."""
def __init__(self, interference_threshold=-120.0):
super().__init__()
self.interference_threshold = interference_threshold
def calculate(self):
"""Perform custom interference analysis."""
results = {}
for asset in self.scenario.all_assets:
if hasattr(asset, 'communication_systems'):
# Analyze interference for each communication system
interference_data = self._compute_interference(asset)
results[asset.id] = interference_data
return results
def _compute_interference(self, asset):
"""Compute interference levels."""
# Implementation details
pass
# Use custom analysis
custom_analyzer = CustomInterferenceAnalysis(
interference_threshold=-115.0
)
custom_results = custom_analyzer.calculate()
Parallel Processing¶
# Configure parallel processing
from ephemerista.parallel import ParallelProcessor
import multiprocessing
processor = ParallelProcessor(
num_processes=multiprocessing.cpu_count(),
chunk_size="auto", # Automatic load balancing
memory_limit_gb=8.0 # Memory usage limit
)
# Use parallel processing in analysis
visibility_analyzer = Visibility(scenario, parallel=True)
Integration with External Tools¶
CCSDS Standards Support¶
from ephemerista.io.ccsds import OemExporter, AemExporter
# Export to CCSDS OEM format
oem_exporter = OemExporter()
oem_file = oem_exporter.export_ensemble(
ensemble,
output_file="satellite_ephemeris.oem"
)
# Export attitude data (AEM)
aem_exporter = AemExporter()
aem_file = aem_exporter.export_attitude(
attitude_data,
output_file="satellite_attitude.aem"
)
Examples and Tutorials¶
Complete Mission Analysis Example¶
#!/usr/bin/env python3
"""
Complete Earth Observation Mission Analysis Example
This example demonstrates a full mission analysis workflow including:
- Constellation design
- Coverage analysis
- Communication link budgets
- Navigation performance assessment
"""
import ephemerista
from ephemerista import Scenario
from ephemerista.time import Epoch, TimeScale
from ephemerista.constellation.design import WalkerStar
from ephemerista.assets import GroundStation
from ephemerista.analysis.visibility import Visibility
from ephemerista.analysis.coverage import Coverage
from ephemerista.analysis.link_budget import LinkBudget
from ephemerista.analysis.navigation import Navigation
from datetime import datetime, timezone
# Initialize Ephemerista
ephemerista.init(
eop_file="data/finals2000A.all.csv",
ephemeris_file="data/de440s.bsp"
)
# Create scenario
scenario = Scenario(
name="Earth Observation Mission",
start_time=Epoch.from_datetime(
datetime(2024, 6, 1, 0, 0, 0, tzinfo=timezone.utc),
TimeScale.UTC
),
end_time=Epoch.from_datetime(
datetime(2024, 6, 8, 0, 0, 0, tzinfo=timezone.utc),
TimeScale.UTC
),
time_step=300.0 # 5-minute intervals
)
# Design constellation
constellation = WalkerStar(
num_satellites=12,
num_planes=3,
inclination=98.7, # Sun-synchronous
altitude=700,
phasing_parameter=1
)
# Generate constellation assets
satellites = constellation.generate_assets(
base_name="EarthObs",
start_epoch=scenario.start_time
)
# Add satellites to scenario
for satellite in satellites:
scenario.add_asset(satellite)
# Add ground stations
ground_stations = [
GroundStation(
name="Alaska Station",
latitude=64.8,
longitude=-147.7,
altitude=200.0,
minimum_elevation=10.0
),
GroundStation(
name="Svalbard Station",
latitude=78.2,
longitude=15.4,
altitude=100.0,
minimum_elevation=5.0
)
]
for station in ground_stations:
scenario.add_asset(station)
# Define coverage areas
from ephemerista.coords.shapes import RectangularArea
arctic_area = RectangularArea(
southwest_corner=(66.5, -180.0), # Arctic Circle
northeast_corner=(90.0, 180.0),
name="Arctic Region"
)
scenario.add_area_of_interest(arctic_area)
# Perform analyses
print("Running mission analysis...")
# 1. Visibility Analysis
print("Computing visibility...")
visibility_analyzer = Visibility(scenario)
visibility_results = visibility_analyzer.calculate()
# 2. Coverage Analysis
print("Computing coverage...")
coverage_analyzer = Coverage(scenario)
coverage_results = coverage_analyzer.calculate()
# 3. Link Budget Analysis
print("Computing link budgets...")
link_budget_analyzer = LinkBudget(scenario)
link_budget_results = link_budget_analyzer.calculate()
# 4. Navigation Performance
print("Computing navigation performance...")
nav_analyzer = Navigation(scenario)
nav_results = nav_analyzer.calculate()
# Generate reports
print("\n=== MISSION ANALYSIS RESULTS ===\n")
# Visibility Summary
total_passes = sum(len(passes) for observer_results in visibility_results.values()
for passes in observer_results.values())
print(f"Total visibility passes: {total_passes}")
# Coverage Summary
for area_id, area_results in coverage_results.items():
print(f"Coverage for {area_results.area_name}: {area_results.coverage_percentage:.1f}%")
print(f"Maximum gap: {area_results.max_gap_duration/3600:.1f} hours")
# Link Budget Summary
successful_links = sum(1 for link_data in link_budget_results.values()
if link_data.link_margin > 0)
total_links = len(link_budget_results)
print(f"Successful communication links: {successful_links}/{total_links}")
# Navigation Summary
for observer_id, results in nav_results.items():
mean_gdop = sum(results.gdop) / len(results.gdop)
print(f"Mean GDOP for {results.observer_name}: {mean_gdop:.2f}")
print("\nMission analysis completed successfully!")
Troubleshooting and Reference¶
Common Issues¶
Propagation Errors¶
Invalid TLE Format
Ensure proper two-line element formatting
Check TLE epoch dates are appropriate for analysis period
Numerical Integration Issues
Verify initial state vectors are realistic
Check force model parameters
Visualization Problems¶
WebGL Support
Ensure browser supports WebGL
Update graphics drivers if needed
Performance Issues
Reduce number of displayed satellites
Lower temporal resolution for long analyses
Analysis Failures¶
Insufficient Data
Ensure all required parameters are specified
Check that assets have necessary properties
Memory Limitations
Reduce analysis duration or temporal resolution
Use parallel processing for large scenarios
Performance Optimization¶
Large Constellations¶
Use temporal sampling to reduce computation
Focus analysis on specific time windows
Consider constellation subsets for initial analysis
Complex Scenarios¶
Start with simplified configurations
Gradually add complexity
Use quick setup options when possible
Getting Help¶
Documentation¶
User Manual: This document
API Documentation: API
Examples: Examples and Tutorials and Tutorials
Support Resources¶
Issue Reporting: Bug reports and feature requests
Community Forums: User discussions and solutions
Technical Support: Direct assistance for complex issues
This unified user manual provides comprehensive guidance for using both the Ephemerista GUI and Python API. For the latest updates and additional resources, visit the project repository.