Palantir — interaktywna mapa nieba i planer obserwacji dla radioteleskopu RT4
Wprowadzenie
Radioteleskop RT4 w Piwnicach pod Toruniem ma czaszę o średnicy 32 metrów i jest największym radioteleskopem w Polsce. Pracuje praktycznie bez przerwy, a w kolejce do obserwacji czekają setki źródeł z kilku projektów naukowych.
Operator siedzący przy teleskopie w środku nocy musi szybko odpowiedzieć sobie na kilka pytań:
- Co jest teraz nad horyzontem i jak wysoko?
- Co warto obserwować, czyli które źródła „dojrzały” do kolejnej obserwacji, a które były robione wczoraj?
- Gdzie patrzy antena i ile zajmie jej przejazd do następnego celu?
- Ile źródeł zmieści się w czasie, który został do końca okna czasowego danego projektu?
Kiedy pracowałem w Katedrze Radioastronomii, na te pytania odpowiadały notatki, tabele i doświadczenie obserwatora. Napisałem więc Palantira: program, który pokazuje to wszystko na jednym ekranie.
O projekcie
Palantir to aplikacja desktopowa w Pythonie. Rysuje aktualną mapę nieba nad obserwatorium, nanosi na nią źródła z katalogów projektów, na żywo pokazuje pozycję anteny RT4 i pomaga ułożyć plan obserwacji.
Pierwszy commit powstał w lutym 2018 r. Od mniej więcej maja 2018 r. program jest używany w obserwatorium na co dzień: działa 24 godziny na dobę jako podgląd pozycji radioteleskopu i jest podstawowym narzędziem do planowania obserwacji. Od ponad czterech lat nie pracuję już w Centrum Astronomii na etacie, ale nadal bywam tam przy obserwacjach raz na tydzień lub dwa i przez cały ten czas utrzymuję i rozwijam Palantira (oraz wiele innych, mniejszych i większych programów mojego autorstwa, które tam działają).
[!NOTE]
Kod źródłowy nie jest publiczny. Jestem w trakcie refaktoru do nowszych standardów i planuję go kiedyś udostępnić, prawdopodobnie razem z publikacją w czasopiśmie naukowym. Ten artykuł opisuje funkcje programu, architekturę i decyzje projektowe.
Kluczowe funkcjonalności
🗺️ Mapa nieba w dwóch projekcjach
Sercem programu jest mapa nieba liczona dla współrzędnych obserwatorium. Dostępne są dwie projekcje, osobno lub obok siebie:
- kartezjańska (azymut i wysokość), wygodna do oceny wysokości źródeł nad horyzontem,
- biegunowa, czyli widok „z zenitu”, który odpowiada temu, jak faktycznie porusza się antena.
Na mapę można nałożyć siatkę współrzędnych równikowych (południki rektascensji i równoleżniki deklinacji), a także Słońce i Księżyc. Źródła nisko nad horyzontem są rysowane coraz bardziej przezroczyście. Jest też tryb ciemny, przydatny w nocy w sterowni.
📡 Pozycja radioteleskopu na żywo
System sterowania RT4 rozgłasza swój stan w sieci lokalnej datagramami UDP. Palantir odbiera je w osobnym wątku i nanosi na mapę:
- aktualną pozycję anteny (czerwony znacznik z linią),
- pozycję zadaną, czyli miejsce, do którego antena właśnie jedzie,
- łuk pokazujący aktualny azymut anteny wraz z jego znakiem.
Dzięki temu jednym rzutem oka widać, na co teleskop patrzy, dokąd zmierza i co ma po drodze. Właśnie w tej roli program działa w obserwatorium bez przerwy.
🎯 Tryb śledzenia (--track)
Uruchomienie z przełącznikiem --track daje gotowy „ekran dyżurny”: tryb ciemny, mapa biegunowa z siatką równikową, automatyczne odświeżanie czasu i widoczna pozycja anteny. To konfiguracja dla monitora, który po prostu wisi w sterowni.
📚 Katalogi źródeł i filtry
Źródła pochodzą z prostych plików tekstowych, po jednym na projekt - tak, by inni koledzy-naukowcy mogli prosto dostarczać pozycje swoich źródeł. Każdy katalog ma nagłówek (projekt, oprogramowanie obserwacyjne, pasmo), a każde źródło: współrzędne, prędkość radialną, liczbę cykli obserwacji oraz minimalny i maksymalny odstęp między obserwacjami w dniach.
W panelu bocznym operator wybiera:
- pasmo odbiornika (L, C, M, X, K lub kontinuum),
- konkretny projekt albo wszystkie projekty w paśmie,
- kalibratory pozycji,
- tryb „tylko do zrobienia”.
Kliknięcie źródła na mapie zaznacza je i wypisuje jego parametry: nazwę skryptu, liczbę cykli, datę ostatniej obserwacji i liczbę dni, które od niej minęły.
🌈 Co jest „do zrobienia”: kolory według wieku obserwacji
Palantir zna historię obserwacji każdego źródła i porównuje ją z odstępami zapisanymi w katalogu:
- źródła obserwowane zbyt niedawno znikają z mapy,
- źródła jednorazowe znikają po pierwszej obserwacji,
- pozostałe dostają kolor ze skali od niebieskiego do czerwonego zależnie od tego, jak blisko są końca swojego okna,
- źródła nigdy nieobserwowane lub przeterminowane są wyróżnione wyraźniejszym znacznikiem.
Operator nie musi niczego pamiętać ani sprawdzać w tabelach. Mapa sama pokazuje, co jest pilne.
🗄️ Automatyczny dziennik obserwacji
Historia nie jest wpisywana ręcznie. Osobny, niewielki serwer TCP działa w obserwatorium jako usługa systemowa. Program archiwizujący obserwacje na innym komputerze (tartar - inny z programów mojego autorstwa) po każdej zakończonej obserwacji wysyła do niego jedną wiadomość (czas, oprogramowanie, odbiornik, projekt, źródło), a serwer zapisuje ją do bazy SQLite. Palantir czyta z tej samej bazy, więc mapa aktualizuje się sama. Baza gromadzi obserwacje od 2020 r.
⏱️ Nawigacja w czasie
Mapę można oglądać dla dowolnej chwili: wpisać datę i godzinę, przesuwać czas przyciskami (±10 minut, ±1 godzina), wrócić do „teraz” albo włączyć automatyczne odświeżanie. Pozwala to sprawdzić, jak będzie wyglądało niebo za trzy godziny, bez liczenia czegokolwiek w głowie.
📈 Wykres widoczności źródła
Dla zaznaczonego źródła program rysuje wysokość nad horyzontem w funkcji czasu dla całej doby. Po najechaniu kursorem na krzywą pojawia się nazwa źródła, więc na jednym wykresie można porównywać kilka obiektów.
🗓️ Planowanie obserwacji krok po kroku
Planer pozwala ułożyć harmonogram bezpośrednio na mapie. Operator klika źródło i dodaje je jako kolejny krok, a program:
- szacuje czas obserwacji na podstawie liczby cykli i trybu, w jakim obserwuje się dane źródło,
- szacuje czas przejazdu anteny z poprzedniej pozycji,
- przesuwa zegar mapy na koniec tego kroku, więc następne źródło wybiera się już na takim niebie, jakie będzie po zakończeniu poprzedniej obserwacji.
Plan pojawia się w osobnym oknie jako tabela z czasem rozpoczęcia, czasem obserwacji i przejazdu każdego kroku oraz sumą. Gotowy plan można wypisać do terminala razem z fragmentem skryptu powłoki, który skleja skrypty obserwacyjne wybranych źródeł w jeden plik gotowy do uruchomienia.
🌍 Wielojęzyczny interfejs i zapamiętywany układ okna
Interfejs jest dostępny po polsku, angielsku i hiszpańsku. Okno zbudowano z dokowanych paneli, które można dowolnie przestawiać i skalować. Układ jest zapamiętywany między uruchomieniami.
Architektura i stack technologiczny
| Warstwa | Technologie | Odpowiedzialność |
|---|---|---|
| Interfejs | wxPython (AUI, FoldPanelBar), matplotlib osadzony w wx | Dokowane panele, mapa nieba, wykresy, okno planu |
| Logika | Python 3.12, dataclasses, czyste funkcje | Projekcje mapy, model planu obserwacji, estymatory czasu |
| Astronomia | astropy, PyEphem, NumPy | Transformacje współrzędnych, czas, pozycje Słońca i Księżyca |
| Dane | SQLite, pandas, pliki tekstowe katalogów | Dziennik obserwacji, katalogi źródeł |
| Sieć | gniazda UDP i TCP, wątki | Odbiór stanu RT4, serwer dziennika obserwacji |
| Konfiguracja | python-dotenv, argparse | Współrzędne obserwatorium, adresy, język, tryb pracy |
| Jakość | pytest, ruff, black, uv | 156 testów jednostkowych, linting, powtarzalne środowisko |
| Wdrożenie | Docker, systemd | Kontener z GUI na pulpicie hosta, serwer dziennika jako usługa |
Kilka decyzji, które uważam za warte opisania:
- Logika oddzielona od GUI. Projekcje mapy oraz cały model planowania obserwacji to moduły bez żadnych importów wx i matplotlib. Dzięki temu da się je testować bez wyświetlacza, a testy trwają kilka sekund.
- Wątki bez zamrażania interfejsu. Odbiór UDP i automatyczne odświeżanie czasu działają w wątkach roboczych, a wszystkie zmiany w GUI wracają do wątku głównego przez własne dekoratory.
- Konfiguracja poza kodem. Współrzędne obserwatorium, adresy sieciowe, ścieżki i język są w pliku
.env, więc ten sam kod działa na stanowisku operatora i na laptopie programisty. Program łatwo można dostosować dla innego obserwatorium. - Refaktor działającego systemu. Program powstawał, gdy byłem naukowcem piszącym kod. Po blisko pięciu latach pracy komercyjnej przepisuję go do standardów, których dziś oczekuję od siebie: typowanie, testy, linting, jasny podział na moduły. Robię to etapami, bo program przez cały czas musi działać w obserwatorium, a ja mam przecież mnóstwo innych zadań - ten projekt nie jest komercyjny.
Palantir w liczbach
- 2018: pierwszy commit, po ok 3 miesiącach intensywnej pracy - praca produkcyjna
- 24/7: tryb pracy jako podgląd pozycji radioteleskopu
- 6 pasm odbiorczych, kilkanaście katalogów projektów
- około 5 tys. linii kodu, 156 testów, 150 commitów
- 3 języki interfejsu
Plany rozwoju
- [x] Przejście na nowoczesne narzędzia (uv, ruff, pytest)
- [x] Wydzielenie logiki z warstwy GUI i pokrycie jej testami
- [x] Wielojęzyczny interfejs
- [x] Wdrożenie w kontenerze
- [ ] Dokończenie refaktoru warstwy mapy nieba
- [ ] Publiczne udostępnienie kodu
- [ ] Publikacja opisująca program w czasopiśmie naukowym