diff --git a/main.lua b/main.lua index 65cc27c..fc25055 100644 --- a/main.lua +++ b/main.lua @@ -893,6 +893,40 @@ PIDs = { ForeAftRatePID = CreatePID(0.1, 0.01, 0.05) } +-- min and max thrust for thrust normalization +local minThrust = 0 +local maxThrust = 0 + +local function createRollingAverage(window) + local buffer = {} + local index = 0 + local count = 0 + local sum = 0 + + return function(new_value) + index = (index % window) + 1 + + if buffer[index] then + sum = sum - buffer[index] + else + count = count + 1 + end + + buffer[index] = new_value + sum = sum + new_value + + return sum / count + end +end + +MinRollingAverage = createRollingAverage(10) +MaxRollingAverage = createRollingAverage(10) + +local function normalize(val, min, max) + if min == max then return 0.0 end + return (val - min) / (max - min) +end + function UpdateGlobalThrust() -- for each thruster, there is a table of affectVectors that determine in what directions the thruster can apply thrust -- each thruster has a power value from 0 to 1, which is the amount of thrust the thruster is currently applying @@ -936,8 +970,15 @@ function UpdateGlobalThrust() desiredThrust = desiredThrust + throttleOutput end + if desiredThrust > maxThrust then maxThrust = desiredThrust end + if desiredThrust < minThrust then minThrust = desiredThrust end + + local maxAverage = MaxRollingAverage(maxThrust) + local minAverage = MinRollingAverage(minThrust) + -- Normalize the desired thrust to be between 0 and 1 - local normalizedThrust = CustomSigmoid(desiredThrust) + local normalizedThrust = normalize(desiredThrust, minAverage, maxAverage) + if normalizedThrust < 0 then normalizedThrust = 0 end if Config.Debug then print("DEBUG: "..thruster.name..": desiredThrust "..desiredThrust..", normalizedThrust "..normalizedThrust) end