Initial import
This commit is contained in:
170
boot/moon-orbiter.ks
Normal file
170
boot/moon-orbiter.ks
Normal file
@@ -0,0 +1,170 @@
|
||||
@lazyglobal off.
|
||||
wait until ship:unpacked.
|
||||
rcs off.
|
||||
lock throttle to 0.
|
||||
|
||||
runoncepath("0:/lib/common.ks").
|
||||
runoncepath("0:/lib/moonmath.ks").
|
||||
runoncepath("0:/lib/stage/atlas.ks").
|
||||
runoncepath("0:/lib/stage/centaur.ks").
|
||||
runoncepath("0:/lib/stage/probe.ks").
|
||||
|
||||
local state is lex().
|
||||
|
||||
local function ship_volume {
|
||||
return ship:rootpart:getmodule("kosprocessor"):volume.
|
||||
}
|
||||
|
||||
local function phase {
|
||||
switch to ship_volume().
|
||||
if not ship_volume():exists("state.json") {
|
||||
set_phase("prelaunch").
|
||||
}
|
||||
set state to readjson("state.json").
|
||||
return state["phase"].
|
||||
}
|
||||
|
||||
local function set_phase {
|
||||
parameter new_phase.
|
||||
switch to ship_volume().
|
||||
set state["phase"] to new_phase.
|
||||
writejson(state, "state.json").
|
||||
kuniverse:quicksaveto("moon-impactor-"+new_phase).
|
||||
}
|
||||
|
||||
if phase() = "prelaunch" {
|
||||
local target_inclination is max(moon:obt:inclination,ship:latitude).
|
||||
local target_alt is 500_000.
|
||||
set state["azimuth"] to launch_azimuth(target_inclination, target_alt).
|
||||
|
||||
local launch_params is moonmath:calculate_launch(target_inclination, state["azimuth"], target_alt).
|
||||
local launch_time is launch_params:launch_time.
|
||||
set state["moon_altitude"] to launch_params:moon_altitude.
|
||||
set state["departure_ra"] to launch_params:burn_longitude.
|
||||
print "Departing for moon at " + state["departure_ra"] + " right ascension".
|
||||
|
||||
wait 2.
|
||||
|
||||
until launch_time - time:seconds < 10 {
|
||||
print "Not ready to launch yet, warping...".
|
||||
warpto(launch_time-9).
|
||||
wait 0.
|
||||
wait until warp = 0.
|
||||
wait until kuniverse:timewarp:issettled.
|
||||
print "Maybe done warping?".
|
||||
}
|
||||
wait until time:seconds > launch_time.
|
||||
|
||||
atlas:launch(state["azimuth"], target_alt, 4).
|
||||
stage.
|
||||
set_phase("circularize").
|
||||
}
|
||||
|
||||
if phase() = "circularize" {
|
||||
centaur:orbit(state["azimuth"]).
|
||||
centaur:power_down().
|
||||
|
||||
wait 1.
|
||||
set_phase("parkingorbit").
|
||||
}
|
||||
|
||||
local function ship_ra {
|
||||
return mod(ship:longitude + ship:body:rotationangle + 360, 360).
|
||||
}
|
||||
|
||||
if phase() = "parkingorbit" {
|
||||
local transfer_dv is hohmann_transfer_dv(earth, ship:altitude, state["moon_altitude"]).
|
||||
local burn_time is centaur:burn_time(transfer_dv / 2).
|
||||
local burn_angle is (burn_time / ship:obt:period) * 360.
|
||||
local burn_ra is mod(state["departure_ra"] - burn_angle + 360, 360).
|
||||
|
||||
|
||||
// Just in case our departure point is RIGHT HERE, we want to go around at least once.
|
||||
set warpmode to "physics".
|
||||
set warp to 3.
|
||||
wait until abs(ship_ra() - burn_ra) > 16.
|
||||
set warp to 0.
|
||||
wait until kuniverse:timewarp:issettled.
|
||||
wait 1.
|
||||
|
||||
// Rails warp until we're nearish to the burn point
|
||||
print "Warping to dLongitude < 15".
|
||||
set warpmode to "rails".
|
||||
set warp to 2.
|
||||
wait until abs(ship_ra() - burn_ra) < 15.
|
||||
set warp to 0.
|
||||
wait until kuniverse:timewarp:issettled.
|
||||
wait 1.
|
||||
|
||||
// Physics warp until we're nearish-er
|
||||
print "Warping to dLongitude < 4".
|
||||
set warpmode to "physics".
|
||||
set warp to 3.
|
||||
wait until abs(ship_ra() - burn_ra) < 4.
|
||||
set warp to 0.
|
||||
wait until kuniverse:timewarp:issettled.
|
||||
wait 1.
|
||||
|
||||
centaur:power_up().
|
||||
rcs on.
|
||||
lock steering to ship:prograde.
|
||||
wait until ship_ra() >= burn_ra.
|
||||
print "Moon altitude is: " + state["moon_altitude"].
|
||||
print "Transfer DV is: " + transfer_dv.
|
||||
centaur:transfer_burn(state["moon_altitude"]).
|
||||
wait 1.
|
||||
|
||||
set_phase("pretransfer").
|
||||
}
|
||||
|
||||
if phase() = "pretransfer" {
|
||||
rcs on.
|
||||
panels on.
|
||||
stage.
|
||||
wait 1.
|
||||
probe:power_up().
|
||||
lock steering to sun:direction.
|
||||
wait 1.
|
||||
wait until steering_locked().
|
||||
wait 1.
|
||||
rcs off.
|
||||
probe:power_down().
|
||||
wait 1.
|
||||
|
||||
set_phase("transfer").
|
||||
}
|
||||
|
||||
if phase() = "transfer" {
|
||||
set warpmode to "rails".
|
||||
warpto(eta:transition + time:seconds).
|
||||
wait until ship:obt:body = moon.
|
||||
wait until kuniverse:timewarp:issettled.
|
||||
|
||||
set_phase("lunar_arrival").
|
||||
}
|
||||
|
||||
if phase() = "lunar_arrival" {
|
||||
stage.
|
||||
probe:capture_burn().
|
||||
|
||||
set_phase("lunar_deploy").
|
||||
}
|
||||
|
||||
if phase() = "lunar_deploy" {
|
||||
probe:power_up().
|
||||
lock steering to sun:direction.
|
||||
wait 1.
|
||||
wait until steering_locked().
|
||||
wait 1.
|
||||
rcs off.
|
||||
probe:power_down().
|
||||
|
||||
set_phase("done").
|
||||
}
|
||||
|
||||
|
||||
if phase() <> "done" {
|
||||
print "Phase logic failed, expected to be in phase '" + phase() + "'".
|
||||
}
|
||||
|
||||
print "Done".
|
||||
Reference in New Issue
Block a user