From 642e5b17c53f8178678da0ce8f91d1ce6c505ce5 Mon Sep 17 00:00:00 2001 From: annabunches Date: Mon, 19 Jul 2021 21:29:27 -0400 Subject: [PATCH] Simplify lots of code in the launch sequence. --- launch.ks | 41 +++++++++++++++++++---------------------- lib/navigation.ks | 12 ++++++++++++ lib/throttle.ks | 25 +------------------------ ui/rocket.ks | 2 +- 4 files changed, 33 insertions(+), 47 deletions(-) diff --git a/launch.ks b/launch.ks index 694b43e..35cbd7c 100644 --- a/launch.ks +++ b/launch.ks @@ -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"). diff --git a/lib/navigation.ks b/lib/navigation.ks index ae70d11..c893aa3 100644 --- a/lib/navigation.ks +++ b/lib/navigation.ks @@ -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. diff --git a/lib/throttle.ks b/lib/throttle.ks index ce34adb..99aaef9 100644 --- a/lib/throttle.ks +++ b/lib/throttle.ks @@ -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. diff --git a/ui/rocket.ks b/ui/rocket.ks index 9016142..72c1862 100644 --- a/ui/rocket.ks +++ b/ui/rocket.ks @@ -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 @").