This answer to Why are orbital periods different for different GNSS positioning system constellations? suggests that the orbital periods of the four large GNSSS constellations are linked to the rotation period of the earth (the sidereal day) by rational numbers with 17 or 34 as the denominator in order to facilitate roughly twice-daily contact with each constellation's ground stations. It uses this answer to Why are the GPS constellation satellites in such a high orbit? to help support this.
GPS uses 1/2 of a sidereal day, 11:58:02 and an orbit height of 20192 km.
Other satellite navigation use similar orbit periods, 17 orbits per 8 to 10 sidereal days.
Glonass uses 8/17 of a sidereal day, 11:15:48 and an orbit height of 19140 km.
BeiDou uses 9/17 of a sidereal day, 12:40:16 and an orbit height of 21224 km.
Galileo uses 10/17 of a sidereal day, 14:04:45 and an orbit height of 23232 km.
The ratio of 1/2 may be also written as 17/34, the other ones as 16/34 , 18/34 and 20/34. The differences are small. Thus all satellites could be measured about twice a day from the same ground stations.
If you go to the Wikipedia page for Satellite navigation and look at the table, the 17's do in fact show up in a table there (shown below with some rows suppressed for compactness:
I've downloaded TLEs from Celestrack using these links and propagated them using Skyfield and I don't see any evidence of substantially repeating ground track orbits.
Considering that since these constellations exist in MEO specifically so that any location will see many of them constantly, is there really anything to this "17" argument forwarded by both this and this answer? Or is it just a red herring?
above: Ground tracks for 72 hours using TLE groups from Celestrak and SGP4 propagation using Skyfield. Axes are geographical longitude and latitude and the lines are the subsatellite points at 0.03 hour time steps.
Note: The Beidou system has satellites in both MEO and Geosynchronous orbits (~28,000 and ~42,000 km radii).
above: Earth-centered inertial orbits for 72 hours using TLE groups from Celestrak and SGP4 propagation using Skyfield at 0.03 hour time steps.
class Constellation(object):
def __init__(self, name):
self.name = name
self.sats = []
class Satellite(object):
def __init__(self, name):
self.name = name
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skyfield.api import Loader, EarthSatellite
load = Loader('~/Documents/fishing/SkyData') # avoids multiple copies of large files
ts = load.timescale()
data = load('de421.bsp')
earth = data['earth']
ts = load.timescale()
print earth.at(ts.now()).position.km # for no reason at all
fnames = ('beidou.txt', 'galileo.txt', 'glo-ops.txt', 'gps-ops.txt')
names = ('Beidou', 'Galileo', 'Glonass (ops)', 'GPS (ops)' )
# Build constellations and EarthSatellites
constellations = []
for fname, name in zip(fnames, names):
const = Constellation(name)
constellations.append(const)
with open(fname, 'r') as infile:
lines = infile.readlines()
const.lines = lines
satnames, L1s, L2s = [lines[i::3] for i in range(3)]
for name, L1, L2 in zip(satnames, L1s, L2s):
if len(name)<30 and L1[0]=='1' and L2[0]=='2':
sat = Satellite(name.strip())
const.sats.append(sat)
sat.L1, sat.L2 = L1, L2
sat.satobj = EarthSatellite(L1, L2) # add the Skyfield object
for const in constellations:
print "constellation name: ", const.name
print [sat.name for sat in const.sats]
print len(const.sats), len(const.lines)/3
hours = np.arange(0, 72, 0.03)
time = ts.utc(2018, 6, 21, hours) # start June 21, 2018
# Propagate TLEs
for const in constellations:
for sat in const.sats:
satobj_at = sat.satobj.at(time)
sat.pos = satobj_at.position.km
sat.subpoint = satobj_at.subpoint()
sat.lon = sat.subpoint.longitude.degrees
sat.lat = sat.subpoint.latitude.degrees
breaks = np.where(np.abs(sat.lon[1:]-sat.lon[:-1]) > 60)
sat.plot_lon = sat.lon[:-1]
sat.plot_lat = sat.lat[:-1]
sat.plot_lon[breaks] = np.nan # avoid ugly wraparounds
if True:
plt.figure()
things = ('-b', '-g', '-r', '-c')
fs, lw = 16, 0.7
for i, (const, color) in enumerate(zip(constellations, things)):
plt.subplot(2, 2, i+1)
for sat in const.sats:
plt.plot(sat.plot_lon, sat.plot_lat, color, linewidth=lw)
plt.title(const.name, fontsize=fs)
plt.show()
if True:
fig = plt.figure(figsize=[9, 7]) # [12, 10]
things = ('-b', '-g', '-r', '-c')
for i, (const, color) in enumerate(zip(constellations, things)):
ax = fig.add_subplot(2, 2, i+1, projection='3d')
for sat in const.sats:
x, y, z = sat.pos
ax.plot(x, y, z, color)
ax.set_title(const.name, fontsize=16)
plt.show()
17
in the table in Wikipedia has any specific significance, so that might be a good place to start. So far, it looks like they are not actually in orbits who's periods are exact rational fractions times the sidereal day, otherwise the ground tracks would be repeating. $\endgroup$