64 lines
2.3 KiB
Plaintext
Executable file
64 lines
2.3 KiB
Plaintext
Executable file
@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.
|
|
}
|