@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. }