Simplify lots of code in the launch sequence.

This commit is contained in:
Anna Rose 2021-07-19 21:29:27 -04:00
parent 401f51425f
commit 642e5b17c5
4 changed files with 33 additions and 47 deletions

View File

@ -1,3 +1,4 @@
// runoncepath("lib/sensors").
runoncepath("lib/throttle").
runoncepath("lib/navigation").
@ -5,8 +6,9 @@ parameter APOAPSIS_TARGET is 80000.
parameter GRAVITY_TURN_START is 8000.
parameter GRAVITY_PITCH is 75.
parameter INITIAL_PITCH is 85.
parameter MINIMUM_PITCH is 40.
SensorCheck().
parameter MINIMUM_PITCH is 5.
local ATMO_TWR is 1.6.
// Configure subsystems.
CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal").
@ -23,57 +25,52 @@ from { local x is 5. } until x = 0 step { set x to x - 1. } do {
// Hold throttle to maintain 1.5 TWR.
// We do *not* use a PID Loop here because we can
// calculate the correct value discretely.
lock THROTTLE to ThrottleToTWR(1.5).
lock THROTTLE to ThrottleToTWR(ATMO_TWR).
print "Throttling to maintain a TWR of " + ATMO_TWR.
// Main ascent control.
lock THROTTLE to 1.0.
lock STEERING to heading(90,90,270).
stage.
wait until SHIP:ALTITUDE > 200.
lock STEERING to heading(90, INITIAL_PITCH, 270).
print "Vectoring away from launchpad".
lock STEERING to heading(90, INITIAL_PITCH, 270).
wait until SHIP:ALTITUDE > GRAVITY_TURN_START.
print "Pitching for gravity turn".
// Pitch over...
lock STEERING to heading(90, GRAVITY_PITCH, 270).
print ("Locked to heading " + STEERINGMANAGER:TARGET). // debug?
// Wait until we have rotated to (approximately) that pitch...
wait until vectorangle(
SHIP:FACING:FOREVECTOR,
STEERINGMANAGER:TARGET:FOREVECTOR)
< 0.5.
// then wait until Prograde catches up.
wait until vectorangle(
SHIP:SRFPROGRADE:FOREVECTOR,
STEERINGMANAGER:TARGET:FOREVECTOR)
< 0.5.
print "Locking to prograde".
print "Locking to prograde, letting gravity do the hard work.".
lock STEERING to GetAscentVector(MINIMUM_PITCH).
wait until SHIP:ALTITUDE > 32000. // todo: if we have a pressure sensor we can use it to decide when to kick the throttle up instead, neat solution for e.g. Duna and Eve.
until SHIP:ORBIT:APOAPSIS > 80000 {
// todo: we may need different values for bodies other than Kerbin.
local newHeading is lookdirup(SHIP:SRFPROGRADE:FOREVECTOR,
heading(90, 0, 270):TOPVECTOR).
if GetPitch(newHeading:FOREVECTOR) < MINIMUM_PITCH {
set newHeading to heading(90, MINIMUM_PITCH, 270).
}
lock STEERING to newHeading.
wait 0.001.
}
lock THROTTLE to 1.0.
wait until SHIP:ORBIT:APOAPSIS > APOAPSIS_TARGET.
lock THROTTLE to 0.0.
set SHIP:CONTROL:PILOTMAINTHROTTLE to 0.
wait 0.001.
wait 0.001. // make sure these control updates get applied
print "Target apoapsis acquired. Creating maneuver node".
AddCircularizationNode().
print "Releasing controls. Circularization maneuver added. Good luck, Kerman!".
unlock THROTTLE.
unlock STEERING.
SAS on.
wait 5.
// todo - automatically execute the node
CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Close Terminal").

View File

@ -6,6 +6,18 @@ function GetPitch {
return 90 - vectorangle(SHIP:UP:FOREVECTOR, v).
}
function GetAscentVector {
parameter minPitch.
// face prograde, but hold a solid eastern heading and don't
// rotate the ship
local newHeading is lookdirup(SHIP:SRFPROGRADE:FOREVECTOR,
heading(90, 0, 270):TOPVECTOR).
if GetPitch(newHeading:FOREVECTOR) < minPitch {
set newHeading to heading(90, minPitch, 270).
}
return newHeading.
}
function AddCircularizationNode {
parameter usePeriapsis is false.
local target is SHIP:ORBIT:APOAPSIS.

View File

@ -2,14 +2,7 @@
@lazyglobal off.
local G is 9.81.
lock G to GetGravAcc().
function GetGravAcc {
if HAS_GRAV_SENSOR = true {
return SHIP:SENSORS:GRAV:MAG.
}
return SHIP:BODY:MU / ((SHIP:BODY:RADIUS+SHIP:ALTITUDE)^2).
}
lock G to SHIP:BODY:MU / ((SHIP:BODY:RADIUS+SHIP:ALTITUDE)^2).
// Returns the throttle value you should use to achieve the
// target TWR. If TWR can't be achieved, returns 1.0. (full throttle)
@ -27,22 +20,6 @@ function TWR {
return t/(m*G).
}
// Check for various sensors and set appropriate global constants.
// Currently only checks for grav sensor, as that's the only one used by this library.
global HAS_GRAV_SENSOR is false.
function SensorCheck {
local SensorList is 0.
list SENSORS in SensorList.
for s in SensorList {
if s:type = "grav" {
print "Gravometric sensor detected".
set HAS_GRAV_SENSOR to true.
return.
}
}
set HAS_GRAV_SENSOR to false.
}
function BurnTime {
parameter dV.

View File

@ -24,7 +24,7 @@ local initialPitch is hBox:AddTextField("85").
local hBox is interface:AddHBox().
hBox:AddLabel("Minimum Pitch").
local minimumPitch is hBox:AddTextField("40").
local minimumPitch is hBox:AddTextField("5").
local hBox is interface:AddHBox().
hBox:AddLabel("Gravity Turn @").