A satellite in Earth orbit needs some 7.8 km/s as orbital velocity.
From all the satellites in Earth orbit ever launched which one has or had the highest speed?
A satellite in Earth orbit needs some 7.8 km/s as orbital velocity.
From all the satellites in Earth orbit ever launched which one has or had the highest speed?
Computing the velocity of all space objects at perigee can provide the answer. After processing the latest public satellite catalog from Celestrak, the objects with the highest orbital speed at perigee are:
Object Name SSN# Type Country Apogee (km) Perigee(km) Velocity(m/s)
DELTA 2 R/B(2) 22051 R/B US 359918.0 185.0 10929.8
PEGASUS R/B(2) 33404 R/B US 219611.0 247.0 10818.1
FALCON HEAVY R/B 44187 R/B US 88505.0 329.0 10542.2
FALCON 9 R/B 44050 R/B US 66488.0 232.0 10521.5
DELTA 2 R/B(2) 30799 R/B US 85277.0 377.0 10489.9
FALCON 9 R/B 43179 R/B US 48084.0 237.0 10372.5
FALCON 9 R/B 40426 R/B US 62208.0 406.0 10346.8
FALCON 9 R/B 45921 R/B US 45359.0 239.0 10341.4
EQUATOR S 25068 PAY GER 67160.0 470.0 10325.4
You can download the satcat as a csv from this link, and you can use this Python code snippet below to process the file and compute the speeds.
I hope this is helpful! Manny
import pandas as pd
import math
mu = 3.986004418e14
pi = math.pi
# Computes the SMA from the orbital period
def getSMAfromPeriodMinutes(periodMinutes):
# Gravitational parameter
periodSeconds = periodMinutes*60
SMA_m = (((periodSeconds**2)*mu)/(4*(pi**2)))**(1/3)
return SMA_m
# p is Perigee in km, a is SMA in m
def getPerigeeSpeed(p, a):
x = mu*((2/(p*1000 + 6371000))-(1/a))
return math.sqrt(x)
def getSatcat():
"""
Gets the public satellite catalog from Celestrak
Returns a pandas dataframe of the catalog
"""
df = pd.read_csv(r'C:\satcat.csv')
return df
if __name__ == '__main__':
df = getSatcat();
# Limit to objects that orbit the Earth only, to exclude some objects that might
# orbit about the Earth-Moon barycenter, Sun, etc...
# Read the format documentation at http://celestrak.com/satcat/satcat-format.php
df = df[df['ORBIT_CENTER']=='EA']
# drop rows with empty perigee fields
df = df.dropna(subset=['PERIGEE'])
# drops rows with objects that have decayed
df = df[df['DECAY_DATE'].isna()]
# drop rows with 0 perigee from the file (re-entered)
df = df[df['PERIGEE']>0]
# compute the SMA
df['SMA_m'] = df.apply(lambda row: getSMAfromPeriodMinutes(row['PERIOD']), axis=1)
# compute the speed at perigee
df['v_PERIGEE'] = df.apply(lambda row: getPerigeeSpeed(row['PERIGEE'], row['SMA_m']), axis=1)
print(df[['v_PERIGEE']].idxmax())
If we look at circular low Earth orbits only:
height speed period
km m/s hours:min:sec
200 7789.1 1:28:21
300 7730.5 1:30:22
400 7673.2 1:32:24
500 7617.2 1:34:28
600 7562.3 1:36:32
700 7508.7 1:38:37
800 7456.1 1:40:43
900 7404.7 1:42:50
1000 7354.3 1:44:21
The lowest orbit has the fastest speed. But below 400 km orbits decay very fast, 300 km within 6 month, 200 km in about a day.
Now we look at elliptical orbits:
min at min max at max
height speed height speed period
km m/s km m/s hours:min:sec
400 7701.3 500 7589.2 1:33:26
400 7728.9 600 7507.1 1:34:28
400 7755.9 700 7426.9 1:35:30
400 7782.5 800 7348.4 1:36:32
400 7834.3 1000 7196.6 1:38:37
400 9127.0 10000 3774.9 3:26:26
400 10521.9 100000 669.8 37:11:36
400 10677.8 200000 350.3 96:10:06
400 10762.3 400000 179.3 259:31:25
So a very elliptical orbit has the fastest speed, but only when close to Earth at minimal height. But the period gets much longer and the average speed is lower.The last line is an elliptical orbit to the moon and back. This speed record is held by the Apollo missions. (For simplicity, the orbit was calculated without the influence of the Moon.)
All orbits were calculated using this webpage by Bernd Leitenberger. It is only available in German.
I wrote a Python script to calculate some orbital periods and speeds. I used astropy units to calculate with distances in m or km, masses in kg and the gravitational constant in m^3 / kg s^2. The results in m/s and time units hours, minutes and seconds. If the units of the results are wrong, the numbers may be wrong too.
The results for circular orbits from 200 to 1000 km height:
height radius speed period
200 km 6567.4 km 7790.6 m / s 1 h 28 min 16.7 s
300 km 6667.4 km 7732.0 m / s 1 h 30 min 18.1 s
400 km 6767.4 km 7674.6 m / s 1 h 32 min 20.5 s
500 km 6867.4 km 7618.5 m / s 1 h 34 min 23.7 s
600 km 6967.4 km 7563.7 m / s 1 h 36 min 27.9 s
700 km 7067.4 km 7510.0 m / s 1 h 38 min 33.0 s
800 km 7167.4 km 7457.4 m / s 1 h 40 min 38.9 s
900 km 7267.4 km 7405.9 m / s 1 h 42 min 45.7 s
1000 km 7367.4 km 7355.5 m / s 1 h 44 min 53.4 s
Elliptical orbits from 500 to 400000 km maximum distance, minimum distance 400 km:
height semi mayor axis min speed max speed period
500 km 6817.4 km 7590.5 m / s 7702.7 m / s 1 h 33 min 22.0 s
600 km 6867.4 km 7508.4 m / s 7730.3 m / s 1 h 34 min 23.7 s
700 km 6917.4 km 7428.1 m / s 7757.4 m / s 1 h 35 min 25.7 s
800 km 6967.4 km 7349.6 m / s 7784.0 m / s 1 h 36 min 27.9 s
900 km 7017.4 km 7272.8 m / s 7810.1 m / s 1 h 37 min 30.3 s
1000 km 7067.4 km 7197.7 m / s 7835.8 m / s 1 h 38 min 33.0 s
5000 km 9067.4 km 5115.7 m / s 8593.0 m / s 2 h 23 min 12.9 s
10000 km 11567.4 km 3774.6 m / s 9129.1 m / s 3 h 26 min 21.3 s
50000 km 31567.4 km 1231.3 m / s 10255.4 m / s 15 h 30 min 17.5 s
100000 km 56567.4 km 669.6 m / s 10523.9 m / s 37 h 11 min 33.9 s
200000 km 106567.4 km 350.2 m / s 10679.8 m / s 96 h 10 min 16.5 s
400000 km 206567.4 km 179.3 m / s 10764.3 m / s 259 h 32 min 17.6 s
The Python script
import numpy as np
import matplotlib.pyplot as plt
from astropy import units as u
from astropy import constants as c
def secToHMS(timePeriod) : # converting seconds to hours, minutes and seconds
tP2 = timePeriod.to(u.s).value # integer division // does not work with units
rest = tP2 // 60
secs = (tP2 % 60) * u.s #setting the proper unit
hours = (rest // 60) * u.h
mins = (rest % 60) * u.min
return (hours, mins, secs)
# orbital period of circular and elliptical orbits
def orbitalPeriod(semi_mayor_axis, GMbody) :
result = np.sqrt(semi_mayor_axis**3 / GMbody) * 2.0 * np.pi
return result
def orbitalspeed(radius, GMbody) : # only for circular orbits
rad_m = radius.to(u.m) # converting orbit radius from km to m
result = np.sqrt(GMbody / rad_m)
return result
def VisVivaSpeed(radius, semi_mayor_axis, GMbody) :
rad_m = radius.to(u.m) # converting orbit radius from km to m
sma = semi_mayor_axis.to(u.m) # semi_mayor_axis from km to m
result = np.sqrt(GMbody * (2.0 / rad_m - 1.0 / sma))
return result
dia_earth_a = 12756.27 * u.km # equatorial Earth diameter
dia_earth_p = 12713.5 * u.km # polar Earth diameter
rad_earth_a = 0.5 * dia_earth_a # equatorial Earth radius
rad_earth_p = 0.5 * dia_earth_p # polar Earth radius
rad_earth_ap = (rad_earth_a + rad_earth_p) * 0.5 # mean of equator and polar radius
m_earth = 5.97e24 * u.kg # mass of Earth
m_e = c.M_earth
G = c.G # gravitaional constant
GMe = c.GM_earth # product of G with the mass of Earth
print(m_earth, m_e, G, GMe)
print()
print(" height radius speed period")
# circular orbits from 200 up to 1000 km, steps 100 km
for i in range(200, 1001, 100) :
h = i * u.km # converting integer height to float with unit km
a = h + rad_earth_ap # distance to earth center
t4 = orbitalPeriod(a, GMe)
t5 = secToHMS(t4)
v = orbitalspeed(a, GMe)
print(format(h, "5.0f"), format(a, "7.1f"), format(v, "7.1f"),
format(t5[0], "2.0f"), format(t5[1], "2.0f"),
format(t5[2], "4.1f"))
print()
print(" height semi mayor axis min speed max speed period")
for i in (500, 600, 700, 800, 900, 1000, 5000, 10000, 50000, 100000, 200000, 400000) :
h = i * u.km # converting integer height to float with unit km
d_max = h + rad_earth_ap # maximum distance to earth center
d_min = 400 * u.km + rad_earth_ap # minimum distance to earth center
a = (d_max + d_min) * 0.5 # semi mayor axis
t4 = orbitalPeriod(a, GMe)
t5 = secToHMS(t4)
v_min = VisVivaSpeed(d_max, a, GMe) # minimal speed at maximal distance
v_max = VisVivaSpeed(d_min, a, GMe) # maximal speed at minimal distance
print(format(h, "6.0f"), format(a, "9.1f"), format(v_min, "8.1f"),
format(v_max, "8.1f"), format(t5[0], "4.0f"), format(t5[1], "2.0f"),
format(t5[2], "4.1f"))