Pytanie:
Jak programowo obliczyć elementy orbity za pomocą wektorów pozycji / prędkości?
Stu
2013-09-11 16:49:49 UTC
view on stackexchange narkive permalink

Chciałbym zbudować od podstaw oprogramowanie do mechaniki orbitalnej. Uważam, że byłby to świetny sposób, aby nauczyć się kroków wymaganych do obliczenia różnych elementów orbitalnych Keplera obiektu, wykreślenia orbit i przewidywania, gdzie obiekt będzie w przyszłości.

W szczególności chcę zacząć od obliczenia elementów Keplarian. Dane wejściowe, które dałbym programowi, to wektory położenia i prędkości, wraz z czasem. Te wektory wejściowe będą względem środka Ziemi, więc być może będę musiał wykonać transfer współrzędnych, jeśli chcę użyć określonej lokalizacji na powierzchni jako punktu odniesienia.

Widziałem matematyka do obliczania elementów orbitalnych Keplera z tej książki i wiem, że przez lata opracowywano wiele programów do ich obliczania, ale trudno mi połączyć te dwa elementy. Matematyka w książce jest nieco zagmatwana i myślę, że byłoby mi łatwiej ją zrozumieć, gdybym zobaczył kroki „wypisane” w języku programowania.

Mogę używać R lub Pythona. Kod wektorowy z większości języków, który powinienem być w stanie przetłumaczyć na jeden z tych dwóch. Dzięki! @Chris Ponownie zaktualizuję pytanie, dodając trochę więcej informacji na temat moich problemów z tłumaczeniem matematyki na kod.
Sprawdź http://orsa.sourceforge.net/, aby zapoznać się z ich rozwiązaniami / metodami. Długa dyskusja tutaj http://www.physicsforums.com/showthread.php?t=232778. A dla symulacji Python basic F = ma: https://fiftyexamples.readthedocs.org/en/latest/gravity.html
FWIW, jeśli twoim celem jest obliczenie przyszłej pozycji, zwykle nie ma powodu, aby konwertować z wektora położenia i prędkości na elementy keplerowskie. Po prostu oblicz i zastosuj opór i siłę grawitacji w bieżącej lokalizacji i prędkości, a następnie całuj do przodu małymi krokami.
Trzy odpowiedzi:
user29
2013-09-12 19:02:44 UTC
view on stackexchange narkive permalink

Mając na Ziemi, bezwładnościowe (ECI) położenie i wektory prędkości $ \ vec {r} $ i $ \ vec {v} $, możesz bezpośrednio obliczyć klasyczne elementy orbity $ (a, e, i, \ Omega, \ omega, \ nu) $ w następujący sposób (najpierw algorytmy, a na dole pseudokod):

Najpierw znajdź moment pędu $$ \ vec {h} = \ vec {r} \ times \ vec {v} $$

to wektor węzłowy $$ \ hat {n} = \ hat {K} \ times \ vec {h} $$, który zostanie użyty później.

Wektorem mimośrodu jest zatem $$ \ vec {e} = \ frac {(v ^ 2- \ mu / r) \ vec {r} - (\ vec {r} \ cdot \ vec {v} ) \ vec {v}} {\ mu} $$

i $ e = | \ vec {e} | $.

Specyficzna energia mechaniczna wynosi $$ E = \ frac {v ^ 2} {2} - \ frac {\ mu} {r} $$

Jeśli $ e \ neq 1 $, to $$ a = - \ frac {\ mu} {2E} $$$$ p = a (1-e ^ 2) $$ W przeciwnym razie $$ p = \ frac {h ^ 2} {\ mu} $$ $$ a = \ infty $$

Teraz $$ i = \ cos ^ {- 1} {\ frac {h_K} {h}} $$$$ \ Omega = \ cos ^ {- 1} {\ frac {n_I} {n}} $$$ $ \ omega = \ cos ^ {- 1} {\ frac {\ vec {n} \ cdot \ vec {e}} {ne}} $$$$ \ nu = \ cos ^ {- 1} {\ frac { \ vec {e} \ cdot \ vec {r}} {er}} $$

I będziesz musiał dokonać następujących kontroli: Jeśli $ n_J<0 $, to $ \ Omega = 360 ^ {\ circ} - \ Omega $,

Jeśli $ e_K<0 $, to $ \ omega = 360 ^ {\ circ} - \ omega $ i

Jeśli $ \ vec {r} \ cdot \ vec {v} <0 $, a następnie $ \ nu = 360 ^ {\ circ} - \ nu $.

