Связь НАСА с космическими аппаратами за пределами околоземной орбиты осуществляется с помощью Deep Space Network , имеющей три комплекса: Канберра, Австралия; Голдстоун, Калифорния; и Мадрид, Испания.
На Марсе или вокруг него находится много космических кораблей, и иногда два комплекса одновременно используются для марсианских кораблей. На скриншоте ниже мы видим следующие марсианские космические аппараты, связывающиеся с комплексами Мадрид и Голдстоун:
MMS, NHPC и STA не являются марсианскими миссиями.
Насколько часто (в часах в день, долях или процентах) два комплекса DSN находятся в состоянии связи с Марсом? Если ответ зависит от орбит двух планет, пожалуйста, уточните.
Связанный:
Вот краткий ответ на сегодня . Она меняется по мере того, как Земля и Марс движутся по своим орбитам. Этот скрипт можно настроить на другие даты или тела.
Я использовал пакет Python Skyfield , но вы можете извлечь те же углы возвышения из Horizons, они оба используют одну из последних эфемерид разработки .
Сегодня Мадрид-Голдстоун имеет около 4 часов наблюдений с Марсом в 10 градусах над горизонтом, а Голдстоун-Канбера чуть меньше 2 часов. На следующей неделе или в следующем месяце все будет иначе.
10 градусов — произвольный предел, и обычно хочется быть выше этого. Я не проверял аппаратные ограничения. И шум неба увеличивается, и боковые лепестки будут улавливать больше шума земли (оба являются тепловыми шумами) по мере приближения к горизонту. Было бы хуже для очень слабого сигнала в очень глубоком космосе, таком как Вояджеры или Новые Горизонты.
Для получения дополнительной информации о шуме см. документ серии DESCANSO « Системы с низким уровнем шума в сети дальнего космоса».
Используйте этот шаблон или аналогичный, используйте ftp или сохраните на диск прямо с веб-страницы:
class Site(object):
def __init__(self, name, latlon):
self.name = name
self.latdeg = latlon[0]
self.londeg = latlon[1]
info = (('Goldstone', (35.426667, -116.89)), ('Madrid', (40.429167, -4.249167)),
('Canbera', (-35.401389, 148.981667)))
import numpy as np
import matplotlib.pyplot as plt
from skyfield.api import Topos, Loader, EarthSatellite
halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]
degs, rads = 180/pi, pi/180
load = Loader('~/Documents/fishing/SkyData') # avoids multiple copies of large files
data = load('de421.bsp')
earth = data['earth']
mars = data['mars']
ts = load.timescale()
print earth.at(ts.now()).position.km # for no reason at all
hours = np.linspace(0, 24, 24*12+1) # 24 hours in 5 minute steps
time = ts.utc(2018, 12, 6, hours) # 2018-12-6
sites = [Site(*thing) for thing in info]
Goldstone, Madrid, Canbera = sites
for site in sites:
site.topo = earth + Topos(longitude_degrees=site.londeg,
latitude_degrees =site.latdeg )
alt, az, dist = site.topo.at(time).observe(mars).apparent().altaz()
site.elevation = alt.radians
site.azimuth = az.radians
pairs = [(sites[i%3], sites[(i+1)%3]) for i in range(3)]
pairnames = [(a.name, b.name) for (a, b) in pairs]
if True:
plt.figure()
fs = 16
plt.subplot(2, 1, 1)
for site in sites:
plt.plot(hours, degs*site.elevation)
plt.plot(hours, np.zeros_like(hours), '-k', linewidth=2)
plt.plot(hours, 10+np.zeros_like(hours), '-k', linewidth=1)
plt.text( 0.2, 51, 'Goldstone', fontsize=fs)
plt.text( 7.0, 65, 'Madrid', fontsize=fs)
plt.text(16.5, 45, 'Canbera', fontsize=fs)
plt.xlim(0, 24)
plt.ylabel('elevation (degs)', fontsize=fs)
plt.subplot(2, 1, 2)
for s0, s1 in pairs:
ok = (degs * s0.elevation > 10) & (degs * s1.elevation > 10)
plt.plot(hours, ok)
plt.ylim(-0.1, 1.25)
plt.xlabel('hours UTC', fontsize=fs)
plt.ylabel('both evelations > 10 degs', fontsize=fs)
plt.xlim(0, 24)
plt.text( 1, 1.05, 'Madrid-Goldstone', fontsize=fs)
plt.text(16.5, 1.05, 'Goldstone-Canbera', fontsize=fs)
plt.suptitle('DSN sees Mars 06-Dec-2018', fontsize=fs)
plt.show()
обновление: вот 2018 календарный год. Логические графики представляют собой конверты для высоты Марса на обоих участках выше 10 градусов. Цветные графики представляют угол возвышения Марса для каждого места.
class Site(object):
def __init__(self, name, latlon):
self.name = name
self.latdeg = latlon[0]
self.londeg = latlon[1]
info = (('Goldstone', (35.426667, -116.89)), ('Madrid', (40.429167, -4.249167)),
('Canbera', (-35.401389, 148.981667)))
import numpy as np
import matplotlib.pyplot as plt
from skyfield.api import Topos, Loader, EarthSatellite
halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]
degs, rads = 180/pi, pi/180
load = Loader('~/Documents/fishing/SkyData') # avoids multiple copies of large files
data = load('de421.bsp')
earth = data['earth']
mars = data['mars']
ts = load.timescale()
print earth.at(ts.now()).position.km # for no reason at all
hours = np.linspace(0, 24, 24*12+1) # 24 hours in 5 minute steps
days = np.arange(0, 367, 2)
sites = [Site(*thing) for thing in info]
Goldstone, Madrid, Canbera = sites
names = [site.name for site in sites]
for site in sites:
site.topo = earth + Topos(longitude_degrees=site.londeg,
latitude_degrees =site.latdeg )
pairs = [(sites[i%3], sites[(i+1)%3]) for i in range(3)]
pairnames = [(s0.name, s1.name) for (s0, s1) in pairs]
big_okays = []
big_elevs = []
for day in days:
time = ts.utc(2018, 1, day, hours) # 2018-12-6
elevs = []
for site in sites:
site.topo = earth + Topos(longitude_degrees=site.londeg,
latitude_degrees =site.latdeg )
alt, az, dist = site.topo.at(time).observe(mars).apparent().altaz()
site.elevation = alt.radians
site.azimuth = az.radians
elevs.append(np.maximum(0, site.elevation))
big_elevs.append(elevs)
okays = []
for s0, s1 in pairs:
ok = (s0.elevation > rads*10) & (s1.elevation > rads*10)
okays.append(ok)
big_okays.append(okays)
big_okays = np.array(big_okays)
new_okays = np.moveaxis(big_okays, 1, 0)
big_elevs = np.array(big_elevs)
new_elevs = np.moveaxis(big_elevs, 1, 0)
if True:
xlims = [hours[0], hours[-1]]
ylims = [days[0], days[-1]]
ylims = [days[-1], days[0]]
extent = sum([xlims, ylims], [])
plt.figure()
for i, (ok, pnames) in enumerate(zip(new_okays, pairnames)):
plt.subplot(3, 1, i+1)
plt.imshow(ok, origin='upper', extent=extent, aspect=1./25)
title = '{}-{}'.format(*pnames)
plt.title(title, fontsize=16)
if i == 2:
plt.xlabel('hours', fontsize=16)
plt.ylabel('days', fontsize=16)
plt.suptitle('DSN two-sites Mars both elevs > 10deg', fontsize=16)
plt.show()
if True:
xlims = [hours[0], hours[-1]]
ylims = [days[0], days[-1]]
ylims = [days[-1], days[0]]
extent = sum([xlims, ylims], [])
levels = [20, 40, 60, 80]
plt.figure()
for i, (elev, name) in enumerate(zip(new_elevs, names)):
plt.subplot(3, 1, i+1)
plt.imshow(degs*elev, origin='upper', extent=extent,
vmin=0, vmax=90, aspect=1./25)
plt.colorbar()
plt.contour(degs*elev, levels=levels, extent=extent,
origin='upper', colors='k', aspect=1./25)
title = '{}'.format(name)
plt.title(title, fontsize=16)
if i == 2:
plt.xlabel('hours', fontsize=16)
plt.ylabel('days', fontsize=16)
plt.suptitle('DSN elevation of Mars (degs), \n levels = 20, 40, 60, 80',
fontsize=16)
plt.show()
Уве
ооо
Уве
ооо
days
иhours
. Skyfield — это чистый питон, и каждый момент времени сейчас дорого стоит. Для разработки используйте меньшие массивы времени, это делает ее намного быстрее.