LunarLander programmieren?

1 Antwort

Du musst die Landefähre an einem bestimmten Punkt landen?

Im Grunde möchtest du also eine Bewegungsbahn berechnen und die entsprechende Ansteuerung der Düsen vornehmen?

Nun, im Grunde zieht dich die Schwerkraft ja erst einmal von alleine zum Zentrum des Himmelskörpers.
Ohne weitere Bewegung würdest du entsprechend am nähesten Punkt auf der Oberfläche landen.
Durch Schubsteuerung kannst du diesen Punkt verschieben.

Je nach Luftwiderstand musst du womöglich über längere Zeit aktiv beschleunigen. Es macht unter Umständen Sinn die Bewegungsbahn entsprechend kurz zu halten.
Dafür kann es unter Umständen günstiger sein, eine Bewegungsbahn näher am Himmelskörper zu planen anstelle einer Bahn weiter vom Planeten entfernt.

Zur Implementierung:

Du hast den Zielpunkt auf dem Himmelskörper gegeben als Polare Koordinate (phi_z, r_z). Ebenso hast du deine Raumfähre p_s = (phi_s, r_s).

Die Fähre wird beschleunigt durch verschiedene Kräfte. Einerseits durch die Schwerekraft, andererseits durch die Schubkräfte und durch die Bremskraft der Atmosphäre.

Die Beschleunigung ändert die Geschwindigkeit der Fähre und die Geschwindigkeit die Position.

Alles das ist miteinander verwoben und ergibt ein Differentialgleichungssystem, welches es zu lösen gilt.

F_g_s = G * (m_s + m_planet)/(dist(p))²;
F_schub_s = gesucht.
F_brems_s = 1/2 * A_s * c_w_s * p_atmos * ((delta p)/(delta t))²;
F_gesamt_s = F_g_s * F_schub_s + F_brems_s;
F_gesamt_s = m_s * (delta² p)/(delta² t);

Da wurde aber noch nicht die Pfadplanung bezüglich Hindernissen beachtet und auch nicht das eigentliche Ziel des Pfades.
Es ist so aber schon kompliziert genug. Zur Ableitung nach F_schub_s:

F_schub_s = m_s * (delta² p)/(delta² t) - G * (m_s + m_planet)/(dist(p))² - 1/2 * A_s * c_w_s * p_atmos * ((delta p)/(delta t))²;

Das wäre dann die Schubsteuerungsgleichung (noch ohne mögliche Restriktionen was den maximalen Schub angeht oder dergleichen, aber mit der restriktion des Luftwiderstands).

Jetzt planen wir eine Bewegungsbahn, die uns zum Zielpunkt bringt. Wenn man diese hat nutzt man sie dann um mittels der Schubsteuerungsgleichung die Schubstärke zu berechnen.

Was wir erst einmal wollen ist die direkteste Bahn zum Ziel. Diese soll minimal sein unter den Nebenbedingungen der Hindernisse im Weg.
Wir fangen bei einer Gerade an und "drücken" diese dann soweit nach außen, bis die Bahn kein Hindernis mehr kreuzt.

Was wir so erhalten ist eine Bahn möglichst nahe am Planeten. Wenn wir nach anderen Kriterien optimieren wollen müssen wir anders vrogehen oder den Optimierungsprozess anders gestalten.

Wie man die Gerade "drückt" ist auch eine Sache, die man sich überlegen muss. Ich würde vorschlagen man halbiert die Gerade und bewegt dann den Mittelpunkt nach außen, sodass eine Kurve entsteht.
Hat die Kurve weiterhin Schnittpunkte, so halbiert man die beiden Teilsegmente und macht für diese dasselbe.
Da gibt es diverse Möglichkeitend as umzusetzen.

Mit der Kurve kann man dann die Differentialgleichung von oben lösen. Entweder nimmt man die diskrete Kurve direkt oder man nutzt die Punkte als Kontrollpunkte für eine parametrische Kurve die eher den Flugeigenschaften des Schiffs entspricht.
Mit der direkten Kurve fliegt das Schiff dann auch eckig, was eher mehr Steuereung als nötig benötigt. Mit einer parametrischen Kurve kann man mehr auf die Umgebungseigenschaften eingehen.

Zur Lösung der Differentialgleichung muss du eine Bewegungskurve finden, die mit der Differentialgleichung konform ist, die möglichst nahe an der Bahngleichung liegt, die gewünscht ist.

Es empfiehlt sich womöglich, zusätzliche Restiktionen zur Bahngleichung hinzuzufügen, beispielsweise die Geschwindigkeit am Endpunkt.

EDIT1:

Für weitere Infos hilft Google womöglich aus. Auf die schnelle gefunden:

https://web.mit.edu/16.unified/www/FALL/systems/Lab_Notes/traj.pdf

https://arxiv.org/html/2305.13846v3

EDIT2:

Du kannst das ganze natürlich auch einfacher heuristisch implementieren, wenn du möchtest. Beispielsweise vorsichtig seitwwärts bis über dieLandestelle fliegen und ab da dann fallen lassen oder vorsichtig nach unten beschleunigen und vorher abbremsen