Calcolare la distanza tra due satelliti partendo dai TLE

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 :wink:

1 Mi Piace

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 :slight_smile:
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.

1 Mi Piace

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.

1 Mi Piace

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.

1 Mi Piace

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.

1 Mi Piace

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)

2 Mi Piace

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.

2 Mi Piace

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 :smiley: 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))
2 Mi Piace

@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 :slightly_smiling_face:

4 Mi Piace

Mi fa tantissimo piacere saperlo! Grazie!

2 Mi Piace

@Buzz Per caso il lavoro fatto era per questo?

1 Mi Piace

No, era per il primo :slightly_smiling_face: