sumguytwitches

SG Hot Rod Control

Apr 20th, 2023 (edited)
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.57 KB | None | 0 0
  1. for i in range(terminal:height-3) Print "":padright(terminal:width).
  2.  
  3.  
  4. set steeringmanager:rollcontrolanglerange to 180.
  5.  
  6.  
  7.  
  8. set proprad to 5.8.
  9. set rotormods to ship:modulesnamed("ModuleRoboticServoRotor").
  10. set rotors to list().
  11. for rm in rotormods {
  12. local rotor to lexicon().
  13. set rotor["part"] to rm:part.
  14. set rotor["job"] to choose "push" if rm:part:parent:tag:contains("push") else "vtol".
  15. set rotor["mod"] to rm.
  16. set rotor["mode"] to "flight".
  17. set rotor["blades"] to list().
  18. for bm in rm:part:ModulesNamed("ModuleControlSurface") {
  19. local b to bm:part.
  20.  
  21. local blade to lexicon().
  22. set blade["mod"] to bm.
  23. set blade["offset"] to vdot(-b:Facing:starvector, b:position - b:parent:position).
  24. set blade["proprad"] to proprad.
  25. set blade["angleratio"] to 2 * constant:pi * (blade:proprad + blade:offset)/60.
  26.  
  27. bm:setfield("deploy", true).
  28. bm:setfield("deploy angle", 5).
  29.  
  30. rotor["blades"]:add(blade).
  31. }
  32.  
  33. rotors:add(rotor).
  34. rm:setfield("torque limit(%)", 100).
  35. }
  36.  
  37.  
  38. //set aoatopressure to 9.
  39.  
  40. //4.387475597 / body:atm:altitudepressure(4997).
  41. // set aoatopressure to 3.33333 / body:atm:altitudepressure(12e3).
  42. // lock taraoa to body:atm:altitudepressure(altitude) * aoatopressure.
  43. set taralt to alt:radar + 10.
  44. set taraoa to 4.25.
  45. set deploycopy to 9.
  46. set speedPID to pidloop(1.5, 0, 0, -5, 5).
  47. // set vtolPID to pidloop(1.5, 0, 0, -2, 5).
  48. //set vtolPID:setpoint to taralt.
  49. lock vtolrpmtarget to min(460,max(0,((taralt-alt:radar)-verticalspeed) * 460)).
  50. lock pushrpmtarget to min(460,max(0,throttle * 460)).
  51. list engines in es.
  52. lock x to 90.
  53. lock p to 0.
  54. lock sl to 0.
  55. toggle ag1.
  56.  
  57. function gojets {
  58. for rm in rotors {
  59. if rm:job = "push" set rm:mode to "flight".
  60. }
  61. set taralt to 20e3.
  62. lock vtolrpmtarget to min(460,max(0,((taralt-altitude)-verticalspeed) * 460)).
  63.  
  64. toggle ag1.
  65. lock p to min(45,max(-15, -verticalSpeed + (taralt - altitude)/10)).
  66. lock steering to heading(x, p).
  67. steeringmanager:resetpids().
  68. lock throttle to ship:electriccharge-100.
  69. for en in es en:activate().
  70. }
  71.  
  72. function goprops {
  73. for rm in rotors {
  74. if rm:job = "push" set rm:mode to "flight".
  75. }
  76. set taralt to alt:radar + 100.
  77. lock vtolrpmtarget to min(460,max(0,((taralt-alt:radar)-verticalspeed) * 460)).
  78.  
  79. toggle ag1.
  80. lock p to min(15,max(-15, -verticalSpeed*1.7 + (taralt - alt:radar)/2.5)).
  81. lock steering to heading(x, p).
  82. steeringmanager:resetpids().
  83. lock throttle to ship:electriccharge-100.
  84. for en in es en:shutdown().
  85. }
  86. function vtol {
  87.  
  88. lock vtolrpmtarget to min(460,max(0,((taralt-alt:radar)-verticalspeed) * 460)).
  89. if airspeed >= 10 {
  90. toggle ag1.
  91. lock x2 to body:geopositionof(ship:facing:vector):heading.
  92. lock p2 to min(15,max(-15, -verticalSpeed*1.7 + (taralt - alt:radar)/2.5)).
  93. lock steering to heading(x2,p2).
  94. }
  95. for rm in rotors {
  96. if rm:job = "push" set rm:mode to "vtol".
  97. }
  98. when airspeed < 10 and sl = 0 then {
  99. toggle ag2.
  100. lock steering to lookdirup(up:vector*10-vxcl(ship:facing:topvector,ship:velocity:surface*0.1), heading(x + 180, 0):vector).
  101. }
  102.  
  103. }
  104.  
  105. function stop {
  106. lock throttle to 0.
  107. if airspeed >= 10 {
  108. toggle ag1.
  109. lock x2 to body:geopositionof(ship:facing:vector):heading.
  110. lock p2 to min(15,max(-15, -verticalSpeed*1.7 + (taralt - alt:radar)/2.5)).
  111. lock steering to heading(x2,p2).
  112. }
  113. lock sl to 0.
  114. for rm in rotors {
  115. if rm:job = "push" set rm:mode to "stopping".
  116. }
  117. when airspeed < 10 then {
  118. toggle ag2.
  119. lock steering to lookdirup(up:vector*10-ship:velocity:surface*0.1, heading(x + 180, 0):vector).
  120. }
  121.  
  122.  
  123. }
  124.  
  125. function land {
  126. stop().
  127. when airspeed < 1 then lock vtolrpmtarget to min(460,max(0,(-verticalspeed - 2) * 460)).
  128. on status brakes on.
  129. }
  130.  
  131. function vtoltotarget {
  132. parameter tgt.
  133. lock x to tgt:heading.
  134.  
  135. for rm in rotors {
  136. if rm:job = "push" { set rm:mode to "vtol". rm:mod:setfield("torque limit(%)",0).}
  137. }
  138.  
  139. when tgt:distance < 1000 then set x to tgt:heading.
  140. set vtoltargeting to true.
  141. set talt to tgt:terrainheight + 20.
  142. lock vtolrpmtarget to ((-verticalspeed*1.7 + max(-10,min(20,talt-altitude)))/5)*460.
  143.  
  144. lock sl to 5.
  145. lock tv to tgt:position:normalized * min(sl,(tgt:distance/6) ^ 0.85).
  146.  
  147. set relVelVec to vxcl(up:vector, tv - velocity:surface) / 3.5.
  148. set relVelVec:mag to min(sl,relVelVec:mag).
  149. set st to lookdirup(up:vector * 10 + relVelVec, heading(x+180,0):vector).
  150. lock steering to st.
  151.  
  152. when true then {
  153. set relVelVec to vxcl(up:vector, tv - velocity:surface) / 3.5.
  154. set relVelVec:mag to min(sl,relVelVec:mag).
  155. set st to lookdirup(up:vector * 10 + relVelVec, heading(x+180,0):vector).
  156. return vtoltargeting.
  157. }
  158.  
  159. when (ship:geoposition:position - tgt:position):mag < 0.1 and ship:groundspeed < 0.1 then {
  160. lock vtolrpmtarget to (-verticalspeed - 1)*460.
  161. wait 1.
  162. When ship:verticalspeed > 0 then lock vtolrpmtarget to 0.
  163. }
  164.  
  165. }
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175. when true then {
  176. set vtolrpmcopy to vtolrpmtarget.
  177. set pushrpmcopy to pushrpmtarget.
  178. set speedCopy to speedPID:update(time:seconds, vdot(ship:velocity:surface, ship:partstagged("PusherPropBay")[0]:facing:vector) - sl).
  179.  
  180. //set vtolCopy to vtolPID:update(time:seconds, alt:radar).
  181.  
  182. for rotor in rotors {
  183. if rotor["job"] = "vtol"
  184. {
  185. rotor:mod:setfield("rpm limit", vtolrpmcopy ).
  186. }
  187.  
  188. if rotor["job"] = "push" {
  189. if rotor["mode"] = "flight" {
  190. rotor:mod:setfield("rpm limit", pushrpmtarget ).
  191. for blade in rotor:blades {
  192. set calcAirspeed to blade["angleratio"] * pushrpmcopy.
  193. set deploycopy to max(3, taraoa + arctan2(airspeed, calcAirspeed)).
  194. blade:mod:setfield("deploy angle", deploycopy).
  195. }
  196. }
  197. if rotor["mode"] = "stopping" or rotor["mode"] = "vtol" {
  198. rotor:mod:setfield("rpm limit", 460 ).
  199. for blade in rotor:blades {
  200. set calcAirspeed to blade["angleratio"] * 460.
  201. set deploycopy to speedCopy + arctan2(airspeed, calcAirspeed).
  202. blade:mod:setfield("deploy angle", deploycopy).
  203. }
  204. }
  205. }
  206. }
  207.  
  208. return true.
  209. }
  210.  
  211.  
  212.  
  213. if (ship:Status = "Landed" or ship:status = "Splashed" or ship:velocity:surface:mag < 10) {
  214. stop().
  215. } else {
  216. gojets().
  217. }
  218.  
  219.  
Add Comment
Please, Sign In to add comment