Forget using a PID loop, just lock to the throttle function and simplify it.

This commit is contained in:
Anna Rose 2021-07-19 20:06:38 -04:00
parent 45ca153f2f
commit 401f51425f
3 changed files with 20 additions and 25 deletions

View File

@ -8,6 +8,7 @@ deletepath("/boot/rocket").
compile "0:/ui/rocket" to "1:/init". compile "0:/ui/rocket" to "1:/init".
compile "0:/lib/navigation" to "1:/lib/navigation". compile "0:/lib/navigation" to "1:/lib/navigation".
compile "0:/lib/throttle" to "1:/lib/throttle". compile "0:/lib/throttle" to "1:/lib/throttle".
copypath("0:/lib/math", "1:/lib/math"). // larger when compiled
compile "0:/launch" to "1:/launch". compile "0:/launch" to "1:/launch".
copypath("0:/execnode", "1:/execnode"). // larger when compiled copypath("0:/execnode", "1:/execnode"). // larger when compiled

View File

@ -1,5 +1,5 @@
run once "lib/throttle". runoncepath("lib/throttle").
run once "lib/navigation". runoncepath("lib/navigation").
parameter APOAPSIS_TARGET is 80000. parameter APOAPSIS_TARGET is 80000.
parameter GRAVITY_TURN_START is 8000. parameter GRAVITY_TURN_START is 8000.
@ -20,16 +20,10 @@ from { local x is 5. } until x = 0 step { set x to x - 1. } do {
wait 0.5. wait 0.5.
} }
// throttle controls // Hold throttle to maintain 1.5 TWR.
when TWR() > 1.5 then { // We do *not* use a PID Loop here because we can
if SHIP:ALTITUDE > 32000 { // calculate the correct value discretely.
lock THROTTLE to 1.0. lock THROTTLE to ThrottleToTWR(1.5).
return false.
}
lock THROTTLE to ThrottleToTWR(1.5).
return true.
}
// Main ascent control. // Main ascent control.
lock THROTTLE to 1.0. lock THROTTLE to 1.0.

View File

@ -1,29 +1,30 @@
// Functions for calculating thrust values. // Functions for calculating thrust values.
@lazyglobal off. @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).
}
// Returns the throttle value you should use to achieve the // Returns the throttle value you should use to achieve the
// target TWR. If TWR can't be achieved, returns 1.0. (full throttle) // target TWR. If TWR can't be achieved, returns 1.0. (full throttle)
function ThrottleToTWR { function ThrottleToTWR {
parameter targetTWR is 1.5. parameter targetTWR is 1.5.
local m is SHIP:MASS. local m is SHIP:MASS.
local g is 9.81. return min((targetTWR*m*G)/SHIP:AVAILABLETHRUST, 1.0).
if HAS_GRAV_SENSOR = true {
set g to SHIP:SENSORS:GRAV:MAG.
}
return min((targetTWR*m*g)/SHIP:AVAILABLETHRUST, 1.0).
} }
// Calculates the ship's current TWR. // Calculates the ship's current TWR.
function TWR { function TWR {
local m is ship:mass. local m is ship:mass.
local g is 9.81. // fallback to this approximation that doesn't deal with
// altitude change.
if HAS_GRAV_SENSOR = true {
set g to SHIP:SENSORS:GRAV:MAG.
}
local t is THROTTLE * SHIP:AVAILABLETHRUST. local t is THROTTLE * SHIP:AVAILABLETHRUST.
return t/(m*g). return t/(m*G).
} }
// Check for various sensors and set appropriate global constants. // Check for various sensors and set appropriate global constants.
@ -51,7 +52,6 @@ function BurnTime {
local m is SHIP:MASS * 1000. // Starting mass (kg) local m is SHIP:MASS * 1000. // Starting mass (kg)
local e is CONSTANT():E. // Base of natural log local e is CONSTANT():E. // Base of natural log
local p is en[0]:ISP. // Engine ISP (s) local p is en[0]:ISP. // Engine ISP (s)
local g is 9.80665. // Gravitational acceleration constant (m/s²)
return g * m * p * (1 - e^(-dV/(g*p))) / f. return G * m * p * (1 - e^(-dV/(G*p))) / f.
} }