# Sun-synchronous satellite orbit propagation

I'm trying to propagate the orbit of a sun-synchronous satellite. The initial data is defined by the TLE.

The orbit of the satellite is controlled by the operator by means of maneuvers. That's to say, the effects of perturbations are compensated, the orbit of the satellite always remains sun-synchronous.

Is there a way to propagate the orbit, considering the above conditions, making the calculations on the kepletian elements?

I tried the SGP4 model, but it's not appropriate in this case.

• Can you add the source of the images you posted? – Chris Mar 21 '18 at 19:10

TLE's already considers drag up to some point (check if BSTAR is negative, if it is, then the TLE is considering that maneuvers have been performed). A positive BSTAR reduces (mean) semi-major axis over time, an effect of drag. J2, J3 and J4 are each partially considered (think taylor series approximaiton with $J_2^2$ set to zero).

If you have a sun-synchronous orbit, then at least J2 needs to be considered, otherwise there could be no such orbit. All other perturbations are needed only on a basis of propagation duration and simulation fidelity: How long the simulation runs and how accurate should it be. 2 weeks and low accuracy means SGP4 output is fine.

I believe SGP8 will consider sun and moon perturbations, but not SGP4.

• These days the umbrella "SGP4" is inclusive of SDP4 and so it has a limited ability to approximate perturbations from the Sun and Moon. See “Deep space” corrections in SGP4; how does it account for the Sun's and Moon's gravity? – uhoh Mar 12 '18 at 7:38
• Looks like I should consider only Earth and J2. So, SGP4 is not good for this task. Is there a way to propagate on the basis of orbital elements? – Tarlan Mammadzada Mar 12 '18 at 7:50
• @Mefitico can you consider updating your answer to adjust your statement that SGP4 does not consider Sun and Moon perturbations. It didn't at one time (SDP4 did) but I think today any modern source for SGP4 does include these perturbations by incorporating SDP4. – uhoh Mar 21 '18 at 3:10
• @uhoh Anyway, SGP4 doesn't comply with the stated conditions. Please, consider my equations – Tarlan Mammadzada Mar 21 '18 at 13:44
• @TarlanMammadzada : I recognize the equations you presented in (1) for the rates of the elements are Kozai's equaitons, and they are should be used with mean elements to update mean elements, and the output needs to be converted to osculating elements before using the equations you present in (2). See as a reference Schaub H. Junkins, J. Analytical Mechanics of Space Systems 2nd edition AIAA Education Series 2009 – Mefitico Mar 21 '18 at 18:21

With respect to what orbit propagator you should use, it depends. If you are designing a space mission that will operate in a Sun-syncrhounous orbit, then usually a J2 is better. In those cases, the mission usually have ways to keep itself on the designed orbit, avoiding the all perturbations but J2. Hence, a J2 propagator is better. On the other hand, if you are propagating a real satellite using a real TLE, then SGP4 is much more accurate.

If you use Julia and SatelliteToolbox.jl, then you can very easily select the propagator. For example, for a pure J2 propagator:

julia> orbp = init_orbit_propagator(Val{:J2}, Orbit(0.0,7130982.0,0.001111,98.405*pi/180,pi/2,0.0,0.0))
julia> (o,r,v) = propagate!(orbp, collect(0:3:24)*60*60)
julia> r
9-element Array{Array{T,1} where T,1}:
[5.30372e-7, 7.12306e6, 3.58655e-6]
[-9.98335e5, 2.14179e6, -6.72549e6]
[-5.75909e5, -5.83674e6, -4.06734e6]
[6.65317e5, -5.69201e6, 4.2545e6]
[9.62557e5, 2.37418e6, 6.65228e6]
[-1.10605e5, 7.11845e6, -231186.0]
[-1.02813e6, 1.90664e6, -6.79145e6]
[-4.82921e5, -5.97389e6, -3.87579e6]
[750898.0, -5.53993e6, 4.43709e6]


This propagated the orbit for 24h and stored the information every 3 hours. For SGP4, then you can do the following:

julia> orbp = init_orbit_propagator(Val{:sgp4}, Orbit(0.0,7130982.0,0.001111,98.405*pi/180,pi/2,0.0,0.0))
julia> (o,r,v) = propagate!(orbp, collect(0:3:24)*60*60)
julia> r
9-element Array{Array{T,1} where T,1}:
[-2159.7, 7.13166e6, -14607.2]
[-1.00096e6, 2.1411e6, -6.73899e6]
[-5.78906e5, -5.83897e6, -4.08451e6]
[6.64614e5, -5.70129e6, 4.24735e6]
[9.6287e5, 2.37768e6, 6.64987e6]
[-1.12629e5, 7.12679e6, -2.45705e5]
[-1.03066e6, 1.90639e6, -6.80469e6]
[-4.86132e5, -5.97626e6, -3.89338e6]
[7.5014e5, -5.54932e6, 4.42998e6]


If your orbit is defined in the file sat.tle, then you can propagate the orbit using:

julia> tle = read_tle("sat.tle")
1-element Array{SatelliteToolbox.TLE,1}:
TLE
==========================================================
Name: Test
Satellite number: 6251
International designator: 62025E
Epoch (Year): 6
Epoch (Day): 176.82412014
Element set number: 398
Inclination:  58.05790000 deg
RAAN:  54.04250000 deg
Argument of perigee: 139.15680000 deg
Mean anomaly: 221.18540000 deg
Mean motion (n):  15.56387291 revs/day
Revolution number: 677

B*: 0.000000 1/[er]

1   d
---.--- n: 0.000000 rev/day²
2  dt

1   d²
---.--- n: 0.000000 rev/day³
6  dt²
==========================================================

julia> orbp = init_orbit_propagator(Val{:sgp4}, tle[1])
julia> (o,r,v) = propagate!(orbp, collect(0:3:24)*60*60)
julia> r
9-element Array{Array{T,1} where T,1}:
[3.98829e6, 5.49898e6, 928.983]
[4.77232e6, 4.45027e6, -1.90764e6]
[4.99362e6, 2.89039e6, -3.60054e6]
[4.62067e6, 1.00698e6, -4.88731e6]
[3.69211e6, -9.77058e5, -5.62356e6]
[2.31243e6, -2.82934e6, -5.72624e6]
[6.40617e5, -4.33414e6, -5.18251e6]
[-1.1272e6, -5.31664e6, -4.05161e6]
[-2.77972e6, -5.66325e6, -2.45952e6]