Advertisement
Guest User

Untitled

a guest
Nov 25th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.05 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net;
  4. using System.Timers;
  5. using KRPC.Client;
  6. using KRPC.Client.Services.SpaceCenter;
  7.  
  8. class Program
  9. {
  10.     public static void Main ()
  11.     {
  12.         //var conn = new Connection ("Ares-Raptor");
  13.         var conn = new Connection(
  14.                    name: "Ares-Raptor",
  15.                    address: IPAddress.Parse("127.0.0.1"),
  16.                    rpcPort: 5000,
  17.                    streamPort: 5001);
  18.         var vessel = conn.SpaceCenter ().ActiveVessel;
  19.  
  20.         float turnStartAltitude = 500;
  21.         float turnEndAltitude = 200000;
  22.         float targetAltitude = 650000;
  23.         float targetazimuth = 51;
  24.  
  25.         // Set up streams for telemetry
  26.         var ut = conn.AddStream (() => conn.SpaceCenter ().UT);
  27.         var flight = vessel.Flight ();
  28.         var altitude = conn.AddStream (() => flight.MeanAltitude);
  29.         var apoapsis = conn.AddStream (() => vessel.Orbit.ApoapsisAltitude);
  30.         var stage1Resources =
  31.             vessel.ResourcesInDecoupleStage (stage: -1, cumulative: false);
  32.         var boosterfuel  = conn.AddStream(() => stage1Resources.Amount("Kerosene"));
  33.         // Pre-launch setup
  34.         vessel.Control.SAS = true;
  35.         vessel.Control.RCS = false;
  36.         vessel.Control.Throttle = 1;
  37.  
  38.         // Countdown...
  39.         Console.WriteLine ("3...");
  40.         System.Threading.Thread.Sleep (1000);
  41.         Console.WriteLine ("2...");
  42.         System.Threading.Thread.Sleep (1000);
  43.         Console.WriteLine ("1...");
  44.         System.Threading.Thread.Sleep (1000);
  45.         Console.WriteLine ("Launch!");
  46.                 // Activate the first stage
  47.  
  48.         vessel.Control.ActivateNextStage ();
  49.         System.Threading.Thread.Sleep (5500);
  50.         vessel.Control.ActivateNextStage ();
  51.         vessel.AutoPilot.Engage ();
  52.         vessel.AutoPilot.TargetPitchAndHeading (90, 90);
  53.  
  54.         double turnAngle = 0;
  55.         bool stage1sep = false;
  56.  
  57.         while (true) {
  58.  
  59.             // Gravity turn
  60.             if (altitude.Get () > turnStartAltitude && altitude.Get () < turnEndAltitude) {
  61.                 double frac = (altitude.Get () - turnStartAltitude) / (turnEndAltitude - turnStartAltitude);
  62.                 double newpitchangle = frac * 90.0;
  63.                 if (Math.Abs (newpitchangle - turnAngle) > 0.5) {
  64.                     turnAngle = newpitchangle;
  65.                     vessel.AutoPilot.TargetPitchAndHeading (
  66.                         (float)(90 - turnAngle), targetazimuth);
  67.                 }
  68.             }
  69.  
  70.                         // Separate SRBs when finished
  71.             if (!stage1sep) {
  72.          //       Console.WriteLine(boosterfuel.Get());
  73.                 if (boosterfuel.Get () < 10) {
  74.                     vessel.Control.ActivateNextStage ();
  75.                     stage1sep = true;
  76.                     Console.WriteLine ("Stage 1 separated");
  77.                     System.Threading.Thread.Sleep (1000);
  78.                     Console.WriteLine ("Stage 2 Ignition");
  79.                 }
  80.             }
  81.  
  82.             // Decrease throttle when approaching target apoapsis
  83.             if (altitude.Get() > 240000) {
  84.  
  85.                 Console.WriteLine ("Approaching target apoapsis");
  86.                 vessel.Control.ToggleActionGroup(1);
  87.                 vessel.AutoPilot.TargetPitchAndHeading (10, targetazimuth);
  88.                 // Disable engines when target apoapsis is reached
  89.                 vessel.Control.Throttle = 1;
  90.                 while (apoapsis.Get () < targetAltitude) {
  91.                 }
  92.                 Console.WriteLine ("Target apoapsis reached");
  93.                 vessel.Control.Throttle = 0;
  94.                 break;
  95.             }
  96.         }
  97.  
  98.  
  99.  
  100.         // Wait until out of atmosphere
  101.         Console.WriteLine ("Coasting out of atmosphere");
  102.         while (altitude.Get () < 70500) {
  103.         }
  104.                 // Plan circularization burn (using vis-viva equation)
  105.         Console.WriteLine ("Planning circularization burn");
  106.         double mu = vessel.Orbit.Body.GravitationalParameter;
  107.         double r = vessel.Orbit.Apoapsis;
  108.         double a1 = vessel.Orbit.SemiMajorAxis;
  109.         double a2 = r;
  110.         double v1 = Math.Sqrt (mu * ((2.0 / r) - (1.0 / a1)));
  111.         double v2 = Math.Sqrt (mu * ((2.0 / r) - (1.0 / a2)));
  112.         double deltaV = v2 - v1;
  113.         var node = vessel.Control.AddNode (
  114.             ut.Get () + vessel.Orbit.TimeToApoapsis, prograde: (float)deltaV);
  115.  
  116.         // Calculate burn time (using rocket equation)
  117.         double F = vessel.AvailableThrust;
  118.         double Isp = vessel.SpecificImpulse * 9.82;
  119.         double m0 = vessel.Mass;
  120.         double m1 = m0 / Math.Exp (deltaV / Isp);
  121.         double flowRate = F / Isp;
  122.         double burnTime = (m0 - m1) / flowRate;
  123.                 // Orientate ship
  124.         Console.WriteLine ("Orientating ship for circularization burn");
  125.         vessel.AutoPilot.ReferenceFrame = node.ReferenceFrame;
  126.         vessel.AutoPilot.TargetDirection = Tuple.Create (0.0, 1.0, 0.0);
  127.         vessel.AutoPilot.Wait ();
  128.  
  129.         // Wait until burn
  130.         Console.WriteLine ("Waiting until circularization burn");
  131.         double burnUT = ut.Get () + vessel.Orbit.TimeToApoapsis - (burnTime / 2.0);
  132.         double leadTime = 5;
  133.         conn.SpaceCenter ().WarpTo (burnUT - leadTime);
  134.                 // Execute burn
  135.         Console.WriteLine ("Ready to execute burn");
  136.         var timeToApoapsis = conn.AddStream (() => vessel.Orbit.TimeToApoapsis);
  137.         while (timeToApoapsis.Get () - (burnTime / 2.0) > 0) {
  138.         }
  139.         Console.WriteLine ("Executing burn");
  140.         vessel.Control.Throttle = 1;
  141.         System.Threading.Thread.Sleep ((int)((burnTime - 0.1) * 1000));
  142.         Console.WriteLine ("Fine tuning");
  143.         vessel.Control.Throttle = 0.05f;
  144.         var remainingBurn = conn.AddStream (
  145.             () => node.RemainingBurnVector (node.ReferenceFrame));
  146.         while (remainingBurn.Get ().Item1 > 0) {
  147.         }
  148.         vessel.Control.Throttle = 0;
  149.         node.Remove ();
  150.  
  151.         Console.WriteLine ("Launch complete");
  152.         conn.Dispose();
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement