/// <summary>Flight Computer constructor.</summary> /// <param name="s">A signal processor (most probably a <see cref="ModuleSPU"/> instance.)</param> public FlightComputer(ISignalProcessor s) { SignalProcessor = s; Vessel = s.Vessel; SanctionedPilots = new List <Action <FlightCtrlState> >(); LastTarget = TargetCommand.WithTarget(null); var attitude = AttitudeCommand.Off(); _activeCommands[attitude.Priority] = attitude; //Use http://www.ni.com/white-paper/3782/en/ to fine-tune PIDController = new PIDController(PIDKp, PIDKi, PIDKd, 1.0, -1.0, true); PIDController.SetVessel(Vessel); GameEvents.onVesselChange.Add(OnVesselChange); GameEvents.onVesselSwitching.Add(OnVesselSwitching); GameEvents.onGameSceneSwitchRequested.Add(OnSceneSwitchRequested); RoverComputer = new RoverComputer(this, RoverPIDKp, RoverPIDKi, RoverPIDKd); RoverComputer.SetVessel(Vessel); // Add RT listeners from KSP Autopilot StockAutopilotCommand.UIreference = GameObject.FindObjectOfType <VesselAutopilotUI>(); for (var index = 0; index < StockAutopilotCommand.UIreference.modeButtons.Length; index++) { var buttonIndex = index; // prevent compiler optimisation from assigning static final index value StockAutopilotCommand.UIreference.modeButtons[index].onClick.AddListener(delegate { StockAutopilotCommand.AutopilotButtonClick(buttonIndex, this); }); // bad idea to use RemoveAllListeners() since no easy way to re-add the original stock listener to onClick } }
public RoverComputer(FlightComputer fc, double kp, double ki, double kd) { throttlePID = new PIDLoop(1, 0, 0); steerPID = new PIDLoop(1, 0, 0); pidController = fc.PIDController; //don't think of putting second copy of PID here this.Kp = kp; this.Ki = ki; this.Kd = kd; }