internal static bool Fly(global::Vessel vessel, PilotAddon.ControlInputs state) { // Get the auto-pilot object. Do nothing if there is no auto-pilot engaged for this vessel. if (!engaged.ContainsKey(vessel.id)) { return(false); } var autoPilot = engaged [vessel.id]; if (autoPilot == null) { return(false); } // If the client that engaged the auto-pilot has disconnected, disengage and reset the auto-pilot if (autoPilot.requestingClient != null && !autoPilot.requestingClient.Connected) { autoPilot.attitudeController.ReferenceFrame = ReferenceFrame.Surface(vessel); autoPilot.attitudeController.TargetPitch = 0; autoPilot.attitudeController.TargetHeading = 0; autoPilot.attitudeController.TargetRoll = double.NaN; autoPilot.Disengage(); return(false); } // Run the auto-pilot autoPilot.SAS = false; autoPilot.attitudeController.Update(state); return(true); }
public Flight Flight(ReferenceFrame referenceFrame = null) { if (referenceFrame == null) { referenceFrame = ReferenceFrame.Surface(InternalVessel); } return(new Flight(InternalVessel, referenceFrame)); }
public Flight Flight(ReferenceFrame referenceFrame = null) { var vessel = InternalVessel; if (ReferenceEquals(referenceFrame, null)) { referenceFrame = ReferenceFrame.Surface(vessel); } return(new Flight(vessel, referenceFrame)); }
internal static bool Fly(global::Vessel vessel, PilotAddon.ControlInputs state) { // Get the auto-pilot object. Do nothing if there is no auto-pilot engaged for this vessel. if (!engaged.ContainsKey(vessel.id)) { return(false); } var autoPilot = engaged [vessel.id]; if (autoPilot == null) { return(false); } // If the client that engaged the auto-pilot has disconnected, disengage and reset the auto-pilot if (autoPilot.requestingClient != null && !autoPilot.requestingClient.Connected) { autoPilot.attitudeController.ReferenceFrame = ReferenceFrame.Surface(vessel); autoPilot.attitudeController.TargetPitch = 0; autoPilot.attitudeController.TargetHeading = 0; autoPilot.attitudeController.TargetRoll = double.NaN; autoPilot.Disengage(); return(false); } //auto shutdown engine if (autoPilot.Speed > autoPilot.ShutdownSpeed) { autoPilot.vessel.Control.Throttle = 0.0f; state.Throttle = 0.0f; autoPilot.maxAcc = -1.0d; } if (autoPilot.maxAcc >= 0) { double deltaTime = Time.fixedDeltaTime; if (deltaTime > 0.01) { double acc = autoPilot.vessel.Thrust / autoPilot.vessel.Mass; float throttle = 1.0f + (float)autoPilot.throttleController.Update(autoPilot.maxAcc, acc, deltaTime); state.Throttle = throttle.Clamp(0.01f, 1.0f); } } // Run the auto-pilot autoPilot.SAS = false; autoPilot.attitudeController.Update(state); return(true); }
internal AutoPilot(global::Vessel vessel) { if (!engaged.ContainsKey(vessel.id)) { engaged [vessel.id] = null; } vesselId = vessel.id; rotationRateController = new RotationRateController(vessel); ReferenceFrame = ReferenceFrame.Surface(vessel); TargetDirection = null; TargetRoll = float.NaN; RotationSpeedMultiplier = 1f; RollSpeedMultiplier = 1f; MaxRollSpeed = 1f; MaxRotationSpeed = 1f; }
Vector3d SASTargetDirection() { var vessel = InternalVessel; var sasMode = SASMode; // Stability assist if (sasMode == SASMode.StabilityAssist) { throw new InvalidOperationException("No target direction in stability assist mode"); } // Maneuver node if (sasMode == SASMode.Maneuver) { if (vessel.patchedConicSolver.maneuverNodes.Count == 0) { throw new InvalidOperationException("No maneuver node"); } var nextNode = vessel.patchedConicSolver.maneuverNodes [0]; foreach (var node in vessel.patchedConicSolver.maneuverNodes) { if (node.UT < nextNode.UT) { nextNode = node; } } return(new Node(vessel, nextNode).WorldBurnVector); } // Orbital directions, in different speed modes if (sasMode == SASMode.Prograde || sasMode == SASMode.Retrograde || sasMode == SASMode.Normal || sasMode == SASMode.AntiNormal || sasMode == SASMode.Radial || sasMode == SASMode.AntiRadial) { if (Control.GlobalSpeedMode == SpeedMode.Orbit) { switch (sasMode) { case SASMode.Prograde: return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.up)); case SASMode.Retrograde: return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.down)); case SASMode.Normal: return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.forward)); case SASMode.AntiNormal: return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.back)); case SASMode.Radial: return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.left)); case SASMode.AntiRadial: return(ReferenceFrame.Orbital(vessel).DirectionToWorldSpace(Vector3d.right)); } } else if (Control.GlobalSpeedMode == SpeedMode.Surface) { switch (sasMode) { case SASMode.Prograde: return(ReferenceFrame.SurfaceVelocity(vessel).DirectionToWorldSpace(Vector3d.up)); case SASMode.Retrograde: return(ReferenceFrame.SurfaceVelocity(vessel).DirectionToWorldSpace(Vector3d.down)); case SASMode.Normal: return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.up)); case SASMode.AntiNormal: return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.down)); case SASMode.Radial: return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.right)); case SASMode.AntiRadial: return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.left)); } } else if (Control.GlobalSpeedMode == SpeedMode.Target) { switch (sasMode) { case SASMode.Prograde: return(vessel.GetWorldVelocity() - FlightGlobals.fetch.VesselTarget.GetWorldVelocity()); case SASMode.Retrograde: return(FlightGlobals.fetch.VesselTarget.GetWorldVelocity() - vessel.GetWorldVelocity()); case SASMode.Normal: return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.up)); case SASMode.AntiNormal: return(ReferenceFrame.Object(vessel.orbit.referenceBody).DirectionToWorldSpace(Vector3d.down)); case SASMode.Radial: return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.right)); case SASMode.AntiRadial: return(ReferenceFrame.Surface(vessel).DirectionToWorldSpace(Vector3d.left)); } } throw new InvalidOperationException("Unknown speed mode for orbital direction"); } // Target and anti-target if (sasMode == SASMode.Target || sasMode == SASMode.AntiTarget) { var target = FlightGlobals.fetch.VesselTarget; if (target == null) { throw new InvalidOperationException("No target"); } var direction = target.GetWorldPosition() - vessel.GetWorldPos3D(); if (sasMode == SASMode.AntiTarget) { direction *= -1; } return(direction); } throw new InvalidOperationException("Unknown SAS mode"); }