diff --git a/lib/launch_rocket.ks b/lib/launch_rocket.ks index f353504..29e878f 100644 --- a/lib/launch_rocket.ks +++ b/lib/launch_rocket.ks @@ -92,8 +92,8 @@ function Launch { lock THROTTLE to 0.0. set SHIP:CONTROL:PILOTMAINTHROTTLE to 0. wait 0.001. // make sure these control updates get applied - add CreateCircularizationNode(). - ExecNode(). + + insertionBurn(apoapsisTarget). print "Ascent Complete.". set SHIP:CONTROL:PILOTMAINTHROTTLE to 0. @@ -101,3 +101,45 @@ function Launch { unlock STEERING. SAS on. } + +// Calculate and perform the insertion burn for orbit. +// The reason to prefer this over CreateCircularizationNode() and ExecNode() is that the amount of RCS needed +// to vector into position during launch adjusts our orbit significantly. This gives us a "wait until" that +// serves the specific needs of launch. +// It also makes automated launches possible before maneuver nodes are unlocked. +// +// prerequisites: +// * Vessel is still behind the Apoapsis +// * Apoapsis is at the target height +function insertionBurn { + parameter apoapsisTarget. + + // vector is prograde but only on the horizonal plane + print "Adjusting heading.". + local horizon is Vxcl(SHIP:UP:FOREVECTOR, SHIP:PROGRADE:FOREVECTOR). + lock STEERING to LookDirUp(horizon, SHIP:FACING:TOPVECTOR). + + // calculate the deltaV to get us to the target velocity, for calculating burn start time. + local t is TIME + SHIP:ORBIT:ETA:APOAPSIS. + local Vc is sqrt(SHIP:BODY:MU/(PositionAt(SHIP, t) - SHIP:BODY:POSITION):MAG). + local dV is Vc - VelocityAt(SHIP, t):ORBIT:MAG. + + // calculate the total burn time (Tb) and the burn start time (Ts) + local Tb is BurnTime(dV). + local Ts is TIME + SHIP:OBT:ETA:APOAPSIS - BurnTime(dV / 2). + + // warp to the burn point + print "Waiting for burn window.". + wait until (VAng(SHIP:FACING:FOREVECTOR, STEERINGMANAGER:TARGET:FOREVECTOR) <= 1) OR (TIME >= Ts). + if TIME > Ts - 2 { + KUNIVERSE:TIMEWARP:WarpTo(Ts - 2). + } + wait until SHIP:UNPACKED. + wait until TIME >= Ts. + + // burn until periapsis is clear + print "Circularizing orbit.". + lock THROTTLE to 1.0. + wait until SHIP:OBT:PERIAPSIS > apoapsisTarget. + lock THROTTLE to 0.0. +}