Eclipse Time
The eclipse time is the period the satellite does not receive sunlight due to the Earth shadow. This information is paramount for mission design since it directly interferes in the power and thermal subsystems.
We can compute the eclipse time of a satellite using the function eclipse_time_summary:
SatelliteAnalysis.eclipse_time_summary — Function
eclipse_time_summary(orbp::OrbitPropagator; kwargs...) -> DataFrameCompute the eclipse time summary for the orbit propagator orbp. The summary is computed as the total time the object stays in the sunlight, penumbra, and umbra regions per orbit at each day.
Keywords
num_days::Integer: Number of days in which the analysis will be performed. (Default: 365)step::Union{Nothing, Number}: The step [s] in which the propagation will occur. Notice that this function has a crossing estimation to accurately estimate the transition between the regions, including those entirely inside one step, such as a penumbra passage between the sunlight and the umbra. However, if this step is very large, we may miss a region if the lighting condition is the same in two consecutive instants. If it isnothing, it will be selected as the time in which the mean anomaly advances 0.5°. (Default:nothing)time_unit::Symbol: Select the unit in which the results will be generated. The possible values are::sfor seconds (Default);:minfor minutes; or:hfor hours.
Returns
DataFrame: The function returns aDataFramewith four columns:date: Date of the analysis [UTC] encoded usingDate.sunlight: Total sunlight time per orbit at each day [time_unit].penumbra: Total penumbra time per orbit at each day [time_unit].umbra: Total umbra time per orbit at each day [time_unit].
DataFrameusing metadata.
Extended Help
Throws
ArgumentError: Ifnum_daysis lower than 1, ifstepis not positive or not lower than the orbital period, or iftime_unitis not:s,:min, or:h.
Examples
julia> using SatelliteAnalysis
julia> jd₀ = date_to_jd(2021, 1, 1, 0, 0, 0)
julia> orb = KeplerianElements(
jd₀,
7130.982e3,
0.001111,
98.405 |> deg2rad,
ltdn_to_raan(10.5, jd₀),
90 |> deg2rad,
0
)
julia> orbp = Propagators.init(Val(:J2), orb)
julia> df = eclipse_time_summary(orbp; num_days = 5)
5×4 DataFrame
Row │ date sunlight penumbra umbra
│ Date Float64 Float64 Float64
─────┼─────────────────────────────────────────
1 │ 2021-01-01 3972.63 20.4117 2006.96
2 │ 2021-01-02 3973.85 20.4376 2005.71
3 │ 2021-01-03 3974.77 20.4575 2004.77
4 │ 2021-01-04 3975.74 20.4758 2003.79
5 │ 2021-01-05 3976.94 20.5022 2002.55
julia> df = eclipse_time_summary(orbp; num_days = 5, time_unit = :min)
5×4 DataFrame
Row │ date sunlight penumbra umbra
│ Date Float64 Float64 Float64
─────┼─────────────────────────────────────────
1 │ 2021-01-01 66.2105 0.340195 33.4493
2 │ 2021-01-02 66.2308 0.340627 33.4285
3 │ 2021-01-03 66.2461 0.340958 33.4129
4 │ 2021-01-04 66.2623 0.341263 33.3964
5 │ 2021-01-05 66.2824 0.341704 33.3759
julia> colmetadata(df)
Dict{Symbol, Dict{String, Symbol}} with 4 entries:
:penumbra => Dict("Unit"=>:min)
:sunlight => Dict("Unit"=>:min)
:date => Dict("Unit"=>:UTC)
:umbra => Dict("Unit"=>:min)If we want to verify the current lighting condition in a satellite (sunlight, umbra, or penumbra), see the function lighting_condition.
Examples
We will compute the eclipse time of the Amazonia-1 mission for one year. The first thing we need to do is define the orbit:
julia> jd₀ = date_to_jd(2021, 1, 1)2.4592155e6julia> orb = KeplerianElements( jd₀, 7130.982e3, 0.001111, 98.405 |> deg2rad, ltdn_to_raan(10.5, jd₀), π / 2, 0 )KeplerianElements{TrueAnomaly, Float64, Float64}: Epoch : 2.45922e6 (2021-01-01T00:00:00) Semi-Major Axis : 7130.982 km Eccentricity : 0.001111 Inclination : 98.405° RA of Asc. Node : 78.40205742° Arg. of Periapsis : 90.0° True Anomaly : 0.0°
The next step is to define the desired propagator:
julia> orbp = Propagators.init(Val(:J2), orb)OrbitPropagatorJ2{Float64, Float64} (J2 Orbit Propagator): ├─ Mean Elements │ Epoch : 2.45922e6 (2021-01-01T00:00:00) │ Semi-Major Axis : 7130.982 km │ Eccentricity : 0.001111 │ Inclination : 98.405° │ RA of Asc. Node : 78.40205742° │ Arg. of Periapsis : 90.0° │ Mean Anomaly : 0.0° ├─ Secular Rates │ Mean Motion : 14.40836316 rev/day │ RAAN Rate : 0.9849934616 °/day │ Arg. of Periapsis Rate : -3.009417209 °/day ├─ Constants │ R₀ : 6378.137 km │ μm : 0.001239447462 rad/s │ J₂ : 0.001082626174 └─ Propagation Last Instant : 0.0 s
Now, we can use the function eclipse_time_summary to obtain the eclipse time information for each day of the year:
julia> df = eclipse_time_summary(orbp; time_unit = :min)365×4 DataFrame Row │ date sunlight penumbra umbra │ Date Float64 Float64 Float64 ─────┼───────────────────────────────────────── 1 │ 2021-01-01 66.2105 0.340195 33.4493 2 │ 2021-01-02 66.2308 0.340627 33.4285 3 │ 2021-01-03 66.2461 0.340958 33.4129 4 │ 2021-01-04 66.2623 0.341263 33.3964 5 │ 2021-01-05 66.2824 0.341704 33.3759 6 │ 2021-01-06 66.2932 0.341899 33.3649 7 │ 2021-01-07 66.3129 0.342331 33.3447 8 │ 2021-01-08 66.3274 0.342628 33.33 ⋮ │ ⋮ ⋮ ⋮ ⋮ 359 │ 2021-12-25 66.1274 0.338075 33.5345 360 │ 2021-12-26 66.1477 0.338525 33.5137 361 │ 2021-12-27 66.1595 0.338762 33.5017 362 │ 2021-12-28 66.18 0.339203 33.4808 363 │ 2021-12-29 66.1956 0.33955 33.4648 364 │ 2021-12-30 66.2122 0.339889 33.4479 365 │ 2021-12-31 66.2327 0.340339 33.4269 350 rows omitted
Finally, we can use the DataFrame to analyze the result. For example, the maximum eclipse time in an orbit is:
julia> maximum(df.penumbra .+ df.umbra)34.66395872764383
i.e., 34.66 minutes.
References
- [1] Longo, C. R. O., Rickman, S. L (1995). Method for the Calculation of Spacecraft Umbra and Penumbra Shadow Terminator Points. NASA Technical Paper 3547.