Die dritte Seite des Trios: Startplätze liefert das Wo, Trägerraketen das Womit — hier werden beide gegen die Zielbahn gerechnet. Die Frage lautet: welche Kombination aus Rampe, Träger und Zielorbit geht, und was kostet sie?
Wie auf den beiden anderen Seiten gilt: alle Zahlen sind gerechnet, das Programm in Abschnitt 5 erzeugt sie aus std.astro.launch und std.astro.orbit.
→ Bahntypen · Startplätze · Trägerraketen · std.astro.launch · std.astro.orbit
„Kann Rakete X von Rampe Y in Orbit Z„ zerfällt in zwei getrennte Prüfungen, und nur die erste hat eine harte Antwort:
AInclinationReachable beantwortet das mit ja oder nein, unabhängig von jeder Rakete. Wer die Bahn trotzdem will, muss die Ebene nachträglich drehen, und das ist teuer.Die vier Zielbahnen dieser Seite:
| Kürzel | Bahn | Wofür | Quelle |
|---|---|---|---|
| LEO 28.5 | 400 km Kreisbahn, 28.5° Neigung | klassische niedrige Bahn, Referenzfall der Herstellerangaben | – |
| ISS 51.6 | 400 km Kreisbahn, 51.6° | Versorgung der Raumstation | – |
| Tiangong | 387 km Kreisbahn, 41.47° | chinesische Raumstation, Shenzhou und Tianzhou | Umlaufzeit 92.3 min |
| Hubble | 510 km Kreisbahn, 28.4687° | Wartungs- und Anflugbahn des Weltraumteleskops | Q2513 |
| SSO 97.5 | 700 km Kreisbahn, 97.5° rückläufig | Erdbeobachtung, sonnensynchron | Rundwert, siehe unten |
| GEO | 35 786 km Kreisbahn, 0° | Kommunikation, geostationär | – |
Die beiden neuen Ziele sind über verschiedene Größen belegt, und die Bibliothek rechnet die jeweils andere daraus:
ASemiMajorFromPeriod macht daraus eine Bahnhöhe von 387.3 km.APeriod macht daraus 94.83 min — Wikidata gibt 94.87 min an. Die Abweichung von 0.04 Minuten ist die Gegenprobe auf beide Rechnungen.Die 97.5° für die SSO-Spalte sind gerundet.ASunSyncInclinationliefert für 700 km Bahnhöhe 98.188° (Bahntypen). Für den Energiebedarf, den diese Seite rechnet, macht die Differenz wenige m/s aus; für eine Missionsauslegung wäre sie erheblich.
Ab Boden, mit 1500 m/s Aufstiegsverlusten. GEO über eine Hohmann-Bahn aus dem 400-km-Parkorbit mit anschließendem Ebenenwechsel im Apogäum:
| Rampe | Breite | LEO 28.5 | ISS 51.6 | Tiangong | Hubble | SSO 97.5 | GEO |
|---|---|---|---|---|---|---|---|
| Kourou | 5.2° | 8991 | 9111 | 9044 | 9053 | 9625 | 13070 |
| Sriharikota | 13.72° | 8991 | 9111 | 9044 | 9053 | 9625 | 13536 |
| Wenchang | 19.61° | 8991 | 9111 | 9044 | 9053 | 9625 | 13863 |
| Starbase | 26.00° | 8991 | 9111 | 9044 | 9053 | 9625 | 14219 |
| Xichang | 28.25° | 8991 | 9111 | 9044 | 9053 | 9625 | 14345 |
| SLC-40 | 28.56° | (9000) | 9111 | 9044 | (9065) | 9625 | 14362 |
| LC-39A | 28.61° | (9006) | 9111 | 9044 | (9072) | 9625 | 14365 |
| Tanegashima | 30.40° | (9253) | 9111 | 9044 | (9317) | 9625 | 14465 |
| Uchinoura | 31.25° | (9371) | 9111 | 9044 | (9433) | 9625 | 14513 |
| SLC-4E | 34.63° | (9838) | 9111 | 9044 | (9897) | 9625 | 14702 |
| Taiyuan | 38.85° | (10421) | 9111 | 9044 | (10476) | 9625 | 14937 |
| Jiuquan | 40.97° | (10714) | 9111 | 9044 | (10766) | 9625 | 15055 |
| Baikonur | 45.60° | (11355) | 9111 | (9621) | (11402) | 9625 | 15311 |
| Wostotschny | 51.88° | (12221) | (9151) | (10499) | (12262) | 9625 | 15657 |
| Plessezk | 62.92° | (13726) | (10700) | (12037) | (13755) | 9625 | 16251 |
| Andøya | 69.29° | (14581) | (11594) | (12919) | (14603) | 9625 | 16585 |
Werte in Klammern: die Zielneigung liegt unter der Startbreite — geometrisch nicht direkt erreichbar. Die Zahl enthält den nachträglichen Ebenenwechsel als Näherung und ist als Preisschild für einen Umweg zu lesen, nicht als Flugplan.
Werte in Klammern: die Zielneigung liegt unter der Startbreite — geometrisch nicht direkt erreichbar. Der Aufstieg geht dann auf die kleinste erreichbare Neigung, und AAzimuthPenalty schlägt den nachträglichen Ebenenwechsel auf. Diese Zahlen sind ein Preisschild für einen Umweg, kein Flugplan.
Das Auffällige an dieser Tabelle sind die Spalten ohne Streuung:
ω·R·cos(i) und hängt damit nur an der Zielneigung, nicht an der Startbreite. Wer geradewegs in die Zielebene steigt, nimmt denselben Anteil der Erddrehung mit, egal wo er startet.ARotationGainForInclination liefert dort −60.7 m/s. Die Erddrehung arbeitet gegen die Rakete.Jeder Träger startet von seiner tatsächlichen Rampe. Die veröffentlichte LEO-Nutzlast gilt als Referenzpunkt bei der Bahn mit der kleinsten von dort erreichbaren Neigung; für jede andere Bahn wird der Mehrbedarf über die Raketengleichung auf die Nutzlast umgelegt — mit der Austrittsgeschwindigkeit der jeweiligen Oberstufe.
| Träger @ Rampe | Oberstufe (Isp) | LEO 28.5 | ISS 51.6 | Tiangong | Hubble | SSO 97.5 | GEO |
|---|---|---|---|---|---|---|---|
| Spectrum @ Andøya | ~320 s | 0.2 t | 0.5 t | 0.3 t | 0.2 t | 0.9 t | 0.10 t |
| Falcon 9 @ SLC-40 | Merlin Vacuum, 348 s | 22.7 t | 22.0 t | 22.5 t | 22.3 t | 18.9 t | 4.73 t |
| Ariane 64 @ Kourou | Vinci, 457 s | 21.3 t | 20.8 t | 21.1 t | 21.0 t | 18.5 t | 8.59 t |
| Angara A5 @ Wostotschny | RD-0124A, 359 s | 10.1 t | 24.2 t | 16.5 t | 10.0 t | 21.2 t | 3.82 t |
| Long March 5B @ Wenchang | YF-75D, 442 s | 24.8 t | 24.2 t | 24.5 t | 24.5 t | 21.5 t | 8.07 t |
Was die Matrix zeigt:
Diese Nutzlastzahlen sind ein Modell, keine Herstellerangaben. Sie entstehen aus einer einzigen veröffentlichten Referenznutzlast, die über die Raketengleichung auf andere Bahnen verschoben wird. Nicht enthalten: Verkleidungsgrenzen, Struktur- und Bergungsreserven, reale Stufungspunkte, Startfenster, Sicherheitskorridore, Drosselung. Die Spalten sind untereinander vergleichbar; gegen ein Datenblatt sind sie es nicht.
Probe: Für Ariane 64 liefert das Modell 8.59 t GEO gegenüber 11.5 t GTO im Datenblatt — GEO liegt hinter GTO, die Größenordnung passt also. Für Falcon 9 stehen 4.73 t GEO gegen 8.3 t GTO. Wo das Modell danebenliegt, liegt es zu niedrig.
| Ziel | geht von | Kosten ab Boden | was den Ausschlag gibt |
|---|---|---|---|
| LEO 28.5 | jeder Rampe bis 28.5° Breite | 8991 m/s | darüber nur mit Ebenenwechsel |
| ISS 51.6 | jeder Rampe bis 51.6° | 9111 m/s | Plessezk und Andøya fallen heraus |
| Tiangong 41.47 | jeder Rampe bis 41.47° | 9044 m/s | Jiuquan liegt 0.5 Grad darunter — deshalb starten die Shenzhou-Flüge dort |
| Hubble 28.47 | jeder Rampe bis 28.47° | 9053 m/s | Cape liegt knapp darüber; siehe unten |
| SSO 97.5 | jeder Rampe | 9625 m/s | rückläufig, deshalb überall gleich und überall teurer |
| GEO | am besten Kourou | 13 070…16 585 m/s | die einzige Zielbahn, bei der die Startbreite den Preis bestimmt |
Die Rampenwahl ist eine Ja/Nein-Frage, keine Preisfrage — mit einer Ausnahme. Für jede Bahn, deren Neigung über der Startbreite liegt, kostet der Aufstieg überall dasselbe. Erst beim GEO, wo am Ende auf 0 Grad gedreht wird, zahlt sich eine äquatornahe Rampe in Geschwindigkeit aus.
Und die Kombinationen, die nicht gehen: 28.5-Grad-Bahnen von Wostotschny, Plessezk oder Andøya; die ISS-Bahn von Plessezk oder Andøya; die Tiangong-Bahn von Baikonur aufwärts; die Hubble-Bahn von allem oberhalb von Xichang. Nicht „teuer“, sondern von der Geometrie ausgeschlossen — der Startpunkt liegt außerhalb der Bahnebene.
Teil A — der dv-Bedarf aus Abschnitt 2:
unit main;
import std.astro.launch;
import std.astro.orbit;
import std.math;
import std.io;
import std.string;
fn Grad(g: f64): f64 { return g * Pi() / 180.0; }
fn f(v: f64, d: int64): pchar { return FloatToStr(v, d); }
// dv ab Boden bis Kreisbahn. retro = true dreht den Drehgewinn um.
// Aufstieg auf die Zielhoehe ueber eine 200-km-Parkbahn (ADvAscentToOrbit),
// Drehgewinn aus der ZIELNEIGUNG (ARotationGainForInclination).
fn dvBoden(breiteGrad: f64, hoehe: f64, zielGrad: f64): f64 {
var breite: f64 := Grad(breiteGrad);
var ziel: f64 := Grad(zielGrad);
var rPark: f64 := ARadiusEarth() + 200000.0;
var r: f64 := ARadiusEarth() + hoehe;
// Liegt die Zielneigung unter der Startbreite, ist sie direkt nicht
// erreichbar: dann rechnet der Aufstieg auf die kleinste erreichbare
// Neigung, und AAzimuthPenalty schlaegt den Ebenenwechsel auf.
var iAuf: f64 := ziel;
if !AInclinationReachable(breite, ziel) { iAuf := breite; }
var gewinn: f64 := ARotationGainForInclination(AEarthRotation(), ARadiusEarth(), breite, iAuf);
var dv: f64 := ADvAscentToOrbit(AMuEarth(), rPark, r, 1500.0, gewinn);
var strafe: f64 := AAzimuthPenalty(ACircularSpeed(AMuEarth(), r), breite, ziel);
return dv + strafe;
}
fn spalte(breite: f64, zielGrad: f64, hoehe: f64): void {
Print(" | ");
if AInclinationReachable(Grad(breite), Grad(zielGrad)) {
Print(f(dvBoden(breite, hoehe, zielGrad), 0));
} else {
Print(StrConcat("(", StrConcat(f(dvBoden(breite, hoehe, zielGrad), 0), ")")));
}
}
// Hoehe aus der Umlaufzeit: Tiangong ist ueber die Periode belegt, nicht ueber die Hoehe
fn hoeheAusPeriode(minuten: f64): f64 {
return ASemiMajorFromPeriod(AMuEarth(), minuten * 60.0) - ARadiusEarth();
}
fn zeile(name: pchar, breite: f64): void {
var rLeo: f64 := ARadiusEarth() + 400000.0;
var rGeo: f64 := 42164000.0;
var leoMin: f64 := dvBoden(breite, 400000.0, breite);
var hoh: f64 := AHohmannDv(AMuEarth(), rLeo, rGeo);
var plane: f64 := APlaneChangeDv(ACircularSpeed(AMuEarth(), rGeo), Grad(breite));
Print(name);
spalte(breite, 28.5, 400000.0); // LEO 400 km, 28.5 Grad
spalte(breite, 51.6, 400000.0); // ISS
spalte(breite, 41.47, hoeheAusPeriode(92.3)); // Tiangong
spalte(breite, 28.4687, 510200.0); // Hubble
spalte(breite, 97.5, 700000.0); // SSO 700 km, rueckl.
Print(" | "); PrintLn(f(leoMin + hoh + plane, 0));
}
fn main(): int64 {
PrintLn("Rampe | LEO 28.5 | ISS 51.6 | Tiangong | Hubble | SSO 97.5 | GEO (m/s ab Boden)");
zeile("Kourou ", 5.2);
zeile("Sriharikota ", 13.7172);
zeile("Wenchang ", 19.6145);
zeile("Starbase ", 25.997);
zeile("Xichang ", 28.2456);
zeile("SLC-40 ", 28.5619);
zeile("LC-39A ", 28.6083);
zeile("Tanegashima ", 30.4);
zeile("Uchinoura ", 31.2519);
zeile("SLC-4E ", 34.633);
zeile("Taiyuan ", 38.8491);
zeile("Jiuquan ", 40.9675);
zeile("Baikonur ", 45.6);
zeile("Wostotschny ", 51.8846);
zeile("Plessezk ", 62.9167);
zeile("Andoya ", 69.294167);
PrintLn("");
PrintLn("() = Inklination kleiner als Startbreite: nicht direkt erreichbar,");
PrintLn(" Wert enthaelt den Ebenenwechsel als Naeherung.");
PrintLn(StrConcat("Tiangong-Hoehe aus 92.3 min Periode: ", StrConcat(f(hoeheAusPeriode(92.3) / 1000.0, 1), " km")));
PrintLn(StrConcat("Hubble-Periode aus 510.2 km Hoehe: ", StrConcat(f(APeriod(AMuEarth(), ARadiusEarth() + 510200.0) / 60.0, 2), " min")));
PrintLn(StrConcat("Hohmann LEO(400 km) -> GEO: ", f(AHohmannDv(AMuEarth(), ARadiusEarth()+400000.0, 42164000.0), 1)));
PrintLn(StrConcat("Ebenenwechsel 28.5 Grad im GEO: ", f(APlaneChangeDv(ACircularSpeed(AMuEarth(), 42164000.0), Grad(28.5)), 1)));
return 0;
}
Ausgabe:
Rampe | LEO 28.5 | ISS 51.6 | Tiangong | Hubble | SSO 97.5 | GEO (m/s ab Boden)
Kourou | 8991 | 9111 | 9044 | 9053 | 9625 | 13070
Sriharikota | 8991 | 9111 | 9044 | 9053 | 9625 | 13536
Wenchang | 8991 | 9111 | 9044 | 9053 | 9625 | 13863
Starbase | 8991 | 9111 | 9044 | 9053 | 9625 | 14219
Xichang | 8991 | 9111 | 9044 | 9053 | 9625 | 14345
SLC-40 | (9000) | 9111 | 9044 | (9065) | 9625 | 14362
LC-39A | (9006) | 9111 | 9044 | (9072) | 9625 | 14365
Tanegashima | (9253) | 9111 | 9044 | (9317) | 9625 | 14465
Uchinoura | (9371) | 9111 | 9044 | (9433) | 9625 | 14513
SLC-4E | (9838) | 9111 | 9044 | (9897) | 9625 | 14702
Taiyuan | (10421) | 9111 | 9044 | (10476) | 9625 | 14937
Jiuquan | (10714) | 9111 | 9044 | (10766) | 9625 | 15055
Baikonur | (11355) | 9111 | (9621) | (11402) | 9625 | 15311
Wostotschny | (12221) | (9151) | (10499) | (12262) | 9625 | 15657
Plessezk | (13726) | (10700) | (12037) | (13755) | 9625 | 16251
Andoya | (14581) | (11594) | (12919) | (14603) | 9625 | 16585
() = Inklination kleiner als Startbreite: nicht direkt erreichbar,
Wert enthaelt den Ebenenwechsel als Naeherung.
Tiangong-Hoehe aus 92.3 min Periode: 387.3 km
Hubble-Periode aus 510.2 km Hoehe: 94.83 min
Hohmann LEO(400 km) -> GEO: 3854.0
Ebenenwechsel 28.5 Grad im GEO: 1513.7
Teil B — die Nutzlastmatrix aus Abschnitt 3:
unit main;
import std.astro.launch;
import std.astro.orbit;
import std.math;
import std.io;
import std.string;
fn Grad(g: f64): f64 { return g * Pi() / 180.0; }
fn f(v: f64, d: int64): pchar { return FloatToStr(v, d); }
// Aufstieg auf die Zielhoehe ueber eine 200-km-Parkbahn (ADvAscentToOrbit),
// Drehgewinn aus der ZIELNEIGUNG (ARotationGainForInclination).
fn dvBoden(breiteGrad: f64, hoehe: f64, zielGrad: f64): f64 {
var breite: f64 := Grad(breiteGrad);
var ziel: f64 := Grad(zielGrad);
var rPark: f64 := ARadiusEarth() + 200000.0;
var r: f64 := ARadiusEarth() + hoehe;
// Liegt die Zielneigung unter der Startbreite, ist sie direkt nicht
// erreichbar: dann rechnet der Aufstieg auf die kleinste erreichbare
// Neigung, und AAzimuthPenalty schlaegt den Ebenenwechsel auf.
var iAuf: f64 := ziel;
if !AInclinationReachable(breite, ziel) { iAuf := breite; }
var gewinn: f64 := ARotationGainForInclination(AEarthRotation(), ARadiusEarth(), breite, iAuf);
return ADvAscentToOrbit(AMuEarth(), rPark, r, 1500.0, gewinn)
+ AAzimuthPenalty(ACircularSpeed(AMuEarth(), r), breite, ziel);
}
fn dvGeo(breiteGrad: f64): f64 {
return dvBoden(breiteGrad, 400000.0, breiteGrad)
+ AHohmannDv(AMuEarth(), ARadiusEarth() + 400000.0, 42164000.0)
+ APlaneChangeDv(ACircularSpeed(AMuEarth(), 42164000.0), Grad(breiteGrad));
}
// Nutzlast bei Mehrbedarf: Tsiolkovsky rueckwaerts auf die Nutzlast angewandt
fn nutzlast(mRefT: f64, dvRef: f64, dvZiel: f64, ispOben: f64): f64 {
return mRefT * ExpF64(0.0 - (dvZiel - dvRef) / AExhaustSpeed(ispOben));
}
// Hoehe aus der Umlaufzeit
fn hoeheAusPeriode(minuten: f64): f64 {
return ASemiMajorFromPeriod(AMuEarth(), minuten * 60.0) - ARadiusEarth();
}
fn rakete(name: pchar, breite: f64, mRefT: f64, ispOben: f64): void {
var dvRef: f64 := dvBoden(breite, 400000.0, breite);
Print(name);
Print(" | "); Print(f(nutzlast(mRefT, dvRef, dvBoden(breite, 400000.0, 28.5), ispOben), 1));
Print(" | "); Print(f(nutzlast(mRefT, dvRef, dvBoden(breite, 400000.0, 51.6), ispOben), 1));
Print(" | "); Print(f(nutzlast(mRefT, dvRef, dvBoden(breite, hoeheAusPeriode(92.3), 41.47), ispOben), 1));
Print(" | "); Print(f(nutzlast(mRefT, dvRef, dvBoden(breite, 510200.0, 28.4687), ispOben), 1));
Print(" | "); Print(f(nutzlast(mRefT, dvRef, dvBoden(breite, 700000.0, 97.5), ispOben), 1));
Print(" | "); PrintLn(f(nutzlast(mRefT, dvRef, dvGeo(breite), ispOben), 2));
}
fn main(): int64 {
PrintLn("Rakete/Rampe | LEO 28.5 | ISS 51.6 | Tiangong | Hubble | SSO 97.5 | GEO (t)");
rakete("Spectrum @ Andoya ", 69.294167, 1.0, 320.0);
rakete("Falcon 9 @ SLC-40 ", 28.5619, 22.8, 348.0);
rakete("Ariane 64 @ Kourou ", 5.2, 21.6, 457.0);
rakete("Angara A5 @ Wostotschny ", 51.8846, 24.5, 359.0);
rakete("Long March 5B @ Wenchang", 19.6145, 25.0, 442.0);
PrintLn("");
PrintLn(StrConcat("Referenz-dv Falcon 9 (i = Rampenbreite): ", f(dvBoden(28.5619, 400000.0, 28.5619), 0)));
PrintLn(StrConcat("Austrittsgeschwindigkeit Merlin Vacuum: ", f(AExhaustSpeed(348.0), 0)));
return 0;
}
Ausgabe:
Rakete/Rampe | LEO 28.5 | ISS 51.6 | Tiangong | Hubble | SSO 97.5 | GEO (t)
Spectrum @ Andoya | 0.2 | 0.5 | 0.3 | 0.2 | 0.9 | 0.10
Falcon 9 @ SLC-40 | 22.7 | 22.0 | 22.5 | 22.3 | 18.9 | 4.73
Ariane 64 @ Kourou | 21.3 | 20.8 | 21.1 | 21.0 | 18.5 | 8.59
Angara A5 @ Wostotschny | 10.1 | 24.2 | 16.5 | 10.0 | 21.2 | 3.82
Long March 5B @ Wenchang | 24.8 | 24.2 | 24.5 | 24.5 | 21.5 | 8.07
Referenz-dv Falcon 9 (i = Rampenbreite): 8991
Austrittsgeschwindigkeit Merlin Vacuum: 3413
Diese Seite hat drei Lücken in std.astro.launch aufgedeckt. Alle drei sind inzwischen geschlossen, und das Programm oben rechnet mit den neuen Funktionen statt mit Handkorrekturen:
ARotationGainForInclination(omega, R, breite, inklination), das den Azimut selbst ableitet und bei 97.5° die richtigen −60.7 m/s liefert. Die Funktion meldet außerdem einen Fehlerwert, wenn die Neigung unter der Startbreite liegt — deshalb prüft das Programm vorher mit AInclinationReachable.ADvAscent trug die Zielhöhe nicht (#1989). Der Wert folgte der Kreisbahngeschwindigkeit, die mit der Höhe sinkt — eine 700-km-Bahn erschien billiger als eine 400-km-Bahn. Aufgefallen ist das erst mit der Hubble-Spalte, weil vorher alle Ziele auf derselben Höhe lagen. Neu ist ADvAscentToOrbit(mu, rPark, rTarget, verluste, drehgewinn): Einschuss in eine Parkbahn, dann Hohmann-Transfer hinauf. 400 km kosten damit 8991 m/s, 510 km 9053 und 700 km 9156 — höher ist teurer.
Was weiterhin Anwenderlogik bleibt: die Nutzlastumrechnung. nutzlast() im Programm ist vier Zeilen Raketengleichung, die jede solche Auswertung neu schreiben muss.