Predict4java Tutorial – Pozycja satelitów w czasie rzeczywistym

Spoglądaliście kiedyś w nocne niebo zastanawiając się czym są widziane przez ciebie punkty a może korzystaliście kiedyś z aplikacji wskazujących pozycje różnych konstelacji czy innych obiektów? Może samemu chcielibyście stworzyć własną aplikacje ukazującą położenie satelit na niebie? Jeśli tak to ten artykuł może Cię zainteresować.


Nad naszymi głowami aktualnie znajduję się kilkaset aktywnych satelitów komunikacyjnych, obserwacyjnych, meteorologicznych, nawigacyjnych a także badających kosmos czy wojskowych. Położenie satelitów można jednak określić dzięki ich wskaźnikom TLE. TLE to zapis informacji o satelicie w formie

0 LANDSAT 8
1 39084U 13008A 16168.69890018 .00000098 00000-0 31885-4 0 9995
2 39084 98.2240 238.4076 0001279 94.2262 265.9083 14.57111477177821

TLE zawiera wiele wiadomośći o satelicie takich jak numer w katalogu Norad, datę  wprowadzenie satelity na orbitę, inklinacja orbity, ekscentryczność, argument perygeum i wiele innych których możemy wykorzystać w aplikacji.
Istnieją algorytmy stworzone w latach 80 ubiegłego wieku pozwalające nam ustalić położenie satelity niemniej ich implementacja jest stosunkowo skomplikowana. Zainteresowanych odsyłam do http://www.celestrak.com/publications/AIAA/2006-6753/AIAA-2006-6753.pdf Dla tych zaś co nie planują odtwarzać koła polecam Predict4Java.
 
Predict4java jest darmową biblioteką pozwalająca nam wyliczyć położenie satelity korzystając z parametrów TLE, możliwą do pobrania z repozytorium githuba https://github.com/badgersoftdotcom/predict4java bądz za pomocą mavena jeśli z niego korzystamy.
 
Kod wygląda następująco:


Date now = new Date();
String threeLineElement[] = new String[3];
threeLineElement[0]="0 LANDSAT 8";
threeLineElement[1]="1 39084U 13008A 16168.69890018 .00000098 00000-0 31885-4 0 9995";
threeLineElement[2]="2 39084 98.2240 238.4076 0001279 94.2262 265.9083 14.57111477177821";

TLE tle = new TLE(threeLineElement);
Satellite sat = uk.me.g4dpz.satellite.SatelliteFactory.createSatellite(tle);
GroundStationPosition GSP = new GroundStationPosition(0,0,0)

Double lat = sat.getPosition(GSP, now).getLatitude()*180.0/Math.PI;
Double long = sat.getPosition(GSP, now).getLongitude()*180.0/Math.PI;
if(long>180.0f){
    long = -(360.0f - long);
}

System.out.println(lat);
System.out.println(long);

Na początku tworzymy obiekt z obecną datą oraz tablice zawierającą dane TLE. Korzystając z bibloteki predict4java tworzymy obiekt TLE i na jego podstawie korzystając ze statycznej metody createSatellite tworzymy obiekt reprezentujący satelitę. Następnie tworzymy obiekt GroundStationPosition reprezentujący stacje naziemną przyjmuje on trzy parametry szerokość geograficzną, długość geograficzną oraz wysokość. Gdy mamy to zrobione możemy wyliczyć pozycje satelity korzystając z metody getPosition() w postaci lat long. Aby móc wyniki przedstawić na mapie dokonujemy jedynie kilku dodatkowych wyliczeń.

 

Istnieją również bibloteki w C# i C++ dla osób które czują się pewniej w tych jężykach:

http://www.zeptomoby.com/satellites/

 

Skąd pobierać dane TLE?

Istnieje wiele portali tego typu. Osobiście polecam https://www.space-track.org udostępnia darmowe api zawierające dane tle jak również liczne informacje o samych satelitach.

Warto co jakiś czas aktualizować nasze dane TLE bowiem nie są one stałe i dezaktualizują się one z czasem szczególnie gdy monitorujemy obiekty na niskiej orbicie. Niemniej nie musimy robić tego codziennie dopiero po kilku tygodniach zmiany są bardziej znaczące.

 

Przykład bardziej rozbudowanego rozwiązania uwzględniający wyliczanie orbit sateli możemy zobaczyć tutaj:

http://gwiezdny-towarzysz.rhcloud.com

 

Ciekawe referencje:

https://pl.wikipedia.org/wiki/TLE

http://www.celestrak.com

http://richiecarmichael.github.io/sat/#

http://apps.agi.com/SatelliteViewer/?Status=Operational

http://www.n2yo.com/?s=41391

Dodaj komentarz

WordPress Video Lightbox Plugin