A tool designed to analyze the impact of solar radiation on spaceborne infrastructure, particularly in Low Earth Orbit (LEO). By leveraging data from large-scale deployments like SpaceX’s Starlink, CosmicDance provides insights into satellite orbital shifts and identifies risks such as premature orbital decay.
CosmicDance is a modular framework that utilizes multimodal datasets, including solar activity intensity and satellite tracking data. It maps these datasets in a time series to measure and visualize how orbital trajectories change at scale.
Use the following steps to build CosmicDance environment.
- Install dependencies
sudo apt install curl
- Create conda environment from
environment.yml
conda env create -f dependencies/environment.yml
For macOS use environment_macOS.yml
conda env create -f dependencies/environment_macOS.yml
- Activate
cosmicdance
environment
conda deactivate && conda activate cosmicdance
- Add user credentials for space-track in credentials/credentials_0.json
{
"ID": "user@domain.com",
"PWD": "password"
}
- Export
CosmicDance
path in the shell. This will allow seamless execution of scripts.
export PYTHONPATH=$(pwd)
OR
For instance, if the repository is cloned at /home/suvam/Projects/CosmicDance
export PYTHONPATH="/home/suvam/Projects/CosmicDance"
CosmicDance processes datasets in parallel by default. However, for each script, you can set PARALLEL_MODE
to False
to run the processing in serial mode.
Note: macOS users may encounter issues with parallel mode. It is recommended to set
PARALLEL_MODE
toFalse
in such cases.
PARALLEL_MODE = False
CosmicDance automatically acquires solar activity data (Dst index) from the World Data Center for Geomagnetism, Kyoto, NORAD Catalogue Numbers from CelesTrak, and TLEs from Space-Track through the following steps.
- Get Dst index
python starlink/build_dataset/acquire/Dst_index.py
- Get satellite NORAD Catalog Number
python starlink/build_dataset/acquire/new_catalog_numbers.py
- Download TLEs
python starlink/build_dataset/acquire/download_historic_tles.py
Prepare the dataset for orbital shift analysis by following these steps:
Prepare the time window (start and end timestamps) of solar activities above or below a certain intensity by following these steps:
- Solar storm times according to NOAA Space Weather Scales
python starlink/build_dataset/preprocess/DST/timespan_NOAA.py
- Solar activities above some percentile
python starlink/build_dataset/preprocess/DST/timespan_percentile.py
- Quiet time below some percentile
python starlink/build_dataset/preprocess/DST/timespan_quiet_day.py
Preprocess the TLEs by removing erroneous values and filtering out Starlink orbit-raising operations from the staging orbit after launch through the following steps:
- Convert TLEs from
JSON
toCSV
python starlink/build_dataset/preprocess/TLEs/JSON_to_CSV.py
- Cleanup the TLEs
python starlink/build_dataset/preprocess/TLEs/cleanup.py
- Remove TLEs before orbit raise (Starlink)
python starlink/build_dataset/preprocess/TLEs/remove_orbit_raise_maneuver.py
The following steps map the multimodal datasets (solar activity and satellite orbital parameters) into a single time series using timestamps and identify abrupt changes in trajectory closely following a solar event:
- Generate launch date (or satellite) wise time series plot of orbital parameters with intensity of solar activities
python starlink/timeseries/view_timeseries_with_dst.py
- The satellite (NORAD catalog number 45059) experienced an altitude drop of approximately 100 km immediately following a high-intensity solar activity and also notice an increased decay rate after the solar superstorm of May'24. For additional time series plots, refer to the notebook and the output directory of
view_timeseries_with_dst.py
.
Measure the satellite orbital changes, specifically altitude, within high and low solar activity windows in a time series by following these steps:
- Orbital shifts after quiet day
Set relevant input output files using OUTPUT_DIR
and EVENT_DATES_CSV
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/track_altitude_change/quiet_day"
EVENT_DATES_CSV = "artifacts/OUTPUT/Starlink/timespans/quiet_day/below_ptile_80.csv"
DAYS = 15
Execute the measurement script
python starlink/orbital_shifts/trace_altitude.py
- Orbital shifts after high solar activity day
Set relevant input output files using OUTPUT_DIR
and EVENT_DATES_CSV
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/track_altitude_change/merged_above_ptile_99/RAW"
EVENT_DATES_CSV = "artifacts/OUTPUT/Starlink/timespans/percentile/merged_above_ptile_99.csv"
DAYS = 30
Execute the measurement script
python starlink/orbital_shifts/trace_altitude.py
- Segregate the type of shifts
python starlink/orbital_shifts/detect_altitude_shifts.py
- Light sky-blue dotted lines represent the altitude changes of individual satellites. The thickness of the vertical red bars indicates the relative solar activity intensity compared to the first day. The thick green and dashed blue lines depict the 95th percentile and median altitude changes observed on that day, respectively. For more observations, refer to the notebook.
Measure the impact of solar event intensity and duration on orbital changes, specifically altitude, by following these steps:
- After low intensity solar activity days
Set relevant input output files using OUTPUT_DIR
, OUTPUT_CSV
, and DST_TIMESPAN
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/quiet_day_after_1_5_10.csv"
DST_TIMESPAN = "artifacts/OUTPUT/Starlink/timespans/quiet_day/merged_below_ptile_80.csv"
Execute the measurement script
python starlink/altitude_change/for_intensity.py
- After high intensity solar activity days
Set relevant input output files using OUTPUT_DIR
, OUTPUT_CSV
, and DST_TIMESPAN
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/event_day_after_1_5_10.csv"
DST_TIMESPAN = "artifacts/OUTPUT/Starlink/timespans/percentile/merged_above_ptile_95.csv"
Execute the measurement script
python starlink/altitude_change/for_intensity.py
- Short duration events
Set relevant input output files using OUTPUT_DIR
, OUTPUT_CSV
, and df_timespan
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/below_H9.csv"
df_timespan = df_timespan[df_timespan[DST.DURATION_HOURS] < 9]
Execute the measurement script
python starlink/altitude_change/for_duration.py
- Long duration events
Set relevant input output files using OUTPUT_DIR
, OUTPUT_CSV
, and df_timespan
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/above_H9.csv"
df_timespan = df_timespan[df_timespan[DST.DURATION_HOURS] > 9]
Execute the measurement script
python starlink/altitude_change/for_duration.py
- Compare the distribution of altitude change and drag during low and high solar intensity periods. For detailed analysis, see the notebook.
Solar events can cause satellite anomalies, tracking errors, and increased drag for satellites in Low Earth Orbit (LEO). Measure the satellite tracking and drag information as follows:
- Check for tracking anomaly
python starlink/superstorm/tracking_anomaly.py
- Check for drag anomaly
python starlink/superstorm/drag_anomaly.py
- Look for anomalies in notebook
CosmicDance can be used out of the box for any satellites or constellations
This work is licensed under the MIT License.
Basak, Suvam, et al. "CosmicDance: Measuring Low Earth Orbital Shifts Due to Solar Radiations" Proceedings of the ACM Internet Measurement conference. 2024.
@inproceedings {CosmicDance,
author = {Basak, Suvam and Pal, Amitangshu and Bhattacherjee, Debopam},
title = {CosmicDance: Measuring Low Earth Orbital Shifts Due to Solar Radiations},
booktitle = {{ACM IMC}},
year = {2024},
doi = {10.1145/3646547.3689024}
}
Contributors whose support and expertise have been invaluable in the development of CosmicDance: