Initial cleanup of ascent logic, not tested
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
// Inital gravity turn
|
||||||
|
run once staging.
|
||||||
|
run once maneuver.
|
||||||
|
|
||||||
|
function doAscentSteering {
|
||||||
|
parameter heading.
|
||||||
|
|
||||||
|
// initial pitch-over
|
||||||
|
set tarSteer to heading(heading, 90).
|
||||||
|
lock steering to tarSteer.
|
||||||
|
until ship:velocity:surface:mag >= 100 {
|
||||||
|
set tarSteer to heading(heading, 90 - (ship:velocity:surface:mag / 10)).
|
||||||
|
wait 0.
|
||||||
|
}
|
||||||
|
|
||||||
|
lock steering to ship:srfprograde.
|
||||||
|
print "Locked steering to surface prograde".
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCircularizationNode {
|
||||||
|
// Re-use existing node if already planned
|
||||||
|
if hasnode {
|
||||||
|
print "Existing node found. Skipping creation.".
|
||||||
|
return nextnode.
|
||||||
|
}
|
||||||
|
|
||||||
|
local rBurn to body:radius + apoapsis.
|
||||||
|
local vTarget to sqrt(body:mu / rBurn).
|
||||||
|
local dvEst to vTarget - ship:velocity:orbit:mag.
|
||||||
|
|
||||||
|
local nd to node(time:seconds + eta:apoapsis, 0, 0, dvEst).
|
||||||
|
add nd.
|
||||||
|
return nd.
|
||||||
|
}
|
||||||
|
|
||||||
|
function basicAscent {
|
||||||
|
parameter heading is 90, targetAltitude is 80000.
|
||||||
|
|
||||||
|
lock throttle to 1.
|
||||||
|
|
||||||
|
print "Counting down:".
|
||||||
|
from {local countdown is 5.} until countdown = 0 step {set countdown to countdown - 1.} do {
|
||||||
|
print "..." + countdown.
|
||||||
|
wait 1.
|
||||||
|
}
|
||||||
|
|
||||||
|
// initial stage to takeoff
|
||||||
|
stage.
|
||||||
|
|
||||||
|
// stage everytime thrust drops to zero
|
||||||
|
basicStaging().
|
||||||
|
// basic gravity-ish turn
|
||||||
|
doAscentSteering(heading).
|
||||||
|
|
||||||
|
// coast to apoapsis
|
||||||
|
wait until ship:apoapsis >= targetAltitude.
|
||||||
|
lock steering to ship:prograde.
|
||||||
|
lock throttle to 0.
|
||||||
|
|
||||||
|
// don't do futher calcs until out of the atmosphere or very close to apoapsis
|
||||||
|
wait until ship:altitude >= body:atm:height or eta:apoapsis < 60.
|
||||||
|
|
||||||
|
executeNode(createCircularizationNode()).
|
||||||
|
print "Circularized".
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
copyPath("0:/ascent.ks", "1:/ascent.ks").
|
||||||
|
copyPath("0:/maneuver.ks", "1:/maneuver.ks").
|
||||||
|
copyPath("0:/staging.ks", "1:/staging.ks").
|
||||||
|
run once ascent.
|
||||||
|
|
||||||
|
wait until ship:unpacked.
|
||||||
|
core:part:getmodule("kOSProcessor"):doevent("Open Terminal").
|
||||||
|
|
||||||
|
basicAscent(90, 80000).
|
||||||
|
|
||||||
|
core:part:getmodule("kOSProcessor"):doevent("Close Terminal").
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
//hellolaunch
|
|
||||||
set TARGET_ALTITUDE to 80000.
|
|
||||||
set ETA_TARGET to 60.
|
|
||||||
|
|
||||||
//First, we'll clear the terminal screen to make it look nice
|
|
||||||
wait until ship:unpacked.
|
|
||||||
clearscreen.
|
|
||||||
|
|
||||||
core:part:getmodule("kOSProcessor"):doevent("Open Terminal").
|
|
||||||
|
|
||||||
lock throttle to 1.0.
|
|
||||||
|
|
||||||
//This is our countdown loop, which cycles from 10 to 0
|
|
||||||
print "Counting down:".
|
|
||||||
from {local countdown is 5.} until countdown = 0 step {set countdown to countdown - 1.} do {
|
|
||||||
print "..." + countdown.
|
|
||||||
wait 1. // pauses the script here for 1 second.
|
|
||||||
}
|
|
||||||
|
|
||||||
when maxThrust = 0 then {
|
|
||||||
print "Staging".
|
|
||||||
stage.
|
|
||||||
preserve.
|
|
||||||
}.
|
|
||||||
|
|
||||||
// GRAVITY TURN
|
|
||||||
|
|
||||||
// pitch to 80 degrees over the first 100 m/s
|
|
||||||
set tarSteer to heading(90, 90).
|
|
||||||
lock steering to tarSteer.
|
|
||||||
until ship:velocity:surface:mag >= 100 {
|
|
||||||
set tarSteer to heading(90, 90 - (ship:velocity:surface:mag / 10)).
|
|
||||||
wait 0.
|
|
||||||
}
|
|
||||||
|
|
||||||
print "Finished initial pitch".
|
|
||||||
|
|
||||||
// actual gravity turn
|
|
||||||
lock steering to ship:srfprograde.
|
|
||||||
// lock steering to heading(90, max(90 - vang(ship:up:vector, ship:srfprograde:vector), 10)).
|
|
||||||
// wait until eta:apoapsis > 45.
|
|
||||||
|
|
||||||
// // burn to target apoapsis
|
|
||||||
// clearscreen.
|
|
||||||
// set circ_pid to pidloop(1/30, 0, 0, 0, 1).
|
|
||||||
// set circ_pid:setpoint to ETA_TARGET.
|
|
||||||
|
|
||||||
// set gravThrottle to 1.0.
|
|
||||||
// lock throttle to gravThrottle.
|
|
||||||
// until apoapsis >= TARGET_ALTITUDE {
|
|
||||||
// set gravThrottle to circ_pid:update(time:seconds, eta:apoapsis).
|
|
||||||
// print "Throttle: " + round(100 * gravThrottle, 0) + "%" at (0, 0).
|
|
||||||
// print "ETA: " + round(eta:apoapsis, 0) at (0, 1).
|
|
||||||
// wait 0.
|
|
||||||
// }
|
|
||||||
|
|
||||||
// clearscreen.
|
|
||||||
|
|
||||||
wait until ship:apoapsis >= TARGET_ALTITUDE.
|
|
||||||
print "80km apoapsis reached".
|
|
||||||
lock throttle to 0.
|
|
||||||
lock steering to ship:prograde.
|
|
||||||
|
|
||||||
wait until ship:altitude >= 70000.
|
|
||||||
|
|
||||||
// try to get apoapsis closer to target
|
|
||||||
if ship:apoapsis < TARGET_ALTITUDE and eta:apoapsis > 30 {
|
|
||||||
lock throttle to 1.
|
|
||||||
wait until ship:apoapsis >= TARGET_ALTITUDE.
|
|
||||||
lock throttle to 0.
|
|
||||||
}
|
|
||||||
|
|
||||||
wait until eta:apoapsis < 30.
|
|
||||||
|
|
||||||
// CIRCULARIZATION CALCS
|
|
||||||
set circThrottle to 0.
|
|
||||||
lock throttle to circThrottle.
|
|
||||||
set throttlePID to pidLoop(0.25, 0, 0, 0, 1).
|
|
||||||
set throttlePID:setpoint to 15.
|
|
||||||
|
|
||||||
set circPitch to 0.
|
|
||||||
lock steering to heading(90, circPitch).
|
|
||||||
set pitchPID to pidLoop(1, 0, 0, -10, 10).
|
|
||||||
set pitchPID:setpoint to 15.
|
|
||||||
|
|
||||||
until apoapsis - periapsis < 100 or periapsis > TARGET_ALTITUDE {
|
|
||||||
set circThrottle to max(0.1, throttlePID:update(time:seconds, eta:apoapsis)).
|
|
||||||
set circPitch to pitchPID:update(time:seconds, eta:apoapsis).
|
|
||||||
wait 0.
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock steering.
|
|
||||||
unlock throttle.
|
|
||||||
wait 1.
|
|
||||||
|
|
||||||
set ship:control:pilotmainthrottle to 0.
|
|
||||||
print "Circularized.".
|
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
run once staging.
|
||||||
|
|
||||||
|
function executeNode {
|
||||||
|
parameter nd is node(0, 0, 0, 0).
|
||||||
|
|
||||||
|
if node:deltav:mag = 0 {
|
||||||
|
print "Empty node".
|
||||||
|
return.
|
||||||
|
}
|
||||||
|
|
||||||
|
local burnTime to calcBurnTime(nd:deltav:mag).
|
||||||
|
print "Node in: " + round(nd:eta) + "s, dV: " + round(nd:deltav:mag, 1) + " m/s, burn time: " + round(burnTime, 1) + "s".
|
||||||
|
|
||||||
|
// ── Align to node vector.
|
||||||
|
// If already inside burn window, skip the 60s lead-in wait.
|
||||||
|
lock steering to lookdirup(nd:deltav, ship:facing:topvector).
|
||||||
|
|
||||||
|
if nd:eta > burnTime / 2 + 60 {
|
||||||
|
wait until nd:eta <= burnTime / 2 + 60.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Wait until pointed correctly, unless burn is critically overdue
|
||||||
|
if nd:eta > 0 {
|
||||||
|
wait until vang(ship:facing:vector, nd:deltav) < 1
|
||||||
|
or nd:eta <= burnTime / 2.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Snapshot initial dV for overburn detection
|
||||||
|
local dv0 to nd:deltav.
|
||||||
|
|
||||||
|
ag1 off.
|
||||||
|
|
||||||
|
until ag1 {
|
||||||
|
local tBurn to time:seconds + nd:eta.
|
||||||
|
local vActual to velocityat(ship, tBurn):orbit.
|
||||||
|
local vTarget to nd:deltav + vActual.
|
||||||
|
local dvLive to vTarget - ship:velocity:orbit.
|
||||||
|
|
||||||
|
lock steering to lookdirup(dvLive, ship:facing:topvector).
|
||||||
|
|
||||||
|
// ── Overburn detection
|
||||||
|
if vdot(dv0, nd:deltav) < 0 {
|
||||||
|
print "Overburn detected. Cutting throttle.".
|
||||||
|
lock throttle to 0.
|
||||||
|
break.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Residual dV negligible
|
||||||
|
if nd:deltav:mag < 0.1 {
|
||||||
|
lock throttle to 0.
|
||||||
|
break.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Throttle proportional to remaining dV magnitude
|
||||||
|
local maxAcc to ship:maxthrust / ship:mass.
|
||||||
|
if vang(ship:facing:vector, dvLive) > 1 {
|
||||||
|
lock throttle to 0.
|
||||||
|
} else {
|
||||||
|
lock throttle to min(1, dvLive:mag / maxAcc).
|
||||||
|
}
|
||||||
|
|
||||||
|
wait 0.
|
||||||
|
}
|
||||||
|
|
||||||
|
lock throttle to 0.
|
||||||
|
unlock throttle.
|
||||||
|
unlock steering.
|
||||||
|
remove nd.
|
||||||
|
}
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
declare function basicStaging {
|
||||||
|
when ship:maxThrust = 0 then {
|
||||||
|
print "Staging".
|
||||||
|
stage.
|
||||||
|
preserve.
|
||||||
|
}.
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcBurnTime {
|
||||||
|
parameter dvNeeded.
|
||||||
|
|
||||||
|
local totalTime to 0.
|
||||||
|
local dvRemaining to dvNeeded.
|
||||||
|
local stageNum to ship:stagenum.
|
||||||
|
|
||||||
|
until dvRemaining <= 0 or stageNum < 0 {
|
||||||
|
local stageDv to ship:stagedeltav(stageNum):current.
|
||||||
|
local stageTime to ship:stagedeltav(stageNum):duration.
|
||||||
|
|
||||||
|
if stageDv <= 0 {
|
||||||
|
set stageNum to stageNum - 1.
|
||||||
|
} else if stageDv >= dvRemaining {
|
||||||
|
set totalTime to totalTime + stageTime * (dvRemaining / stageDv).
|
||||||
|
set dvRemaining to 0.
|
||||||
|
} else {
|
||||||
|
set totalTime to totalTime + stageTime.
|
||||||
|
set dvRemaining to dvRemaining - stageDv.
|
||||||
|
set stageNum to stageNum - 1.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if dvRemaining > 0 {
|
||||||
|
print "WARNING: Insufficient dV. Short by " + round(dvRemaining, 1) + " m/s.".
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalTime.
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user