Advertisement
Guest User

Untitled

a guest
Aug 5th, 2019
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.14 KB | None | 0 0
  1. //Bossart Expanded Launch To Orbit
  2.  
  3. //Variables
  4. SET flightState TO "PREFLIGHT".
  5. SET throttlePid TO PIDLOOP().
  6. SET throttlePidOn TO FALSE.
  7. SET targetApoapsis TO 90000.
  8.  
  9. //Functions
  10. FUNCTION setThrottle {
  11. PARAMETER newThrottle.
  12.  
  13. IF newThrottle > 1.0 {
  14. SET newThrottle TO 1.0.
  15. } ELSE IF newThrottle < 0.0 {
  16. SET newThrottle TO 0.0.
  17. }
  18. SET currentThrottle TO newThrottle.
  19. }
  20.  
  21. FUNCTION calculateDVToCircularize {
  22. SET velocityApoapsis TO VELOCITYAT(SHIP,TIME + ETA:APOAPSIS):ORBIT:MAG.
  23. SET desiredVelocityApoapsis TO SQRT(CONSTANT:G * KERBIN:MASS / (APOAPSIS + KERBIN:RADIUS)).
  24. RETURN desiredVelocityApoapsis - velocityApoapsis.
  25. }
  26.  
  27. FUNCTION calculateBurnDuration {
  28. PARAMETER dV.
  29.  
  30. LIST ENGINES IN engineList.
  31. FOR engine IN engineList {
  32. IF engine:ACTIVE {
  33. SET eV TO engine:ISP * CONSTANT:G0.
  34. }
  35. }
  36. RETURN ((MASS * eV) / MAXTHRUST) * (1 - CONSTANT:E ^ (-dV / eV)).
  37. }
  38.  
  39. FUNCTION getPitchComponentOfDirection {
  40. PARAMETER inputDirection.
  41.  
  42. RETURN 90 - VANG(inputDirection:VECTOR, UP:VECTOR).
  43. }
  44.  
  45. //Start here
  46. CLEARSCREEN.
  47.  
  48. //Preflight checks
  49. SAS OFF. //Turn off SAS
  50. RCS OFF. //Turn off RCS
  51. setThrottle(1.0). //Main engines full throttle
  52. LOCK THROTTLE TO currentThrottle.
  53. SET steeringDirection TO UP.
  54. LOCK STEERING TO steeringDirection. //Make sure we are pointed straight up
  55. FROM {LOCAL X IS 10.} UNTIL X = 0 STEP {SET X TO X-1.} DO {
  56. PRINT "Liftoff in T-" + X + "...".
  57. WAIT 1.
  58. }
  59. PRINT "Main engine ignition.".
  60. STAGE. //Activate first stage engine. Liftoff
  61. RCS ON.
  62. SET flightState TO "FIRST_STAGE_FLIGHT".
  63.  
  64. //Pitch over maneuver
  65. WAIT UNTIL VERTICALSPEED >= 90.
  66. PRINT "Executing pitch over.".
  67. SET steeringDirection TO HEADING(90, 83).
  68.  
  69. //Hold prograde
  70. WAIT UNTIL VECTORANGLE(SRFPROGRADE:VECTOR, HEADING(90,83):VECTOR) <= 0.5.
  71. PRINT "Holding prograde.".
  72. UNTIL ETA:APOAPSIS >= 50 {
  73. SET steeringDirection TO HEADING(90, getPitchComponentOfDirection(SRFPROGRADE)).
  74. }
  75.  
  76. //Hold time to apoapsis 50 seconds
  77. PRINT "Holding time to apopapsis at 50 seconds.".
  78. SET throttlePidOn TO TRUE.
  79. SET throttlePid:SETPOINT TO 50.
  80. SET throttlePid:MAXOUTPUT TO 1.0.
  81. SET throttlePid:MINOUTPUT TO 0.1.
  82.  
  83. WHEN throttlePidOn THEN {
  84. SET throttleUpdate TO throttlePid:UPDATE(TIME:SECONDS, ETA:APOAPSIS).
  85. setThrottle(throttleUpdate).
  86. RETURN TRUE.
  87. }
  88.  
  89. WHEN flightState = "FIRST_STAGE_FLIGHT" THEN {
  90. SET steeringDirection TO HEADING(90, getPitchComponentOfDirection(SRFPROGRADE)).
  91. //Discard half stage after 20km altitude
  92. IF ALTITUDE >= 20000 {
  93. PRINT "Separating half stage.".
  94. STAGE.
  95. SET flightState TO "FIRST_STAGE_FLIGHT_SECOND_PHASE".
  96. RETURN FALSE.
  97. }
  98. RETURN TRUE.
  99. }
  100.  
  101. //First stage separation
  102. WHEN flightState = "FIRST_STAGE_FLIGHT_SECOND_PHASE" THEN {
  103. SET steeringDirection TO HEADING(90, getPitchComponentOfDirection(SRFPROGRADE)).
  104. IF MAXTHRUST = 0.0 {
  105. PRINT "Separating first stage.".
  106. SET throttlePidOn TO FALSE.
  107. setThrottle(0.0).
  108. STAGE. //Decouple first stage
  109. WAIT 3.
  110. STAGE. //Activate second stage engine.
  111. SET flightState TO "SECOND_STAGE_FLIGHT_THRUST_RAMP".
  112. RETURN FALSE.
  113. }
  114. RETURN TRUE.
  115. }
  116.  
  117. //Ramp up to full thrust
  118. WHEN flightState = "SECOND_STAGE_FLIGHT_THRUST_RAMP" THEN {
  119. IF currentThrottle = 1.0 {
  120. SET flightState TO "SECOND_STAGE_FLIGHT".
  121. SET prevEtaApoapsis TO ETA:APOAPSIS.
  122. SET initialTime TO TIME:SECONDS.
  123. SET deltaEtaApoapsis TO 0.
  124. RETURN FALSE.
  125. } ELSE {
  126. IF currentThrottle = 0.0 {
  127. PRINT "Second stage engine ignition.".
  128. }
  129. setThrottle(currentThrottle + 0.1).
  130. WAIT 0.1.
  131. RETURN TRUE.
  132. }
  133. }
  134.  
  135. WHEN flightState = "SECOND_STAGE_FLIGHT" THEN {
  136. IF TIME:SECONDS > initialTime + 1 {
  137. SET deltaEtaApoapsis TO ETA:APOAPSIS - prevEtaApoapsis.
  138. SET prevEtaApoapsis TO ETA:APOAPSIS.
  139. }
  140. //If time to apoapsis starts increasing, pitch down a bit.
  141. IF deltaEtaApoapsis > 0 AND ETA:APOAPSIS >= 25 AND NOT throttlePidOn {
  142. SET newPitch TO 90 - VANG(UP:VECTOR, FACING:VECTOR) - 5.
  143. IF newPitch < (90 - VANG(UP:VECTOR, PROGRADE:VECTOR)) {
  144. SET newPitch TO 90 - VANG(UP:VECTOR, PROGRADE:VECTOR).
  145. }
  146. SET steeringDirection TO HEADING(90, newPitch).
  147. IF ABS(VANG(FACING:VECTOR, PROGRADE:VECTOR)) < 1 {
  148. IF NOT throttlePidOn {
  149. PRINT "Throttle PID on.".
  150. SET throttlePidOn TO TRUE.
  151. SET throttlePid:SETPOINT TO 25.
  152. }
  153. }
  154. } ELSE IF throttlePidOn {
  155. SET steeringDirection TO PROGRADE.
  156. }
  157.  
  158. //Coast once reached target apoapsis
  159. IF APOAPSIS >= targetApoapsis {
  160. PRINT "Second stage engine shutdown.".
  161. SET throttlePidOn TO FALSE.
  162. setThrottle(0.0).
  163. SET steeringDirection TO PROGRADE.
  164. SET flightState TO "SECOND_STAGE_COAST_TO_APOAPSIS".
  165. RETURN FALSE.
  166. }
  167.  
  168. //Exit if ran out of fuel early
  169. IF MAXTHRUST <= 0 {
  170. SET EXIT TO TRUE.
  171. }
  172. //Check if we ran out of fuel before hitting target apopapsis
  173.  
  174. RETURN TRUE.
  175. }
  176.  
  177. WHEN flightState = "SECOND_STAGE_COAST_TO_APOAPSIS" THEN {
  178. SET steeringDirection TO PROGRADE.
  179. IF ALTITUDE > 85000 {
  180. SET dVToCircularize TO calculateDVToCircularize().
  181. SET burnDuration TO calculateBurnTime(dVToCircularize).
  182. SET flightState TO "SECOND_STAGE_PRECIRCULARIZATION".
  183. SET initialTime TO TIME:SECONDS.
  184. RETURN FALSE.
  185. }
  186. //Exit if ran out of fuel early
  187. IF MAXTHRUST <= 0 {
  188. SET EXIT TO TRUE.
  189. }
  190. RETURN TRUE.
  191. }
  192.  
  193. WHEN flightState = "SECOND_STAGE_PRECIRCULARIZATION" THEN {
  194. SET steeringDirection TO PROGRADE.
  195. SET timeUntilBurn TO ETA:APOAPSIS - burnDuration / 2.
  196. IF timeUntilBurn <= 0 {
  197. PRINT "Excuting circularization burn.".
  198. setThrottle(1.0).
  199. SET burnEndTime TO TIME + burnDuration.
  200. SET flightState TO "CIRCULARIZATION".
  201. RETURN FALSE.
  202. } ELSE {
  203. IF TIME:SECONDS >= initialTime + 1 {
  204. SET initialTime TO TIME:SECONDS.
  205. PRINT "Time until burn: " + initialTime + " seconds.".
  206. }
  207. }
  208. RETURN TRUE.
  209. }
  210.  
  211. WHEN flightState = "CIRCULARIZATION" THEN {
  212. SET steeringDirection TO PROGRADE.
  213. IF (TIME >= burnEndTime OR PERIAPSIS >= targetApoapsis) {
  214. setThrottle(0.0).
  215. WAIT 1.
  216. SET SHIP:CONTROL:PILOTMAINTHROTTLE TO 0.
  217. UNLOCK STEERING.
  218. SET EXIT TO TRUE.
  219. RETURN FALSE.
  220. }
  221. RETURN TRUE.
  222. }
  223.  
  224. SET EXIT TO FALSE.
  225. WAIT UNTIL EXIT.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement