// functions for calculating steering values. @lazyglobal off. function GetPitch { parameter v is SHIP:FACING:FOREVECTOR. 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. local t is TIME + SHIP:ORBIT:ETA:APOAPSIS. if usePeriapsis { set target to SHIP:ORBIT:PERIAPSIS. set t to SHIP:ORBIT:ETA:PERIAPSIS. } local n is Node(t, 0, 0, 0). add(n). local epsilon is 100. lock diff to n:ORBIT:APOAPSIS - n:ORBIT:PERIAPSIS. local pid is PIDLoop(0.05, 0.006, 0.006). set pid:EPSILON to epsilon. set pid:SETPOINT to n:ORBIT:APOAPSIS. until abs(diff) < epsilon { print diff. set n:PROGRADE to pid:Update(TIME:SECONDS, n:ORBIT:PERIAPSIS). wait 0.001. } }