Ok, una volta fatto quello dovresti ripetere il calcolo incrementando il tempo di un minuto per volta, giusto?
Il tracking lo fanno entrambi, ma a me interessa la parte mia. Il tracking che fa Sentinel è n problema loro
Ok, una volta fatto quello dovresti ripetere il calcolo incrementando il tempo di un minuto per volta, giusto?
Il tracking lo fanno entrambi, ma a me interessa la parte mia. Il tracking che fa Sentinel è n problema loro
Yep, l’iterazione temporale è la parte che mi preoccupava meno per cui l’ho ingnorata ora.
Allora inverto. Spero che abbia senso calcolare un punto topocentrico a 45000 km
Ma davvero il tracking è in Az/el rispetto all’“orizzonte” del satellite?
No poi ci devi mettere le matrici di trasformazione per andare in cordinate laser terminal. Ed è tutto girato a testa in giù…
Comunque tutto questo lo fa il propagatore di bordo, a me serve per sapere le distanze e le posizioni relative quando ho qualche anomalia
Ho trovato l’anomalia nei miei conti (letteralmente) che porta all’errore di 1.000 km.
Ho usato l’anomalia media al posto di quella vera. Mi sembra che siete già andati abbastanza avanti ed è inutile rifare i conti.
L’azimuth calcolato usando il satellite in GEO come punto di osservazione è diverso da quello calcolato da STK…
(l’elevazione negativa corrisponde)
subpoint = eutelsat9b.at(ts.utc(2019,8,27,8,0,0)).subpoint()
print(subpoint)
print(subpoint.elevation.km)
difference = sentinel1a - subpoint
el, az, distance = difference.at(ts.utc(2019,8,27,8,0,0)).altaz()
print('Azimuth:', az)
print('Elevation:', el)
print('Distance:', distance.km)
Output
Topos 00deg 01' 25.9" N 08deg 58' 23.5" E
35797.462599367725
Azimuth: 345deg 07' 20.4"
Elevation: -80deg 54' 24.5"
Distance: 39295.57437764147
Inoltre, non ho ancora capito come fare per calcolare se i due satelliti sono in vista tra di loro, non eclissati dalla terra.
Quanto è grande la terra, in gradi, dalla GEO?
Il raggio della GEO è 42164 km (ipotenusa del triangolo), il raggio della Terra è 6371 km (cateto lontano), quindi l’angolo coperto dalla Terra è 2x arcsin (6371 / 42164) = 0.3034 rad = 17.38 deg.
Secondo me un modo più semplice, anche se un po’ approssimato, può essere pensare ad un triangolo rettangolo i cui due cateti sono il raggio della GEO e il raggio dell’orbita di Sentinel 1A (7073 km), e quindi la cui ipotenusa è di 42753 km. E di conseguenza, dal tuo calcolo delle distanze, escludere tutti i casi in cui la distanza è maggiore di 42753 km.
Il metodo sopra è un po’ approssimato perché la vera distanza massima sarà un po’ più alta. Per farlo esatto dovresti pensare ad un raggio che parte dalla GEO, tangente alla superficie terrestre (quindi inclinato di 8.69 deg, che prosegue oltre la terra fino a raggiungere l’orbita di S1A a 7073 km.
Se faccio il calcolo esatto (ho dovuto disegnarmi la cosa su in foglio per applicare la trigonometria), la distanza massima in visibilità mi viene 45282 km.
Usando quella distanza (45282)
import skyfield
import numpy
import datetime
from skyfield.api import Topos, load
ts = load.timescale()
satellites = load.tle('https://celestrak.com/NORAD/elements/geo.txt',reload=True)
eutelsat9b = satellites['EUTELSAT 9B']
satellites = load.tle('https://celestrak.com/NORAD/elements/resource.txt', reload=True)
sentinel1a = satellites['SENTINEL-1A']
subpoint = eutelsat9b.at(ts.utc(2019,8,27,8,0,0)).subpoint()
difference = sentinel1a - subpoint
time_range=ts.utc(2019,8,27,0,range(0,24*60))
print("Time,Az,El,Distance")
for time in time_range:
el, az, distance = difference.at(time).altaz()
if distance.km > 45282:
print("No vis")
else:
print(str(time.utc_iso())+","+str(az.degrees)+","+str(el.degrees)+","+str(distance.km))
output.csv (83,8 KB)
Figo! Grazie!
Ma Skyfield carica i TLE in base al nome del satellite?
Cioè se metto Sentinel-1B invece di 1A lui lo trova nel file di Celstrak e carica i TLE giusti?
Quando carica i tle nel dizionario, usa il testo della riga col nome nel tle (three lines, in questo caso :))
Per cui si… Guarda i nomi disponibili nel file di celestrak.
Ho appena trovato un errore. Standby
Edit:
No, Skyfield è più furbo di me.
Mi sono accorto che aveco calcolato il subpoint (posizione relativa alla superficie terrestre, rispetto al centro della terra, necessaria per calcolare azimuth e elevazione) per Eutelsat-9B ad un orario fisso, e poi calcolato le distanze da quel punto al sentinel.
Tuttavia, Skyfield nel rivalutare la differenza ricalcola anche il subpoint.
Il codice che segue è forse meno efficiente, ma almeno non ha quella ambiguità. I risultati cambiano di qualche decina di km, ma ho scaricato TLE nuovi. LOS e AOS non cambiano, a dimostrazione che la soluzione di prima era comunque giusta (o sbagliata nello stesso modo non so se hai modo di valutare questi risultati…io ci sto dedicando 10/15 minuti al giorno tra gli impegni familiari)
for time in time_range:
subpoint = eutelsat9b.at(time).subpoint()
difference = sentinel1a - subpoint
el, az, distance = difference.at(time).altaz()
if distance.km > 45282:
print("No vis")
else:
print(str(time.utc_iso())+","+str(az.degrees)+","+str(el.degrees)+","+str(distance.km))
@Mike, non te l’ho più detto, ma alla fine siamo partiti da quello che hai postato e ci siamo sviluppati un piccolo tool in Python. Grazie ancora per l’aiuto
Mi fa tantissimo piacere saperlo! Grazie!
@Buzz Per caso il lavoro fatto era per questo?
No, era per il primo