Guest User

arrow2.ks

a guest
Aug 23rd, 2015
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.81 KB | None | 0 0
  1. @LAZYGLOBAL OFF.
  2. ClearScreen.
  3. CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal").
  4.  
  5. FUNCTION Clamp
  6. {
  7. PARAMETER input, minVal, maxVal.
  8. RETURN MIN(maxVal, MAX(minVal, input)).
  9. }
  10. FUNCTION Deadzone
  11. {
  12. PARAMETER input, minVal, maxVal, dead.
  13. IF minVal <= input AND input <= maxVal
  14. {
  15. return dead.
  16. }
  17. return input.
  18. }
  19.  
  20. copy launch from 0.
  21. RUN Launch(false, true).
  22.  
  23. LOCAL engine IS SHIP:PartsTagged("mainEngine")[0].
  24. LOCAL engineModule IS engine:GetModule("ModuleEnginesRF").
  25. FOR resource IN SHIP:Resources
  26. {
  27. IF resource:Name = "Ethanol75" GLOBAL mainFuelRes TO resource.
  28. IF resource:Name = "LqdOxygen" GLOBAL mainOxRes TO resource.
  29. }
  30. LOCK mainFuel TO mainFuelRes:Amount * mainFuelRes:Density * 1000.
  31. LOCK mainOx TO mainOxRes:Amount * mainOxRes:Density * 1000.
  32. LOCK fuelRate TO engineModule:GetField("fuel flow").
  33. LOCK dtBurnout TO (mainFuel+mainOx) / fuelRate.
  34. LOCAL meco IS False.
  35.  
  36.  
  37. clearscreen.
  38. LOCAL alt0 TO ALT:RADAR.
  39. LOCK tE TO TIME:SECONDS - t0.
  40. LOCAL tLast IS tE.
  41. LOCAL tMeco IS tE.
  42. LOCAL dT IS 0.
  43. LOCAL az IS 90.
  44. LOCAL turnAltScale IS 100000.
  45. LOCAL azNrm IS vcrs(SHIP:UP:FOREVECTOR,HEADING(az,0):FOREVECTOR):NORMALIZED.
  46. LOCAL sumRErr IS 0.
  47. LOCAL sumYErr IS 0.
  48. LOCAL sumPErr IS 0.
  49. LOCAL r2d IS (180/CONSTANT():PI).
  50. LOCK rRate TO SHIP:ANGULARVEL*SHIP:FACING:FOREVECTOR * r2d.
  51. LOCK yRate TO SHIP:ANGULARVEL*SHIP:FACING:TOPVECTOR * r2d.
  52. LOCK pRate TO SHIP:ANGULARVEL*SHIP:FACING:STARVECTOR * r2d.
  53.  
  54. LOCAL kyP IS 0.15.
  55. LOCAL kyI IS 0.0125.
  56. LOCAL kyD IS -0.06.
  57.  
  58. LOCAL kpP IS 0.15.
  59. LOCAL kpI IS 0.0125.
  60. LOCAL kpD IS 0.06.
  61.  
  62. LOCAL krP IS 0.1.
  63. LOCAL krI IS 0.
  64. LOCAL krD IS 0.35.
  65.  
  66. LOCAL rcsMaxD IS 0.2.
  67.  
  68. LOCAL decayFactor IS 0.5.
  69. LOCAL damp IS 1.
  70. LOCAL tvec IS SHIP:UP:FOREVECTOR.
  71.  
  72. LOCAL controlYaw IS True.
  73. LOCAL controlPitch IS True.
  74. LOCAL controlRoll IS True.
  75.  
  76.  
  77.  
  78. SAS OFF.
  79.  
  80. LOCK orbitvec to VCRS(SHIP:UP:FOREVECTOR, azNrm).
  81. LOCK curprograde to vxcl(SHIP:UP:FOREVECTOR, SHIP:PROGRADE:FOREVECTOR):NORMALIZED.
  82. LOCK progradecorrect to (2*orbitvec*curprograde)*orbitvec - curprograde.
  83.  
  84. LOCAL render IS TRUE.
  85.  
  86. LOCAL mode IS 0.
  87.  
  88. WHEN SURFACESPEED >= 80 THEN
  89. {
  90. HUDTEXT("Roll Complete", 2, 2, 50, green, false).
  91. SET mode TO 1.
  92. SET krP TO 0.075.
  93. SET krI TO 0.02.
  94. SET krD TO 0.03.
  95. SET sumRErr TO 0.
  96. }
  97.  
  98. LOCAL etaAp IS 1000000.
  99. WHEN fuelRate <> 0 AND dtBurnout < 5 THEN
  100. {
  101. HUDTEXT("Terminal Guidance", 0.9, 2, 50, green, false).
  102. STAGE. // fairings
  103. SET damp TO 1.
  104. // stop any rolling
  105. SET krP TO 0.
  106. SET krI TO 0.
  107. SET krD TO krD * 2.
  108.  
  109. WHEN dtBurnout <= dT THEN
  110. {
  111. HUDTEXT("MECO", 2, 2, 50, green, false).
  112. SET mode TO 2.
  113. SET meco TO True.
  114. SET controlRoll TO False.
  115. LOCK Throttle TO 0.
  116. engineModule:DoAction("shutdown engine", true).
  117. STAGE. // discard booster
  118.  
  119. SET tMeco TO tE.
  120. WHEN tE > tMeco + 2 THEN
  121. {
  122. RCS ON.
  123. SET kyP TO 0.05.
  124. SET kyI TO 0.
  125. SET kyD TO -0.3.
  126.  
  127. SET kpP TO 0.05.
  128. SET kpI TO 0.
  129. SET kpD TO 0.3.
  130.  
  131. SET etaAp TO tE + ETA:APOAPSIS.
  132. WHEN tE > (etaAp - 1) THEN
  133. {
  134. RCS OFF.
  135. STAGE. // spin up
  136. WHEN tE > (etaAp + 3) THEN
  137. {
  138. STAGE. // fire 11x
  139. WHEN tE > (etaAp + 19) THEN
  140. {
  141. STAGE. // fire 3x
  142. WHEN tE > (etaAp + 26) THEN
  143. {
  144. STAGE. // fire 1x
  145. SET mode to 9999.
  146. }
  147. }
  148. }
  149. }
  150. }
  151. }
  152. }
  153. LOCAL maxQ IS 0.
  154.  
  155. UNTIL FALSE
  156. {
  157. SET dT TO tE - tLast.
  158. SET tLast TO tE.
  159.  
  160. IF mode = 0
  161. {
  162. SET tvec TO HEADING(90,90):FOREVECTOR.
  163. }
  164. IF mode = 1
  165. {
  166. FOR resource IN SHIP:Resources
  167. {
  168. IF resource:Name = "Ethanol75" SET mainFuelRes TO resource.
  169. IF resource:Name = "LqdOxygen" SET mainOxRes TO resource.
  170. }
  171.  
  172. LOCAL approxRho IS (Constant():E ^ (-SHIP:ALTITUDE / 10000)) * 1.22.
  173. LOCAL approxQ IS 0.5* SURFACESPEED*SURFACESPEED * approxRho / 1000.
  174. SET damp TO 1+(approxQ / 20).
  175. IF damp <= 1 SET damp TO 1.
  176.  
  177. SET maxQ TO MAX(maxQ,approxQ).
  178. if render print "approxQ: " + round(approxQ,2)+"/"+round(maxQ,2)+" " at (20,13).
  179. print "F: "+round(mainFuel,4)+", O: "+round(mainOx,4)+", rate: "+round(fuelRate,4)+" " at (0,15).
  180. IF fuelRate <> 0 print "MECO in "+round(dtBurnout,1)+"s " at (0,16).
  181.  
  182. local fac to MAX(0.001,MIN(1,SQRT(ALTITUDE/turnAltScale))).
  183. SET tvec TO (1-fac)*UP:FOREVECTOR:NORMALIZED + fac*progradecorrect.
  184. }
  185. ELSE IF mode = 2
  186. {
  187. SET tvec TO curPrograde.
  188. PRINT "Time to Ap: " + round(etaAp-tE,1) + " " at(0,15).
  189. }
  190. ELSE IF mode = 9999
  191. {
  192. BREAK.
  193. }
  194.  
  195. LOCAL pErr IS vang(SHIP:FACING:FOREVECTOR,vcrs(tvec,SHIP:FACING:STARVECTOR))-90.
  196. LOCAL rErr IS 90-vang(-SHIP:FACING:TOPVECTOR,azNrm).
  197. LOCAL yErr IS 90-vang(SHIP:FACING:FOREVECTOR,vcrs(tvec,SHIP:FACING:TOPVECTOR)).
  198.  
  199. local decay is 1-(decayFactor*dT).
  200. set sumRErr to (sumRErr*decay) + (rErr*dT).
  201. set sumYErr to (sumYErr*decay) + (yErr*dT).
  202. set sumPErr to (sumPErr*decay) + (pErr*dT).
  203.  
  204. LOCAL actPP IS kpP*pErr.
  205. LOCAL actPI IS kpI*sumPErr.
  206. LOCAL actPD IS kpD*pRate.
  207. LOCAL pInput IS Deadzone(Clamp((actPD+actPP+actPI)/damp,-1,1), -0.001, 0.001, 0).
  208. IF controlPitch SET SHIP:CONTROL:PITCH to pInput.
  209.  
  210. LOCAL actYP IS kyP*yErr.
  211. LOCAL actYI IS kyI*sumYErr.
  212. LOCAL actYD IS kyD*yRate.
  213. LOCAL yInput IS Deadzone(Clamp((actYD+actYP+actYI)/damp,-1,1), -0.001, 0.001, 0).
  214. IF controlYaw SET SHIP:CONTROL:YAW to yInput.
  215.  
  216. LOCAL actRP IS krP*rErr.
  217. LOCAL actRI IS krI*sumRErr.
  218. LOCAL actRD IS krD*rRate.
  219. LOCAL rInput IS Deadzone(Clamp((actRD+actRP+actRI)/(damp*2),-1,1), -0.001, 0.001, 0).
  220. IF controlRoll SET SHIP:CONTROL:ROLL to rInput.
  221.  
  222.  
  223. print "T = "+round(tE,2)+"s, dT = "+round(dT,4)+"s " at (0,0).
  224. IF render
  225. {
  226. print " Yaw P: "+round(yErr,4)+" I: "+round(sumYErr,4)+" D: "+round(yRate,4)+" " at (0,6).
  227. print "Ptch P: "+round(pErr,4)+" I: "+round(sumPErr,4)+" D: "+round(pRate,4)+" " at (0,7).
  228. print "Roll P: "+round(rErr,4)+" I: "+round(sumRErr,4)+" D: "+round(rRate,4)+" " at (0,8).
  229.  
  230. print "Roll Cmd "+round(rInput,4)+" " at(0,10).
  231. print " Yaw Cmd "+round(yInput,4)+" " at(0,11).
  232. print "Ptch Cmd "+round(pInput,4)+" " at(0,12).
  233. print "Damp: " + round(damp,4)+" " at (0,13).
  234. }
  235. TOGGLE render.
  236.  
  237. WAIT 0.00001.
  238. }
  239. DELETE CORE:BootFileName.
Advertisement
Add Comment
Please, Sign In to add comment