@LAZYGLOBAL OFF. run once "lib/rocket". run once "lib/warp". function estimated_burn_duration { // // Calculate estimated burn duration for a maneuver node. // Based on: // https://en.wikipedia.org/wiki/Tsiolkovsky_rocket_equation // https://space.stackexchange.com/questions/27375/how-do-i-calculate-a-rockets-burn-time-from-required-velocity // parameter node is NEXTNODE. local exhaust_velocity is isp_sum() * (CONSTANT:G * KERBIN:mass). return ((SHIP:mass * exhaust_velocity) / SHIP:maxthrust) * (1 - CONSTANT:E^(-node:deltav:mag/exhaust_velocity)). } function execute_node { // // Execute given maneuver node (the next one by default). // parameter node is NEXTNODE. local burn_duration is estimated_burn_duration(node). print "=== EXECUTE MANEUVER NODE ===". print "Estimated burn duration: " + ROUND(burn_duration, 1) + "s". print "Aligning ship with burn vector..". SAS off. lock STEERING to node:deltav. wait until vang(SHIP:facing:vector, node:deltav) < 0.5. print "Initializing warp". warp_for(MAX(0, node:eta - (burn_duration/2) - 5)). // warp until 5s before node print "Approaching". wait until node:eta <= CEILING(burn_duration/2). // CEILING instead of ROUND, since we'd rather start the burn too soon to have time for perfecting the burn print "Burn!". lock THROTTLE to 1.0. // Decrease throttle linearly when the burn duration is less than 1 second wait until estimated_burn_duration(node) <= 1. lock THROTTLE to MAX(0.01, estimated_burn_duration(node)). // ensure we always finish by burning with at least 1% power // The burn vector will start to drift once we have very little left to burn. Therefore, take a "snapshot" of the burn vector as it is right now, and lock steering to it, instead of the dynamic vector local dv0 is node:deltav. lock STEERING to dv0. // Stop the burn once the "snapshot" vector dv0 and current burn vector start facing opposite directions wait until vdot(dv0, node:deltav) < 0. set THROTTLE to 0.0. print "=== MANEUVER NODE EXECUTED ===". print round(node:deltav:mag, 3) + "m/s delta-v remaining". unlock_control(). wait 1. remove node. }