Wie optimiert man den Zündzeitpunkt für eine On-Orbit Burn- und/oder Coast-Phase beim Aufstieg?

Ich habe mit linearen Tangenten-basierten Führungsgesetzen herumgespielt (insbesondere die alte Atlas-Centaur Surveyor-Führung, Apollo IGM und Space Shuttle PEG-Code) und obwohl PEG eine Option für eine Küstenphase vor dem endgültigen Brennen hat, gibt es keine Modi wo der Prädiktor-Korrektor diese Küste optimieren wird. Es scheint ein externer Parameter zu sein.

Ich habe Papiere gefunden wie zB:

Ping Lu, Brian J. Griffin, Gregory A. Dukeman und Frank R. Chavez. "Rapid Optimal Multiburn Ascent Planning and Guidance", Journal of Guidance, Control, and Dynamics, Vol. 3, No. 31, Nr. 6 (2008), S. 1656-1664.

Aber die Eingeweide des PEG-Algorithmus herauszureißen und ihn durch einen solchen Ansatz zu ersetzen, wird ziemlich aggressiv sein (und ich bin mir nicht sicher, ob ich dazu im Moment in der Lage wäre). Ich benötige auch nicht unbedingt Optimalität bis zum letzten dV an Treibstoff, und Einfachheit und Konvergenz wären mir wichtiger - daher sind die Algorithmen, die die NASA derzeit verwendet, wahrscheinlich umfangreicher als das, was ich verlange.

Ich vermute, dass es einige einfache Algorithmen der späten 60er / frühen 70er Jahre gibt, um zumindest ausreichend gute Antworten zu erhalten:

  • Freilaufphase vor der endgültigen Verbrennung bis zur orbitalen Insertion
  • Zeitpunkt der Zündung vor einem Finite-Thrust-Manöver im Orbit
  • Zeitpunkt der Zündung vor einem Abstiegsbrand zur Landung auf einem Körper (airless)

Und das ist letztlich eine Frage des Kerbal Space Program. Und leider war mein letzter Variationsrechnungskurs ungefähr 20 Jahre her, daher bin ich in Mathe etwas eingerostet.

Ich verstehe die Primer-Vektor-Theorie vage, und es scheint, als wäre die Bang-Bang-Umschaltfunktion das, was ich gerne erreichen würde, aber ich weiß nicht, wie ich sie aus PEG herausbekomme oder wie ich sie auf PEG schrauben soll .

Einige mögliche Klarstellungen: Ich glaube nicht, dass ich mich mit Closed-Loop-Optimierung befasse. Ich vermute, was ich will, ist näher am OPGUID-Algorithmus und dem SWITCH-Algorithmus, der in definiert ist:

Brown, KR, Harrold, EF und Johnson, GW 1969. Schnelle Optimierung von Raketenflügen mit mehreren Verbrennungen. Technischer Bericht NASA CR-1430, NASA, Marshall Space Flight Center.

Was ich nicht weiß, ist, ob es einfachere Ansätze gibt, die ich verwenden könnte, um neuere Standardalgorithmen zu nutzen (genauer gesagt verlinke ich bereits auf http://www.alglib.net/optimization/ für die Levenberg-Marquardt Optimierer dort, und es hat viele andere Optimierer, die das Lösen des Trajektorienoptimierungsproblems viel einfacher machen könnten, aber ich habe nicht den Hintergrund, um zu wissen, was nützlich sein könnte).

Und ich denke, meine Frage läuft darauf hinaus, ob ich in die OPGUID- und SWITCH-Algorithmen eintauchen sollte - und in Dutzende von Seiten Fortran-Code, die älter sind als ich - oder ob es einen einfacheren, moderneren Weg gibt, dies zu tun, den ich vermisse ich? Vorbehaltlich des äußeren Zwanges, dass es mir bisher besser gelungen ist, alte NASA-TDs zu implementieren als Algorithmen in der Literatur.

Die Erläuterungen sind hilfreich!+1

Antworten (1)

Hier sind Blockdiagramme für PEG-4-Code verfügbar, die sich mit Onorbit- und Deorbit-Manövern befassen:

https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19760024151.pdf

Im TURNR-Code ist eine Begrenzung des Phi max auf < 45 Grad erforderlich. Und es ist auch notwendig, die LambdaDot_xz-Größenbegrenzung auf 0,35 der Schuler-Frequenz bei der Verbrennung zu implementieren. Es gibt mehr Details in der Arbeit von 1979 über den PEG-Algorithmus:

https://ntrs.nasa.gov/search.jsp?R=19790048206

Der Shuttle-Code verwendete einige Subroutinen namens LTVCON und TRANSTIME, um das Burn-Coast-Targeting zu handhaben, um es durch das Burn und die Küste zu integrieren, einschließlich J2-Effekte der Erdabflachung, um ein ar, v-Ziel zu treffen.

Was ich gefunden habe, ist, dass es (in KSP) ausreicht, im Korrektor zu implementieren:

  1. projizieren Sie rp normal in die Zielebene iy
  2. setze rd = rp (keine Begrenzung der Burnout-Position)
  3. Berechnen Sie den vorzeichenbehafteten Winkel zwischen rd und der Periapsis der Zielbahn, um die wahre Anomalie der Burnout-Position zu erhalten (Periapsis-Kreuz rd sollte in der -iy-Richtung liegen; das Punktprodukt davon mit -iy sollte positiv sein; oder kehren Sie das Vorzeichen um am Winkel)
  4. setze vd gleich der Geschwindigkeit der Zielumlaufbahn bei dieser wahren Anomalie
  5. Stellen Sie die Verstärkung auf 1,0 ein (da es keine Integration durch eine Freilaufphase gibt)

Der größte Teil der LTVCON- und TRANSTIME-Komplexität scheint darauf zurückzuführen zu sein, dass der genaue Prädiktor im Shuttle-Code verwendet wird, um J2-Effekte während der Coast-Phase (oder den größten Teil der Coast-Phase – da sich die Burnout-Position aufgrund von PEG zur Coast-Zeit ändert) zu berücksichtigen variiert je nach Delta-Küste und ich denke, das wird durch eine präzise Vorhersage mit J2 = 0 gespeist - wahrscheinlich entweder aus Gründen der numerischen Effizienz oder aus Gründen der numerischen Stabilität?). Ich bin auch immer noch etwas verblüfft über die C1- und C2-Konstanten in der LTVCON-Routine (insbesondere wofür C1 verwendet wird).

Für die Vorlaufzeit habe ich festgestellt, dass es gut funktioniert, den Brennvorgang einfach mit tgo/2 zu führen, obwohl es möglicherweise nicht perfekt optimal ist. Ich vermute, dass es etwas präziser sein könnte, PEG kontinuierlich laufen zu lassen und dann das Brennen bei J / L vor dem Brennen auszuführen (in Ermangelung eines besseren Trajektorienplaners, der auf Variationsrechnungen basiert).

UPDATE: Ich glaube, ich verstehe jetzt etwas besser, dass die LambdaDot_xz-Einschränkungen in der TURNR-Routine für Abort Once Around und Deorbit Burns verwendet werden. Am Ende habe ich die Standard-TURNR-Routine verwendet, aus der rgo berechnet wirdrgo = rd - ( r + v * tgo + rgrav ) + rbias(wobei rd verwendet wird, wo ich glaube, dass die Positionsbeschränkung in die Routine zurückfließt) und dann LambdaDot normal berechnet und die rthrust- und vthrust-Schubintegrale verwendet. Wo ich auf Schwierigkeiten gestoßen bin, ist, dass die LambdaDot-Berechnung sogar 50-60 Sekunden nach dem Ende des Brennens völlig instabil wird. Ich habe LambdaDot auf 0,35 * den Schuler-Frequenzwert geklemmt - also wird die Klemme auf LambdaDot angewendet und es geht auf Null, wenn tgo auf Null geht. Das Erzwingen dieser Klemme während der gesamten Verbrennung (wie dies bei Deorbit oder AOA der Fall ist) bedeutete, dass die Burnout-Position einen großen Vorspannungswert hatte, sodass sie nicht genau war.

C1 und C2 sind Koeffizienten in einer linearen Gleichung, die die Beziehung zwischen der horizontalen und vertikalen Geschwindigkeit herstellt: V(vert) = C2 * V(horiz) + C1. Bei der Verbrennung des Shuttles OMS1 oder OMS2 war der Zielpunkt immer ein Apogäums- oder Perigäumspunkt, was impliziert, dass die vertikale Geschwindigkeit Null ist. C1 und C2 sollten daher Null sein. Für eine Deorbit-Verbrennung muss die vertikale Geschwindigkeit bei El, dem Zielpunkt, eine negative Zahl sein. Für Deorbit-Manöver wäre C1 eine große positive Zahl und C2 würde zwischen 0 und -1 liegen. Ein Deorbit aus einer Umlaufbahn von 150 nm könnte C1 = 15.434 und C2 = -0,6200 haben.
Mir fehlt noch etwas, denn warum nicht einfach C2 haben und dann die horizontale Geschwindigkeit am Ziel eingeben und dann die vertikale Geschwindigkeit ablesen und C1 = 0 setzen?
Ich erinnere mich an etwas über ?Führung?Tgo?Vgo? gegen Ende einer Shuttle-OMS-Verbrennung nicht konvergiert. Werde sehen, was ich finden kann.
Um es klar zu sagen, gibt es die normale Instabilität der Endführung, die bei PEG auftritt und das Lösen der Positionsklemme (rd = rp) 40 Sekunden vor dem Ende der Verbrennung erfordert, und dann scheint wirklich jede aktive Führung 10 Sekunden vor dem Ende beendet zu werden der Verbrennung. Dies war eine zusätzliche Instabilität obendrein. (Ich habe auch mehr Referenzen zu C1 und C2 gefunden und glaube, ich fange an, diese besser zu verstehen.)
@OrganicMarble auf Seite 40 Jaggers diskutiert Probleme in den letzten 40 Sekunden eines OMS-Brennens in den J- und Q-Integralen: ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19760020204.pdf
Entdeckt, dass ich versehentlich die Klemme stop-updating-lambdaDot-in-the-last-40-seconds aus meinem Code entfernt hatte, erklärt aber immer noch nicht ganz, dass lambdaDot vor Ablauf der 40 Sekunden ausflippt, obwohl ich es bin Ich begann zu vermuten, dass 40 Sekunden auf das Shuttle und seine Motoren abgestimmt war.
Ich bin auch auf eine Aussage in einem Artikel gestoßen, dass PEG in der Endphase auf eine korrekte Beschleunigungserkennung angewiesen ist, um Instabilität zu vermeiden, und ich habe einen Fehler von Fehlern aufgespürt, den ich in der Nähe hatte. Ich habe vgo während der realen Endphase nicht heruntergezählt, indem ich nur das gemessene dV verwendet habe, und indem ich das implementiert habe (damit ich sehen konnte, dass es ohne PEG-Korrektur ausgeführt wurde) und Fehler behoben, bis vgo 0,1 erreichte, als tgo 0,0 erreichte, wurde alles viel stabiler und umkreiste wurde genauer.