예제 #1
0
        void setCtrlState(SASList ID, double error, double rate, ref float axisCtrlState)
        {
            PIDmode mode = PIDmode.PID;

            if (!vesModule.vesselRef.checkLanded() && vesModule.vesselRef.IsControllable)
            {
                mode = PIDmode.PD; // no integral when it can't do anything useful
            }
            if (allowControl(ID))
            {
                axisCtrlState = ID.GetSAS(this).ResponseF(error, rate, mode);
            }
            else if (!Utils.hasInput(ID))
            {
                axisCtrlState = 0; // kill off stock SAS inputs
            }
            // nothing happens if player input is present
        }
        public virtual double ResponseD(double error, double rate, PIDmode mode)
        {
            if (invertInput)
            {
                error *= -1;
                rate *= -1;
            }

            double res_d = 0, res_i = 0, res_p = 0;
            res_d = derivativeError(rate);
            if (mode == PIDmode.PID)
                res_i = integralError(error, true);
            if (mode == PIDmode.PD || mode == PIDmode.PID)
                res_p = proportionalError(error);

            lastOutput = (invertOutput ? -1 : 1) * Utils.Clamp(res_p + res_i + res_d, OutMin, OutMax);
            return lastOutput;
        }
예제 #3
0
        public virtual double ResponseD(double error, double rate, PIDmode mode)
        {
            if (invertInput)
            {
                error *= -1;
                rate  *= -1;
            }

            double res_d = 0, res_i = 0, res_p = 0;

            res_d = derivativeError(rate);
            if (mode == PIDmode.PID)
            {
                res_i = integralError(error, true);
            }
            if (mode == PIDmode.PD || mode == PIDmode.PID)
            {
                res_p = proportionalError(error);
            }

            lastOutput = (invertOutput ? -1 : 1) * Utils.Clamp(res_p + res_i + res_d, OutMin, OutMax);
            return(lastOutput);
        }
예제 #4
0
 public virtual float ResponseF(double error, double rate, PIDmode mode)
 {
     return((float)ResponseD(error, rate, mode));
 }
예제 #5
0
 public virtual float ResponseF(double error, double rate, PIDmode mode)
 {
     return (float)ResponseD(error, rate, mode);
 }