In the expanding explanations of the Python port of an orbital mechanics library, I also found explanations about J2 perturbations, from a Stack Exchange post: J2 perturbations
What J2 actually is
Two-body Kepler motion assumes the Earth is a point mass. It isn’t. It’s an oblate spheroid, roughly 21 km fatter through the equator than through the poles, and that extra mass around the middle pulls on a satellite in a way a point mass wouldn’t.
Expand the gravitational potential in spherical harmonics and that bulge is the second zonal term, J2. For Earth it comes out at about 1.08263e-3, which sounds negligible until you notice it is a thousand times larger than every other harmonic term. For most low Earth orbit work, modelling J2 and ignoring the rest gets you most of the way there.
What it does to an orbit
J2 does not change the size or shape of the orbit on average. The semi-major axis and eccentricity stay put. What it does is rotate the orbital plane, and it does so steadily rather than periodically, which is why these are called secular rates. Two elements drift:
- The right ascension of the ascending node, which is the orbit plane pivoting around the Earth’s axis. This is nodal regression.
- The argument of perigee, which is the ellipse rotating within its own plane. This is apsidal precession.
The mean rates are:
const J2 = 1.08263e-3
const RE = 6378.137 # km, Earth equatorial radius
const MU = 398600.4418 # km^3/s^2
function j2_rates(a, e, i)
n = sqrt(MU / a^3) # mean motion, rad/s
p = a * (1 - e^2) # semi-latus rectum
k = 1.5 * J2 * (RE / p)^2 * n
dRAAN = -k * cos(i) # nodal regression
dArgP = 0.5 * k * (5 * cos(i)^2 - 1) # apsidal precession
return dRAAN, dArgP # rad/s
end
Why you would want it
The interesting part is that both of these are exploitable rather than merely annoying.
Set the inclination so that the nodal regression matches the Earth’s motion around the Sun, about 0.9856 degrees per day, and the orbit plane keeps a fixed angle to the Sun all year. That’s a sun-synchronous orbit, which is why imaging satellites cross your latitude at the same local time on every pass. For a typical 700 km orbit that works out to an inclination just past 98 degrees, which is retrograde.
The apsidal term has its own sweet spot. Set 5cos²i = 1 and the perigee stops moving. That happens at 63.4 degrees, the critical inclination, and it is exactly why the Molniya orbits sat there: it keeps apogee parked over the northern hemisphere instead of letting it drift south over the years.




