Skip to content

Instantly share code, notes, and snippets.

@embix
Created January 5, 2018 01:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save embix/0684439760ec675198ad2c5060494037 to your computer and use it in GitHub Desktop.
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)
// 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