示例#1
0
        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);
        }
示例#2
0
 public Flight Flight(ReferenceFrame referenceFrame = null)
 {
     if (referenceFrame == null)
     {
         referenceFrame = ReferenceFrame.Surface(InternalVessel);
     }
     return(new Flight(InternalVessel, referenceFrame));
 }
示例#3
0
        public Flight Flight(ReferenceFrame referenceFrame = null)
        {
            var vessel = InternalVessel;

            if (ReferenceEquals(referenceFrame, null))
            {
                referenceFrame = ReferenceFrame.Surface(vessel);
            }
            return(new Flight(vessel, referenceFrame));
        }
示例#4
0
        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);
        }
示例#5
0
 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;
 }
示例#6
0
        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");
        }