Advertisement
Guest User

SimpleKSPOrbitalOperations0.002

a guest
Sep 3rd, 2012
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.96 KB | None | 0 0
  1.  
  2.  
  3. -- SimpleKSPOrbitalOperations is a purely calculation based lua library, with some constants hardcoded for Kerbal Space Program
  4.  
  5. -- v0.002
  6.  
  7. -- v0.002 changes: Added measureSkooIspFromTmbiTmbtwnNsDriver(TimeBeforeInitial, TimeBetweenEach, NumberSlices), testSkooIspFromTmbiTmbtwnNsMpcsDriver(TimeBeforeInitial, TimeBetweenEach, NumberSlices, MaxPointingChangeStable), cotestSkooIspFromTmbiTmbtwnNs(TimeBeforeInitial, TimeBetweenEach, NumberSlices), cotestSkooIspFromTmbiTmbtwnNsMpcs(TimeBeforeInitial, TimeBetweenEach, NumberSlices, MaxPointingChangeStable)
  8.  
  9. -- to use, put
  10.  
  11. -- require "SimpleKSPOrbitalOperations"
  12.  
  13. -- in your lua script, or run it with
  14.  
  15. -- dofile("SimpleKSPOrbitalOperations")
  16.  
  17. -- Original Work Copyright 2012, Nadrek, insofar as any elements that aren't obvious, trivial, or mathematics are concerned (none of which are copyrightable)
  18.  
  19. -- licensed under your choice of GPLv2, GPLv3, or Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)  http://www.gnu.org/licenses/gpl-2.0.html  or  http://www.gnu.org/licenses/gpl.html  or  http://creativecommons.org/licenses/by-sa/3.0/
  20.  
  21. -- KSP specific functions will have KSP in the name; other functions will not, and can be used for real life calculations as well.
  22.  
  23.  
  24.  
  25. -- This script requires SimpleKSPOrbitalMechanics to do the math, which in turn requires SimpleOrbitalMechanics to do the heavy mathematical lifting.
  26.  
  27. -- This script contains KSP specific functions and calls useful to and reliant on Kerbal Space Program, MechJeb, and MechJeb's Autom8 module.
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. --[[ NOTE: Undocumented commands:
  40.  
  41. mechjeb.stage() -- fires off a stage, like hitting space bar
  42.  
  43. mechjeb.controlRelease() -- deactivates the .attitudeTo() and perhaps other commands
  44.  
  45. mechjeb.thrustActivate(Percentage)
  46.  
  47. mechjeb.thrustDeactivate()
  48.  
  49. ]]
  50.  
  51.  
  52.  
  53.  
  54.  
  55. require "SimpleKSPOrbitalMechanics"
  56.  
  57.  
  58.  
  59.  
  60.  
  61. local function launchSkooFromApPeInc(Ap, Pe, Inclination)
  62.  
  63.   -- Ap is the Apoapsis in meters
  64.  
  65.   -- Pe is the Periapsis in meters
  66.  
  67.   -- Inclination is the desired orbital inclination in degrees
  68.  
  69.   -- FUTURE include wait(time) or warp(time), but right now do print(vessel.time) wait(2) print(vessel.time) end    freezes the game for 2 seconds and then displays two identical times.
  70.  
  71.  
  72.  
  73.   -- REQUIRES globalSomMainBodyReset to have been called properly
  74.  
  75.   --   the simple way is to run globalSkomKSPMainBodyResetBasedOnGuessing() first!
  76.  
  77.  
  78.  
  79.   -- First, let's reset our main body; perhaps we've switch orbits recently!
  80.  
  81.   globalSkomKSPMainBodyResetBasedOnGuessing()
  82.  
  83.  
  84.  
  85.   -- Check to see if the Ap and Pe is obviously bad
  86.  
  87.   if Ap == (-1) or Pe == (-1) then
  88.  
  89.     print("ERROR: Ap or Pe is -1, which indicates an inability to get a prior calculation to come out right when orbiting " .. globalSomMainBodyName)
  90.  
  91.     return
  92.  
  93.   end
  94.  
  95.    
  96.  
  97.  
  98.  
  99.   print("Launching to a Periapsis of " .. Pe .. " meters with Inclination " .. Inclination .. " degrees at " .. vessel.time)
  100.  
  101.   mechjeb.launchTo(Pe, Inclination)
  102.  
  103.   wait(mechjeb.free)
  104.  
  105.   mechjeb.autoStageActivate()
  106.  
  107.   local StartTime = vessel.time -- in seconds, with a massive offset.  Maybe for use later.
  108.  
  109.   print("Followon launch circularization at " .. StartTime)
  110.  
  111.   mechjeb.circularize()
  112.  
  113.   wait(mechjeb.free)
  114.  
  115.   print("Changing Apoapsis to " .. Ap .. " meters starting at " .. vessel.time)
  116.  
  117.   mechjeb.changeAp(Ap)
  118.  
  119.   wait(mechjeb.free)
  120.  
  121.   print("Tweaking orbit Pe starting at " .. vessel.time)
  122.  
  123.   mechjeb.changePe(Pe)
  124.  
  125.   wait(mechjeb.free)
  126.  
  127.   print("Tweaking orbit Ap starting at " .. vessel.time)
  128.  
  129.   mechjeb.changeAp(Ap)
  130.  
  131.   wait(mechjeb.free)
  132.  
  133.   mechjeb.autoStageDeactivate()
  134.  
  135.   print("Launch complete at " .. vessel.time)
  136.  
  137.   printSkomKSPCurrentOrbitalElements()
  138.  
  139. end
  140.  
  141.  
  142.  
  143.  
  144.  
  145. local function launchSkooMolniyaFromIncMoe(Inclination, MarginOfError)
  146.  
  147.   -- Inclination is the desired orbital inclination in degrees, and should be 63.4, -63.4, 116.6, or -116.6 degrees
  148.  
  149.   --   to correctly counteract the gravitational effect of an oblate body, like Earth's fat equatorial bulge
  150.  
  151.   -- MarginOfError 0.001 means allow 0.1% for a "safety zone" above the minimum stable altitude, or below the Hill sphere of influence.
  152.  
  153.   --   Do this if you want to just barely scrape by!
  154.  
  155.   --   2 means allow a 200% "safety zone" above the minimum stable altitude, or below the Hill sphere of influence.
  156.  
  157.   --   Do this if you want to have a much less eccentric orbit - perhaps you want to keep certain orbits clear for other uses!
  158.  
  159.   --   If in doubt, try setting MarginOfError to 0.1
  160.  
  161.   -- REQUIRES globalSomMainBodyReset to have been called properly
  162.  
  163.   --   the simple way is to run globalSkomKSPMainBodyResetBasedOnGuessing() first!
  164.  
  165.  
  166.  
  167.  
  168.  
  169.     -- First, let's reset our main body; perhaps we've switch orbits recently!
  170.  
  171.   globalSkomKSPMainBodyResetBasedOnGuessing()
  172.  
  173.  
  174.  
  175.   -- Now, did we get a good Inclination?  If not, give a polite warning.
  176.  
  177.   if Inclination ~= (63.4) and Inclination ~= (-63.4) and Inclination ~= (116.6) and Inclination ~= (-116.6) then
  178.  
  179.     print "WARNING: Classic Molniya orbits must have an inclination of 63.4, -63.4, 116.6, or -116.6 degrees"
  180.  
  181.     print "   to correctly counteract the gravitational effect of an oblate body, like Earth's fat equatorial bulge"
  182.  
  183.     print "   Continuing to try anyway.  You have been politely warned!"
  184.  
  185.   end
  186.  
  187.  
  188.  
  189.     -- Now, calculate a Molniya orbit.
  190.  
  191.   local localAp, localPe = calcSkomMolniyaApPeFromMainBodyCurrentlyBeingOrbitedFromMoe(MarginOfError)
  192.  
  193.  
  194.  
  195.     -- Did we get one?  If we got -1 back, we didn't.
  196.  
  197.   if localAp == (-1) or localPe == (-1) then
  198.  
  199.     print("ERROR: Cannot calculate a stable Molniya orbit with this MarginOfError around " .. globalSomMainBodyName)
  200.  
  201.     return
  202.  
  203.   end
  204.  
  205.  
  206.  
  207.  
  208.  
  209.   launchSkooFromApPeInc(localAp, localPe, Inclination)
  210.  
  211. end
  212.  
  213.  
  214.  
  215. function colaunchSkooFromApPeInc(Ap, Pe, Inclination)
  216.  
  217.   local coToLaunchWith = coroutine.create(launchSkooFromApPeInc)
  218.  
  219.   coroutine.resume(coToLaunchWith, Ap, Pe, Inclination)
  220.  
  221. end
  222.  
  223.  
  224.  
  225.  
  226.  
  227. function colaunchSkooMolniyaFromIncMoe(Inclination, MarginOfError)
  228.  
  229.   local coToLaunchWith = coroutine.create(launchSkooMolniyaFromIncMoe)
  230.  
  231.   coroutine.resume(coToLaunchWith, Inclination, MarginOfError)
  232.  
  233. end
  234.  
  235.  
  236.  
  237.  
  238.  
  239. local function measureSkooIspFromTmbiTmbtwnNsDriver(TimeBeforeInitial, TimeBetweenEach, NumberSlices)
  240.  
  241.   -- added in v0.002
  242.  
  243.   -- NOTE: This is designed to be run asynchronously to vessel control.
  244.  
  245.   -- NOTE: This will only work anywhere close to properly with a small TimeBetweenEach,
  246.  
  247.   --   in a circular orbit, with the vessel held in prograde or retrograde directions.
  248.  
  249.   -- TimeBeforeInitial is the "spool up" delay in seconds we're going to use
  250.  
  251.   --   this is how much time we think it takes our engines to come to stable thrust
  252.  
  253.   --   i.e. 0.5 means set thrust to the desired value, then wait half a second, then start the measurement for this "slice"
  254.  
  255.   --   For the bell rocket engines in 0.16, 0.25 is a reasonable minimum for TimeBeforeInitial
  256.  
  257.   -- TimeBetweenEach is the time in seconds between initial and final measurements for each "slice"
  258.  
  259.   --   For the bell rocket engines in 0.16, 0.25 is a reasonable minimum for TimeBetweenEach
  260.  
  261.   -- NumberSlices is how many slices we're going to divide our thrust into, i.e.
  262.  
  263.   --   1 means 100 (100% max thrust) / 1 = one test at 100%.
  264.  
  265.   --   2 means 100/2 = 50% for the first test, and 100% for the second.
  266.  
  267.   --   4 means 100/4 = 25% for the first test, 50% for the second, 75% for the third, and 100% for the fourth.
  268.  
  269.   -- Nothing is returned per se, but the Specific Impulse, kg mass lost, and Delta-V per mass is printed at each slice for human consumption.
  270.  
  271.   -- While we could use the Skom reporting functions, because we need initial and final mass
  272.  
  273.   --   instead of just differences, this is almost easier and is certainly simpler to understand.
  274.  
  275.   if TimeBeforeInitial < 0.25 then
  276.  
  277.     print "WARNING: TimeBeforeInitial below 0.25 seconds may or may not return accurate results.  Test your particular implementation."
  278.  
  279.   end
  280.  
  281.  
  282.  
  283.   if TimeBetweenEach < 0.25 then
  284.  
  285.     print "WARNING: TimeBetweenEach below 0.25 seconds may or may not return accurate results.  Test your particular implementation."
  286.  
  287.   end
  288.  
  289.  
  290.  
  291.   -- Deactivate autostaging, which could result in inaccurate fuel estimates, since we
  292.  
  293.   --   assume that all mass lost is fuel.
  294.  
  295.   mechjeb.autoStageDeactivate()
  296.  
  297.  
  298.  
  299.   for i = 1, NumberSlices do
  300.  
  301.     local localThrustThisSlice = 100 * (i / NumberSlices)
  302.  
  303.     mechjeb.thrustActivate(localThrustThisSlice)
  304.  
  305.    
  306.  
  307.     wait(TimeBeforeInitial)
  308.  
  309.    
  310.  
  311.     local localInitialMs = vessel.mass
  312.  
  313.     local localInitialOv = vessel.speedOrbital
  314.  
  315.    
  316.  
  317.     wait(TimeBetweenEach)
  318.  
  319.    
  320.  
  321.     local localFinalMs = vessel.mass
  322.  
  323.     local localFinalOv = vessel.speedOrbital
  324.  
  325.    
  326.  
  327.     local localIsp = calcSomIspFromTsmTemDv(localInitialMs, localFinalMs, (localFinalOv - localInitialOv))
  328.  
  329.    
  330.  
  331.     print("At thrust: " .. localThrustThisSlice .. "% Isp is: " .. localIsp)
  332.  
  333.     print("   Used " .. (localInitialMs - localFinalMs)*1000 .. " kg fuel, for " .. (localFinalOv - localInitialOv) .. " DeltaV, or " .. (localFinalOv - localInitialOv)/((localInitialMs - localFinalMs)*1000) .. " DeltaV per kg fuel and " .. (localFinalOv - localInitialOv)/TimeBetweenEach .. " DeltaV per second")
  334.  
  335.   end -- for i = 1, NumberSlices do
  336.  
  337.  
  338.  
  339.   -- End test thrust.
  340.  
  341.   mechjeb.thrustDeactivate()
  342.  
  343.  
  344.  
  345. end
  346.  
  347.  
  348.  
  349.  
  350.  
  351. local function testSkooIspFromTmbiTmbtwnNsMpcsDriver(TimeBeforeInitial, TimeBetweenEach, NumberSlices, MaxPointingChangeStable)
  352.  
  353.   -- added in v0.002
  354.  
  355.   -- NOTE: This is designed to be run asynchronously to the main window.
  356.  
  357.   -- see measureSkooIspFromTmbiTmbtwnNsDriver for main usage
  358.  
  359.   -- MaxPointingChangeWeCallStable is the maximum degrees of change in heading + pitch
  360.  
  361.   --   we'll call "stable" for purposes of detecting when mechjeb.attitudeTo() is done
  362.  
  363.   --   i.e. 0.2 means 2/10ths of a degree change during TimeBetweenEach seconds
  364.  
  365.   -- This is a wrapper that circularizes our orbit, verifies
  366.  
  367.   --   a stable orbit, orients prograde, and then runs the Isp test
  368.  
  369.  
  370.  
  371.   -- REQUIRES globalSomMainBodyReset to have been called properly
  372.  
  373.   --   the simple way is to run globalSkomKSPMainBodyResetBasedOnGuessing() first!
  374.  
  375.  
  376.  
  377.   -- First, let's reset our main body; perhaps we've switch orbits recently!
  378.  
  379.   globalSkomKSPMainBodyResetBasedOnGuessing()
  380.  
  381.  
  382.  
  383.   -- Now, circularize, just in case.  Wait in TimeBetweenEach increments.
  384.  
  385.   print "Circularizing"
  386.  
  387.   mechjeb.circularize()
  388.  
  389.   while mechjeb.busy() == true do
  390.  
  391.     wait(TimeBetweenEach)
  392.  
  393.   end -- while mechjeb.busy() == true do
  394.  
  395.  
  396.  
  397.   print "Are We Stable"
  398.  
  399.   -- if we're in a stable orbit, continue
  400.  
  401.   if isSkomCurrentOrbitStable() ~= 0 then
  402.  
  403.     print "WARNING: Orbit not stable!  Test may be inaccurate and/or result in destruction of your vessel."
  404.  
  405.   end -- if isSkomCurrentOrbitStable() ~= 0 then
  406.  
  407.  
  408.  
  409.   -- WARNING:  The edge case of switching orbiting main bodies during the test run
  410.  
  411.   --   is NOT HANDLED, and will generate bogus results.
  412.  
  413.   --   It may also have the side effect of killing your crew.
  414.  
  415.  
  416.  
  417.   print "Prograde"
  418.  
  419.   mechjeb.attitudeTo("forward","ORBIT")
  420.  
  421.   -- Ok, we've asked mechjeb to point us prograde... but are we done pointing yet?
  422.  
  423.   --   mechjeb.busy() will stay true until mechjeb.controlRelease() is called.
  424.  
  425.   -- We're going to do a cheap hack here - if our heading or pitch is changing "too fast"
  426.  
  427.   --   keep waiting until it changes "slower".
  428.  
  429.  
  430.  
  431.   -- v0.002 NOTE: These _should_ be locals; however, in that case, they don't appear to update in the while loop.
  432.  
  433.   --   Therefore, we're going to use distinctive, function-specific names to avoid side effect with other functions.
  434.  
  435.   globalHdPrev_testSkooIspFromTmbiTmbtwnNsMpcsDriver = vessel.vesselHeading
  436.  
  437.   globalPiPrev_testSkooIspFromTmbiTmbtwnNsMpcsDriver = vessel.vesselPitch
  438.  
  439.   print "Before initial wait for prograde test"
  440.  
  441.   wait(TimeBetweenEach)
  442.  
  443.   print "After initial wait for prograde test, waiting on prograde completion"
  444.  
  445.   print "  If the thrusters don't fire on their own, click PRO GRAD on Smart A.S.S. and try a larger MaxPointingChangeStable next time"
  446.  
  447.   --print ("gt " .. (while1 > while2))
  448.  
  449.   -- If the sum of the changes in heading and pitch is over our threshold, let's keep waiting.
  450.  
  451.   while (((math.abs(vessel.vesselHeading - globalHdPrev_testSkooIspFromTmbiTmbtwnNsMpcsDriver) + math.abs(vessel.vesselPitch - globalPiPrev_testSkooIspFromTmbiTmbtwnNsMpcsDriver))) >= MaxPointingChangeStable) do
  452.  
  453.     globalHdPrev_testSkooIspFromTmbiTmbtwnNsMpcsDriver = vessel.vesselHeading
  454.  
  455.     globalPiPrev_testSkooIspFromTmbiTmbtwnNsMpcsDriver = vessel.vesselPitch
  456.  
  457.     wait(TimeBetweenEach)
  458.  
  459.   end
  460.  
  461.   -- one last wait, just to make sure we've settled out as best we can.
  462.  
  463.   wait(TimeBetweenEach)
  464.  
  465.   print "Prograde settled; initiating test measurements."
  466.  
  467.   -- Now, mechjeb should be holding us Prograde in a circular orbit, and we can start our timing measurements.
  468.  
  469.   --   These just print out to the console currently, as getting data out of coroutines is a pain.
  470.  
  471.   measureSkooIspFromTmbiTmbtwnNsDriver(TimeBeforeInitial, TimeBetweenEach, NumberSlices)
  472.  
  473.  
  474.  
  475.   -- Release the .attitudeTo hold we've put on the craft.
  476.  
  477.   mechjeb.controlRelease()
  478.  
  479. end
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487. function cotestSkooIspFromTmbiTmbtwnNs(TimeBeforeInitial, TimeBetweenEach, NumberSlices)
  488.  
  489.   -- added in v0.002
  490.  
  491.   -- IF YOU USE THIS, START IN A CIRCULAR ORBIT, WITH SMART A.S.S. set to Prograde!!!
  492.  
  493.   -- Part of initial development.
  494.  
  495.   local coMeasure = coroutine.create(measureSkooIspFromTmbiTmbtwnNsDriver)
  496.  
  497.   coroutine.resume(coMeasure, TimeBeforeInitial, TimeBetweenEach, NumberSlices)
  498.  
  499. end
  500.  
  501.  
  502.  
  503. function cotestSkooIspFromTmbiTmbtwnNsMpcs(TimeBeforeInitial, TimeBetweenEach, NumberSlices, MaxPointingChangeStable)
  504.  
  505.   -- added in v0.002
  506.  
  507.   --[[ ex.
  508.  
  509.     cotestSkooIspFromTmbiTmbtwnNsMpcs(0.25, 0.25, 2, 0.02)
  510.  
  511.   ]]
  512.  
  513.  
  514.  
  515.   local coTest = coroutine.create(testSkooIspFromTmbiTmbtwnNsMpcsDriver)
  516.  
  517.   coroutine.resume(coTest, TimeBeforeInitial, TimeBetweenEach, NumberSlices, MaxPointingChangeStable)
  518.  
  519. end
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527. function helpSkooSimpleKSPOrbitalOperations1()
  528.  
  529.   print "Usage: colaunchSkooMolniyaFromIncMoe(Inclination, MarginOfError)"
  530.  
  531.   print "   If you're currently landed in launch position, this will either launch you into a Molniya orbit, or"
  532.  
  533.   print "   give you a message stating that no stable Molniya orbit exists for this body and Margin of Error."
  534.  
  535.   print "   Inclination should be 63.4, -63.4, 116.6, or -116.6 degrees"
  536.  
  537.   print "   Inclination is the desired orbital inclination in degrees, and should be 63.4, -63.4, 116.6, or -116.6 degrees"
  538.  
  539.   print "     to correctly counteract the gravitational effect of an oblate body, like Earth's fat equatorial bulge"
  540.  
  541.   print "   MarginOfError 0.001 means allow 0.1% for a \"safety zone\" above the minimum stable altitude, or below the Hill sphere of influence."
  542.  
  543.   print "     Do this if you want to just barely scrape by!"
  544.  
  545.   print "     2 means allow a 200% \"safety zone\" above the minimum stable altitude, or below the Hill sphere of influence."
  546.  
  547.   print "     Do this if you want to have a much less eccentric orbit - perhaps you want to keep certain orbits clear for other uses!"
  548.  
  549.   print "     If in doubt, try setting MarginOfError to 0.1"
  550.  
  551.   print "   Ex: "
  552.  
  553.   print "     colaunchSkooMolniyaFromIncMoe(-63.4, 0.01)"
  554.  
  555.   print "   REQUIRES globalSomMainBodyReset to have been called properly"
  556.  
  557.   print "     the simple way is to run globalSkomKSPMainBodyResetBasedOnGuessing() first!"
  558.  
  559.   print "Usage: colaunchSkooFromApPeInc(Ap, Pe, Inclination)"
  560.  
  561.   print "   Ap is the Apoapsis in meters"
  562.  
  563.   print "   Pe is the Periapsis in meters"
  564.  
  565.   print "   Inclination is the desired orbital inclination in degrees"
  566.  
  567.   print "   Ex: 125km circular orbit, 0 degree inclination"
  568.  
  569.   print "     colaunchSkooFromApPeInc(125000, 125000, 0)"
  570.  
  571.   print "   REQUIRES globalSomMainBodyReset to have been called properly"
  572.  
  573.   print "     the simple way is to run globalSkomKSPMainBodyResetBasedOnGuessing() first!"
  574.  
  575. end
  576.  
  577.  
  578.  
  579. function helpSkooSimpleKSPOrbitalOperations2()
  580.  
  581.   print "Usage: cotestSkooIspFromTmbiTmbtwnNsMpcs(TimeBeforeInitial, TimeBetweenEach, NumberSlices, MaxPointingChangeStable)"
  582.  
  583.   print "   TimeBeforeInitial is the \"spool up\" delay in seconds we're going to use"
  584.  
  585.   print "     this is how much time we think it takes our engines to come to stable thrust"
  586.  
  587.   print "     i.e. 0.5 means set thrust to the desired value, then wait half a second, then start the measurement for this \"slice\""
  588.  
  589.   print "     For the bell rocket engines in 0.16, 0.25 is a reasonable minimum for TimeBeforeInitial"
  590.  
  591.   print "   TimeBetweenEach is the time in seconds between initial and final measurements for each \"slice\""
  592.  
  593.   print "     For the bell rocket engines in 0.16, 0.25 is a reasonable minimum for TimeBetweenEach"
  594.  
  595.   print "   NumberSlices is how many slices we're going to divide our thrust into, i.e."
  596.  
  597.   print "     1 means 100 (100% max thrust) / 1 = one test at 100%."
  598.  
  599.   print "     2 means 100/2 = 50% for the first test, and 100% for the second."
  600.  
  601.   print "     4 means 100/4 = 25% for the first test, 50% for the second, 75% for the third, and 100% for the fourth."
  602.  
  603.   print "   MaxPointingChangeWeCallStable is the maximum degrees of change in heading + pitch"
  604.  
  605.   print "     we'll call \"stable\" for purposes of detecting when mechjeb.attitudeTo() is done"
  606.  
  607.   print "     i.e. 0.2 means 2/10ths of a degree change during TimeBetweenEach seconds"
  608.  
  609.   print "   Ex: one half second spool up and measurements, at 50% and 100% thrust, with 0.04 degrees per second change = \"stable\""
  610.  
  611.   print "     cotestSkooIspFromTmbiTmbtwnNsMpcs(0.5, 0.5, 2, 0.02)"
  612.  
  613. end
  614.  
  615.  
  616.  
  617.  
  618.  
  619. print "Usage: helpSkooSimpleKSPOrbitalOperations1() through helpSkooSimpleKSPOrbitalOperations2()"
  620.  
  621. print "   gives detailed help on all Skoo functions."
  622.  
  623. print "   Skoo functions relate to Kerbal Space Program (KSP) operational functionality."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement