Created
January 5, 2018 01:10
-
-
Save embix/0684439760ec675198ad2c5060494037 to your computer and use it in GitHub Desktop.
try suborbital flight in KSP controlled via kRPC, tested in LINQPad with GDLV3 (Stock)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// fetch Google.Protobuf and KRPC.Client from nuget gallery | |
// namespace imports: | |
//KRPC.Client | |
//KRPC.Client.Services.SpaceCenter | |
//System | |
// removed due to ambiguity with linq expressions: KRPC.Client.Services.KRPC | |
// based on https://krpc.github.io/krpc/tutorials/suborbital-flight.html, LGPL | |
class SubOrbitalFlight | |
{ | |
public static readonly System.Net.IPAddress kspKrpcServer = System.Net.IPAddress.Parse("ipv4/ipv6 of machine running ksp"); | |
public static void Main() | |
{ | |
using (var conn = new Connection("kspRpcSpike", kspKrpcServer))// use default port | |
{ | |
var vessel = conn.SpaceCenter().ActiveVessel; | |
vessel.AutoPilot.TargetPitchAndHeading(90, 90); | |
vessel.AutoPilot.Engage(); | |
vessel.Control.Throttle = 1; | |
System.Threading.Thread.Sleep(1000); | |
Console.WriteLine("Launch!"); | |
vessel.Control.ActivateNextStage(); | |
{ | |
var solidFuel = Connection.GetCall(() => vessel.Resources.Amount("SolidFuel")); | |
var expr = KRPC.Client.Services.KRPC.Expression.LessThan( | |
conn, | |
KRPC.Client.Services.KRPC.Expression.Call(conn, solidFuel), | |
KRPC.Client.Services.KRPC.Expression.ConstantFloat(conn, 0.1f) | |
); | |
var evnt = conn.KRPC().AddEvent(expr); | |
lock (evnt.Condition) | |
{ | |
evnt.Wait(); | |
} | |
} | |
Console.WriteLine("Booster separation"); | |
vessel.Control.ActivateNextStage(); | |
{ | |
var meanAltitude = Connection.GetCall(() => vessel.Flight(null).MeanAltitude); | |
var expr = KRPC.Client.Services.KRPC.Expression.GreaterThan( | |
conn, | |
KRPC.Client.Services.KRPC.Expression.Call(conn, meanAltitude), | |
KRPC.Client.Services.KRPC.Expression.ConstantDouble(conn, 10000) | |
); | |
var evnt = conn.KRPC().AddEvent(expr); | |
lock (evnt.Condition) | |
{ | |
evnt.Wait(); | |
} | |
} | |
Console.WriteLine("Gravity turn"); | |
vessel.AutoPilot.TargetPitchAndHeading(60, 90); | |
{ | |
var apoapsisAltitude = Connection.GetCall(() => vessel.Orbit.ApoapsisAltitude); | |
var expr = KRPC.Client.Services.KRPC.Expression.GreaterThan( | |
conn, | |
KRPC.Client.Services.KRPC.Expression.Call(conn, apoapsisAltitude), | |
KRPC.Client.Services.KRPC.Expression.ConstantDouble(conn, 100000) | |
); | |
var evnt = conn.KRPC().AddEvent(expr); | |
lock (evnt.Condition) | |
{ | |
evnt.Wait(); | |
} | |
} | |
Console.WriteLine("Launch stage separation"); | |
vessel.Control.Throttle = 0; | |
System.Threading.Thread.Sleep(1000); | |
vessel.Control.ActivateNextStage(); | |
vessel.AutoPilot.Disengage(); | |
{ | |
var srfAltitude = Connection.GetCall(() => vessel.Flight(null).SurfaceAltitude); | |
var expr = KRPC.Client.Services.KRPC.Expression.LessThan( | |
conn, | |
KRPC.Client.Services.KRPC.Expression.Call(conn, srfAltitude), | |
KRPC.Client.Services.KRPC.Expression.ConstantDouble(conn, 1000)); | |
var evnt = conn.KRPC().AddEvent(expr); | |
lock (evnt.Condition) | |
{ | |
evnt.Wait(); | |
} | |
} | |
vessel.Control.ActivateNextStage(); | |
while (vessel.Flight(vessel.Orbit.Body.ReferenceFrame).VerticalSpeed < -0.1) | |
{ | |
Console.WriteLine("Altitude = {0:F1} meters", vessel.Flight().SurfaceAltitude); | |
System.Threading.Thread.Sleep(1000); | |
} | |
Console.WriteLine("Landed!"); | |
//autodispose since where in a using-environment: conn.Dispose(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment