public static void Launch( string vessel_name, CommonData common_data, Connection connection, Service space_center, Vessel vessel, double apoapsis) { KrpcAutoPilot.Control control = new KrpcAutoPilot.Control(vessel_name, common_data, connection, space_center, vessel); control.UpdateData(); control.Engage(); vessel.Control.RCS = false; while (true) { if (!control.UpdateData()) { break; } if (control.LaunchIntoApoapsis(apoapsis, 0d)) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } control.LaunchIntoPeriapsisInit(); while (true) { if (!control.UpdateData()) { break; } if (control.LaunchIntoPeriapsis(apoapsis)) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } control.DisEngage(); control.Dispose(); }
public static void Hover( string vessel_name, CommonData common_data, Connection connection, Service space_center, Vessel vessel, double tar_altitude, Vector3d tar_pos = null, KrpcAutoPilot.Control.RcsLayout rcs_layout = KrpcAutoPilot.Control.RcsLayout.TOP) { KrpcAutoPilot.Control control = new KrpcAutoPilot.Control(vessel_name, common_data, connection, space_center, vessel); control.UpdateData(); control.Engage(); vessel.Control.RCS = true; while (true) { if (!control.UpdateData()) { break; } if (control.Hover(tar_altitude, tar_pos, rcs_layout)) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } control.DisEngage(); control.Dispose(); }
public void Start( string vessel_name, string port_tag, string control_node_tag, double distance) { bool running = true; Connection conn = new Connection( name: "My Example Program", address: IPAddress.Parse("127.0.0.1"), rpcPort: 50000, streamPort: 50001); Service sc = conn.SpaceCenter(); Vessel vessel = sc.ActiveVessel; Orbit orbit = vessel.Orbit; CelestialBody body = orbit.Body; KrpcAutoPilot.CommonData common_data = new KrpcAutoPilot.CommonData(conn, sc, body); Thread common_data_thread = new Thread(() => { while (running) { if (!common_data.Update()) { break; } Thread.Sleep(100); } common_data.Dispose(); }); common_data_thread.Start(); KrpcAutoPilot.Control control = new KrpcAutoPilot.Control("1", common_data, conn, sc, vessel); control.UpdateData(); control.ApproachInit( ship_name: vessel_name, dock_tag: port_tag, control_node_tag: control_node_tag, distance: distance); Thread approach_thread = new Thread(() => { while (true) { control.UpdateData(); if (control.Approach(out _) == KrpcAutoPilot.Control.Status.FINISHED) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } }); approach_thread.Start(); approach_thread.Join(); control.ApproachDeinit(); running = false; common_data_thread.Join(); conn.Dispose(); }
public void Start( double tar_altitude, double landing_min_velocity) { bool running = true; Connection conn = new Connection( name: "My Example Program", address: IPAddress.Parse("127.0.0.1"), rpcPort: 50000, streamPort: 50001); Service sc = conn.SpaceCenter(); Vessel vessel = sc.ActiveVessel; Orbit orbit = vessel.Orbit; CelestialBody body = orbit.Body; KrpcAutoPilot.CommonData common_data = new KrpcAutoPilot.CommonData(conn, sc, body); Thread common_data_thread = new Thread(() => { while (running) { if (!common_data.Update()) { break; } Thread.Sleep(100); } common_data.Dispose(); }); common_data_thread.Start(); KrpcAutoPilot.Control control = new KrpcAutoPilot.Control("1", common_data, conn, sc, vessel); Thread recycle_thread = new Thread(() => { LandingAdjustBurnStatus landingAdjustBurnStatusMain = LandingAdjustBurnStatus.UNAVAILABEL; bool landingAdjustBurnMain = true; VesselControl.Recycle( vessel_name: "MAIN", common_data: common_data, connection: conn, space_center: sc, vessel: vessel, rcs_layout: KrpcAutoPilot.Control.RcsLayout.SYMMETRICAL, tar_pos: new Vector3d(body.PositionAtAltitude( KrpcAutoPilot.Constants.Position.KERBAL_CENTER_LAUNCH_PAD.Lat, KrpcAutoPilot.Constants.Position.KERBAL_CENTER_LAUNCH_PAD.Lng, tar_altitude, body.ReferenceFrame)), tar_altitude: tar_altitude, landing_min_velocity: landing_min_velocity, heading: 0d, landing_adjust_burn_status: ref landingAdjustBurnStatusMain, landing_adjust_could_burn: ref landingAdjustBurnMain); }); recycle_thread.Start(); recycle_thread.Join(); running = false; common_data_thread.Join(); conn.Dispose(); }
public static void LaunchAndDocking( string vessel_name, CommonData common_data, Connection connection, Service space_center, Vessel vessel, double apoapsis, string target_vessel_name, string target_port_tag, string control_node_tag, ref bool force_docking) { KrpcAutoPilot.Control control = new KrpcAutoPilot.Control(vessel_name, common_data, connection, space_center, vessel); control.UpdateData(); control.Engage(); vessel.Control.RCS = false; while (!force_docking) { if (!control.UpdateData()) { break; } if (control.LaunchIntoApoapsis(apoapsis, 0d)) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } vessel.Control.RCS = true; control.LaunchIntoPeriapsisInit(); SwitchRcsEngines(vessel, true); bool fairing_separated = false; while (!force_docking) { if (!control.UpdateData()) { break; } if (control.LaunchIntoPeriapsis(apoapsis)) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } if (!fairing_separated && (!common_data.Body.HasAtmosphere || control.State.Vessel.Altitude > common_data.Body.AtmosphereDepth)) { fairing_separated = true; try { vessel.Control.ActivateNextStage(); } catch (Exception) { break; } } Thread.Sleep(100); } control.ApproachInit( ship_name: target_vessel_name, dock_tag: target_port_tag, control_node_tag: control_node_tag); bool shroud_opened = false; while (true) { if (!control.UpdateData()) { break; } double distance; if (control.Approach(out distance) == KrpcAutoPilot.Control.Status.FINISHED) { break; } if (!shroud_opened && distance < 20d) { shroud_opened = true; vessel.Control.ToggleActionGroup(2); } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } control.DisEngage(); control.Dispose(); }
public static void Recycle( string vessel_name, CommonData common_data, Connection connection, Service space_center, Vessel vessel, KrpcAutoPilot.Control.RcsLayout rcs_layout, Vector3d tar_pos, double tar_altitude, double landing_min_velocity, double heading, ref KrpcAutoPilot.Control.LandingAdjustBurnStatus landing_adjust_burn_status, ref bool landing_adjust_could_burn) { KrpcAutoPilot.Control control = new KrpcAutoPilot.Control(vessel_name, common_data, connection, space_center, vessel); control.UpdateData(); control.Command.SetHeadingAngle(Math.PI); control.Engage(); SwitchRcsEngines(vessel, true); vessel.Control.RCS = true; vessel.Control.Brakes = true; SwitchEngineMode(vessel); Thread.Sleep(1000); control.Trajectory.ReCacheAvailableThrust(); SwitchEngineMode(vessel); Console.WriteLine("Landing init"); control.LandingInit(tar_altitude, landing_min_velocity); Console.WriteLine("Adjust landing position"); while (true) { if (!control.UpdateData()) { break; } landing_adjust_burn_status = control.AdjustLandingPosition(tar_pos, tar_altitude, landing_adjust_could_burn); if (landing_adjust_burn_status == KrpcAutoPilot.Control.LandingAdjustBurnStatus.FINISHED) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } SwitchEngineMode(vessel); while (true) { if (!control.UpdateData()) { break; } if (control.Landing(tar_pos, tar_altitude, rcs_layout, 5d, heading)) { break; } if (control.Execute() == KrpcAutoPilot.Control.Status.FAIL) { break; } Thread.Sleep(100); } control.DisEngage(); control.Dispose(); vessel.Control.Brakes = false; landing_adjust_burn_status = KrpcAutoPilot.Control.LandingAdjustBurnStatus.ABANDON; }