Zauważ, że napotkasz problemy (osobliwości) z pewnymi przypadki: szczególnie orbity kołowe ($ e \ approx 0 $) i orbity równikowe ($ i \ ok. 0 $). W takich przypadkach zwykle wprowadzasz nową, mniej kłopotliwą zmienną, taką jak średnia długość lub rzeczywista długość geograficzna perygeum.

  h = cross (r, v) nhat = cross ([0 0 1], h) evec = ((mag (v) ^ 2-mu / mag (r)) * r-dot (r, v) * v) / mue = mag (evec) energia = mag (v) ^ 2 / 2- mu / mag (r) if abs (e-1.0) >eps a = -mu / (2 * energia) p = a * (1-e ^ 2) else p = mag (h) ^ 2 / mu a = infi = acos (h (3) / mag (h)) Omega = acos (n (1) / mag (n)) if n (2) <0 Omega = 360-Omegaargp = acos (dot (n, evec) / (mag ( n) * e)) if e (3) <0 argp = 360-argpnu = acos (dot (evec, r) / (e * mag (r)) if dot (r, v) <0 nu = 360 - nu  kod> 

Uwaga : wynika to z metody przedstawionej w Fundamentals of Astrodynamics and Applications , Vallado, 2007.

Wreszcie odtworzony w Pythonie. Dzięki za pomoc! To było całkiem proste i teraz znacznie lepiej rozumiem matematykę.
Bardzo chciałbym zobaczyć dowód na te równania, a także ich zastosowanie w prawdziwym problemie wyprowadzenia zestawu elementów orbitalnych. Czy elementy orbitalne są w ogóle potrzebne, jeśli na początku dysponujesz tymi wektorami pozycji i prędkości? Wygląda na to, że rachunek wektorowy poradzi sobie z tym po prostu. Poza tym jestem zdezorientowany faktem, że nie zdefiniowałeś małego mu. Również wektor v jest pierwszą pochodną czasową wektora r. N-hat jest wektorem jednostkowym, ale nie pokazałeś matematyki potrzebnej do ujednolicenia go. Jakie są indeksowane wartości n i h? Nie udało Ci się również pokazać, jak wyprowadzić średnią anomalię i średni ruch
A co z obliczeniem średniej anomalii?
Czy jest jakaś różnica między nhat i n? Nie jestem pewien, czym jest n (zakładając, że n to jest wektor węzłowy), ale zostało to użyte do obliczenia argumentu perycentrum. Zakładam, że n to to samo, co nhat in zostało użyte przez pomyłkę?
Do programowania wolałbym równoważne relacje używające funkcji atan2, ponieważ będzie ona automatycznie wykonywała kwadrantowe rozdzielczości i chroniła przed koniecznością sprawdzania zakresu przed większością zastosowań powyższych acos. (Czasami precyzja numeryczna może spowodować, że argument funkcji acos będzie bardzo nieznacznie autosprawdzony z prawidłowym zakresem od -1,00000 do +1,00000. W takim przypadku program, jak pokazano, ulegnie awarii.) Możliwe jest również, że h będzie równe zero, dopuszczając błąd dzielenia przez zero.
Jaki khat w drugiej linii? Widzę w przykładowym kodzie, że [0 0 1] czy to normalny wektor płaszczyzny równikowej Ziemi?
Jednym z problemów jest to, że polega to na pobraniu punktu riv i przekształceniu go w tym momencie w elementy, które nie będą zwykłymi wartościami średnimi w zestawie elementów dwuwierszowych. To, co ludzie robią, aby wygenerować tablicę TLE z wektorów, to propagacja wektora do przodu za pomocą całkowania numerycznego, a następnie dopasowywanie terminów TLE, aby go dopasować. Jeśli jesteś wystarczająco wysoki, prawdopodobnie możesz zignorować termin drag. Jeśli nie potrzebujesz bardzo wysokiej precyzji, możesz modelować ziemię jako masę punktową.
Co to jest „a”? Patrzę na [ten obraz referencyjny] (https://user-images.githubusercontent.com/1646875/47543388-f8cf1f00-d8af-11e8-8775-a97e44df246f.png).
Co to jest wektor węzłowy `n ^`? Co to jest `K ^ '? Co to jest „μ”? Co to jest „r” i czym się różni od „r⃗”? A co z `v` i` v⃗`? Co to jest „p”?
Co to jest „h_K” i „n_I”?
@MattJessick Jak byś to zrobił używając Atan2?
PearsonArtPhoto
2013-09-11 20:34:20 UTC
view on stackexchange narkive permalink

Pierwszym kluczem do zrozumienia tego jest poprawienie układu współrzędnych. W takich przypadkach istnieją dwa powszechnie używane układy współrzędnych. Są to ramy zwierciadlane (ECEF) i Earth Centered Earth Fixed (ECI). O północy te dwie dokładnie ustawiają się w jednej linii, ale w innych momentach różnią się w zależności od obrotu Ziemi. ECEF działa najlepiej w przypadku obiektów na Ziemi (jeśli się nie poruszasz, powinieneś mieć prędkość 0. ECEF bierze to pod uwagę, prędkość ECI sprawi, że będziesz się poruszać wraz z obrotem Ziemi), ECI działa najlepiej w przypadku obiektów na orbicie (Orbitowanie obiekty nie przejmują się obrotem Ziemi, a przynajmniej fizyka to nie obchodzi). Upewnij się, że układy współrzędnych są poprawne!

OK, więc masz pozycję i prędkość we współrzędnych ECI, co robisz? Istnieje doskonały artykuł, który opisuje cały proces, którego końcowe formuły powielę tutaj. Jest też kilka dobrych źródeł tutaj, tutaj i tutaj. Gorąco polecam uważne ich przeczytanie. Niepewność jest znacznie trudniejsza, więc załóżmy, że masz doskonałą wiedzę o prędkości i pozycji. Konkretnie, 6 klasycznych elementów keplariańskich to mimośrodowość (e), nachylenie (i), rektascensja węzła wstępującego ($ \ Omega $), argument perygeum ($ \ omega $), półoś wielka (a) i czas przejścia perygeum ($ T_O $).

Powinienem wspomnieć, że przede wszystkim stosuję metodę Laplace'a określania orbity, istnieje konkurencyjna metodologia znana jako metoda Gaussa. Ale ostatecznie sprowadzało się to do rozszyfrowania kodu Matlab.

Półoś główna oś

$ W_s = \ frac {1} {2} * v ^ 2s - \ text {mus} ./ r; $

$ a = -mus / 2. / W_s $; % półoś wielkiej

Mimośrodowość

  L = [rs (2,:). * vs (3, :) - rs ( 3,:). * Vs (2,:); ... rs (3,:). * Vs (1, :) - rs (1,:). * Vs (3,:); ... rs (1,:). * Vs (2, :) - rs (2,:). * Vs (1, :)]; % momentu pędu  

$ p = \ sum {L ^ 2} ./ mus; $% semi-latus rectum

$ e = \ sqrt {1 - p / a}; % ekscentryczności $

Nachylenie

$ I = atan (\ frac {\ sqrt {L (1,:) ^ 2 + L (2 ,: ) ^ 2}} {L (3,:)}); $

Argumenty Pericenter

$ \ omega = atan2 (\ frac {( vs (1,:). * L (2, :) - vs (2,:). * L (1,:)) ./ mus - rs (3,:) ./ r) ./ (e. * sin (I))} {((\ sqrt {L2s}. * vs (3,:)) ./ mus - (L (1,:). * rs (2, :) - L (2, :). * rs (1,:)) ./ (\ sqrt {L2s}. * r)) ./ (e. * sin (I)))} $

Długość węzła wstępującego

$ \ Omega = atan2 (-L (2, :), L (1,:)); $

Czas przejścia Perygeum:

$ T_0 = - (E - e. * sin (E)) ./ \ sqrt {mus. * a. ^ - 3} $

Metoda Laplace'a polega na początkowym określeniu orbity na podstawie pomiarów kątów i (jak sądzę) daleko wykracza poza zakres tego, czego szuka OP. Jeśli masz pozycję i prędkość ECI, uzyskanie elementów Keplera jest po prostu prostą [transformacją współrzędnych] (http://ccar.colorado.edu/ASEN5070/primers/cart2kep/cart2kep.htm).
@Chris: Wiedziałem, że musi istnieć łatwiejszy sposób na dokonanie transformacji… Ech.
A co z układem współrzędnych w zakresie ręczności i orientacji? Z tego, co wiem, większość przewodników używa Z-is-up. Jak te formuły zostałyby zaimplementowane w systemie leworęcznym Y-is-up, takim jak Unity, lub systemem praworęcznym Y-is-up, jak Godot?
alexamici
2016-04-08 11:50:18 UTC
view on stackexchange narkive permalink

OrbitalPy ma przydatną funkcję elements_from_state_vector , która właśnie to robi:

https://github.com/RazerM/orbital/ blob / 0.7.0 / orbital / utilities.py # L252

Możesz sprawdzić, czy matematyka jest taka sama jak w odpowiedzi user29.

Hej, to całkiem fajne! Nie mogę się doczekać, aby tego spróbować. W drugim przykładzie w dokumentacji, zatytułowanym „* Utwórz orbitę molniya *”, czy OrbitalPy może zaimplementować precesję? Czy jest miejsce na dodanie J2? (i myślę, że Molniya powinno być pisane wielką literą - myślę, że kwalifikuje się to jako nazwa własna).
Sam nie jestem zaznajomiony z OrbitalPy, ale z ograniczonej analizy kodu źródłowego, którą przeprowadziłem, wydaje się, że wykonuje on czystą dwu-ciałową propagację keplerowską, bez żadnych zakłóceń, więc bez korekt elipsoid.
OK, dzięki za info - zawiruję.
Czy jest to napisane z myślą o układzie współrzędnych „Z-is-up”? Jeśli mam układ współrzędnych „Y-is-up”, czy powinienem zamienić „h.z” na „h.y” i „[0, 0, 1]„ na „[0, 1, 0]„?
„Argumentem perycentrum jest kąt pomiędzy wektorem mimośrodu a jego składową x”. Czemu?


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...