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_summaryFunction
eclipse_time_summary(orbp::OrbitPropagator; kwargs...) -> DataFrame

Compute 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 is nothing, 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:
    • :s for seconds (Default);
    • :min for minutes; or
    • :h for hours.

Returns

  • DataFrame: The function returns a DataFrame with four columns:
    • date: Date of the analysis [UTC] encoded using Date.
    • 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].
    The unit of each column is stored in the DataFrame using metadata.

Extended Help

Throws

  • ArgumentError: If num_days is lower than 1, if step is not positive or not lower than the orbital period, or if time_unit is 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)
source
Note

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.4592155e6
julia> 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.