private void BelowGraphInputsGUI(GraphInputs input) { GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStaticGraphLowLim"), GUILayout.Width(50.0F), GUILayout.Height(25.0F)); input.lowerBound = GUILayout.TextField(input.lowerBound, GUILayout.ExpandWidth(true)); GUILayout.Label(Localizer.Format("FAREditorStaticGraphUpLim"), GUILayout.Width(50.0F), GUILayout.Height(25.0F)); input.upperBound = GUILayout.TextField(input.upperBound, GUILayout.ExpandWidth(true)); GUILayout.Label(Localizer.Format("FAREditorStaticGraphPtCount"), GUILayout.Width(70.0F), GUILayout.Height(25.0F)); input.numPts = GUILayout.TextField(input.numPts, GUILayout.ExpandWidth(true)); GUILayout.Label(isMachMode ? Localizer.Format("FARAbbrevAoA") : Localizer.Format("FARAbbrevMach"), GUILayout.Width(50.0F), GUILayout.Height(25.0F)); input.otherInput = GUILayout.TextField(input.otherInput, GUILayout.ExpandWidth(true)); if (GUILayout.Button(isMachMode ? Localizer.Format("FAREditorStaticSweepMach") : Localizer.Format("FAREditorStaticSweepAoA"), GUILayout.Width(100.0F), GUILayout.Height(25.0F))) { input.lowerBound = Regex.Replace(input.lowerBound, @"[^-?[0-9]*(\.[0-9]*)?]", ""); input.upperBound = Regex.Replace(input.upperBound, @"[^-?[0-9]*(\.[0-9]*)?]", ""); input.numPts = Regex.Replace(input.numPts, @"[^-?[0-9]*(\.[0-9]*)?]", ""); input.pitchSetting = Regex.Replace(input.pitchSetting, @"[^-?[0-9]*(\.[0-9]*)?]", ""); input.otherInput = Regex.Replace(input.otherInput, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double lowerBound, upperBound, numPts, pitchSetting, otherInput; lowerBound = double.Parse(input.lowerBound); lowerBound = FARMathUtil.Clamp(lowerBound, -90, 90); input.lowerBound = lowerBound.ToString(); upperBound = double.Parse(input.upperBound); upperBound = FARMathUtil.Clamp(upperBound, lowerBound, 90); input.upperBound = upperBound.ToString(); numPts = double.Parse(input.numPts); numPts = Math.Ceiling(numPts); input.numPts = numPts.ToString(); pitchSetting = double.Parse(input.pitchSetting); pitchSetting = FARMathUtil.Clamp(pitchSetting, -1, 1); input.pitchSetting = pitchSetting.ToString(); otherInput = double.Parse(input.otherInput); GraphData data; var sim = simManager.SweepSim; if (sim.IsReady()) { if (isMachMode) { data = sim.MachNumberSweep(otherInput, pitchSetting, lowerBound, upperBound, (int)numPts, input.flapSetting, input.spoilers, bodySettingDropdown.ActiveSelection); SetAngleVectors(pitchSetting, pitchSetting); } else { data = sim.AngleOfAttackSweep(otherInput, pitchSetting, lowerBound, upperBound, (int)numPts, input.flapSetting, input.spoilers, bodySettingDropdown.ActiveSelection); SetAngleVectors(lowerBound, upperBound); } UpdateGraph(data, isMachMode ? Localizer.Format("FAREditorStaticGraphMach") : Localizer.Format("FAREditorStaticGraphAoA"), Localizer.Format("FAREditorStaticGraphCoeff"), lowerBound, upperBound); } } GUILayout.EndHorizontal(); }
public void Display() { //stabDerivHelp = GUILayout.Toggle(stabDerivHelp, "?", ButtonStyle, GUILayout.Width(200)); GUILayout.Label("Flight Condition:"); GUILayout.BeginHorizontal(); GUILayout.Label("Planet:"); _bodySettingDropdown.GUIDropDownDisplay(); GUILayout.Label("Altitude (km):"); altitude = GUILayout.TextField(altitude, GUILayout.ExpandWidth(true)); GUILayout.Label("Mach Number: "); machNumber = GUILayout.TextField(machNumber, GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Flap Setting: "); _flapSettingDropdown.GUIDropDownDisplay(); GUILayout.Label("Spoilers:"); spoilersDeployed = GUILayout.Toggle(spoilersDeployed, spoilersDeployed ? "Deployed" : "Retracted", GUILayout.Width(100)); GUILayout.EndHorizontal(); if (GUILayout.Button("Calculate Stability Derivatives", GUILayout.Width(250.0F), GUILayout.Height(25.0F))) { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); //atm_temp_str = Regex.Replace(atm_temp_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); //rho_str = Regex.Replace(rho_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); double altitudeDouble = Convert.ToDouble(altitude); altitudeDouble *= 1000; double temp = body.GetTemperature(altitudeDouble); double pressure = body.GetPressure(altitudeDouble); if (pressure > 0) { //double temp = Convert.ToSingle(atm_temp_str); double machDouble = Convert.ToSingle(machNumber); machDouble = FARMathUtil.Clamp(machDouble, 0.001, float.PositiveInfinity); double density = body.GetDensity(pressure, temp); double sspeed = body.GetSpeedOfSound(pressure, density); double vel = sspeed * machDouble; //UpdateControlSettings(); double q = vel * vel * density * 0.5f; stabDerivOutput = simManager.StabDerivCalculator.CalculateStabilityDerivs(vel, q, machDouble, 0, 0, 0, _flapSettingDropdown.ActiveSelection, spoilersDeployed, body, altitudeDouble); simManager.vehicleData = stabDerivOutput; SetAngleVectors(stabDerivOutput.stableAoA); } else { PopupDialog.SpawnPopupDialog("Error!", "Altitude was above atmosphere", "OK", false, HighLogic.Skin); } } GUILayout.BeginHorizontal(); GUILayout.Label("Aircraft Properties", GUILayout.Width(180)); GUILayout.Label("Moments of Inertia", GUILayout.Width(160)); GUILayout.Label("Products of Inertia", GUILayout.Width(160)); GUILayout.Label("Level Flight", GUILayout.Width(140)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(GUILayout.Width(180)); GUILayout.Label("Ref Area: " + stabDerivOutput.area.ToString("G3") + " m²"); GUILayout.Label("Scaled Chord: " + stabDerivOutput.MAC.ToString("G3") + " m"); GUILayout.Label("Scaled Span: " + stabDerivOutput.b.ToString("G3") + " m"); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(160)); GUILayout.Label(new GUIContent("Ixx: " + stabDerivOutput.stabDerivs[0].ToString("G6") + " kg * m²", "Inertia about X-axis due to rotation about X-axis")); GUILayout.Label(new GUIContent("Iyy: " + stabDerivOutput.stabDerivs[1].ToString("G6") + " kg * m²", "Inertia about Y-axis due to rotation about Y-axis")); GUILayout.Label(new GUIContent("Izz: " + stabDerivOutput.stabDerivs[2].ToString("G6") + " kg * m²", "Inertia about Z-axis due to rotation about Z-axis")); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(160)); GUILayout.Label(new GUIContent("Ixy: " + stabDerivOutput.stabDerivs[24].ToString("G6") + " kg * m²", "Inertia about X-axis due to rotation about Y-axis; is equal to inertia about Y-axis due to rotation about X-axis")); GUILayout.Label(new GUIContent("Iyz: " + stabDerivOutput.stabDerivs[25].ToString("G6") + " kg * m²", "Inertia about Y-axis due to rotation about Z-axis; is equal to inertia about Z-axis due to rotation about Y-axis")); GUILayout.Label(new GUIContent("Ixz: " + stabDerivOutput.stabDerivs[26].ToString("G6") + " kg * m²", "Inertia about X-axis due to rotation about Z-axis; is equal to inertia about Z-axis due to rotation about X-axis")); GUILayout.EndVertical(); GUILayout.BeginVertical(GUILayout.Width(140)); GUILayout.Label(new GUIContent("u0: " + stabDerivOutput.nominalVelocity.ToString("G6") + " m/s", "Air speed based on this mach number and temperature.")); GUILayout.BeginHorizontal(); GUILayout.Label(new GUIContent("Cl: " + stabDerivOutput.stableCl.ToString("G3"), "Required lift coefficient at this mass, speed and air density.")); GUILayout.Label(new GUIContent("Cd: " + stabDerivOutput.stableCd.ToString("G3"), "Resulting drag coefficient at this mass, speed and air density.")); GUILayout.EndHorizontal(); GUILayout.Label(new GUIContent("AoA: " + stabDerivOutput.stableAoAState + stabDerivOutput.stableAoA.ToString("G6") + " deg", "Angle of attack required to achieve the necessary lift force.")); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Longitudinal Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUIStyle BackgroundStyle = new GUIStyle(GUI.skin.box); BackgroundStyle.hover = BackgroundStyle.active = BackgroundStyle.normal; GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); GUILayout.Label("Down Vel Derivatives", GUILayout.Width(160)); GUILayout.Label("Fwd Vel Derivatives", GUILayout.Width(160)); GUILayout.Label("Pitch Rate Derivatives", GUILayout.Width(160)); GUILayout.Label("Pitch Ctrl Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Zw: ", stabDerivOutput.stabDerivs[3], " s⁻¹", "Change in Z-direction acceleration with respect to Z-direction velocity; should be negative", 160, -1); StabilityLabel("Zu: ", stabDerivOutput.stabDerivs[6], " s⁻¹", "Change in Z-direction acceleration with respect to X-direction velocity; should be negative", 160, -1); StabilityLabel("Zq: ", stabDerivOutput.stabDerivs[9], " m/s", "Change in Z-direction acceleration with respect to pitch-up rate; sign unimportant", 160, 0); StabilityLabel("Zδe: ", stabDerivOutput.stabDerivs[12], " m/s²", "Change in Z-direction acceleration with respect to pitch control input; should be negative", 160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Xw: ", stabDerivOutput.stabDerivs[4], " s⁻¹", "Change in X-direction acceleration with respect to Z-direction velocity; sign unimportant", 160, 0); StabilityLabel("Xu: ", stabDerivOutput.stabDerivs[7], " s⁻¹", "Change in X-direction acceleration with respect to X-direction velocity; should be negative", 160, -1); StabilityLabel("Xq: ", stabDerivOutput.stabDerivs[10], " m/s", "Change in X-direction acceleration with respect to pitch-up rate; sign unimportant", 160, 0); StabilityLabel("Xδe: ", stabDerivOutput.stabDerivs[13], " m/s²", "Change in X-direction acceleration with respect to pitch control input; sign unimportant", 160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Mw: ", stabDerivOutput.stabDerivs[5], " (m * s)⁻¹", "Change in pitch-up angular acceleration with respect to Z-direction velocity; should be negative", 160, -1); StabilityLabel("Mu: ", stabDerivOutput.stabDerivs[8], " (m * s)⁻¹", "Change in pitch-up angular acceleration acceleration with respect to X-direction velocity; sign unimportant", 160, 0); StabilityLabel("Mq: ", stabDerivOutput.stabDerivs[11], " s⁻¹", "Change in pitch-up angular acceleration acceleration with respect to pitch-up rate; should be negative", 160, -1); StabilityLabel("Mδe: ", stabDerivOutput.stabDerivs[14], " s⁻²", "Change in pitch-up angular acceleration acceleration with respect to pitch control input; should be positive", 160, 1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Lateral Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Sideslip Derivatives", GUILayout.Width(160)); GUILayout.Label("Roll Rate Derivatives", GUILayout.Width(160)); GUILayout.Label("Yaw Rate Derivatives", GUILayout.Width(160)); GUILayout.EndHorizontal(); GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); StabilityLabel("Yβ: ", stabDerivOutput.stabDerivs[15], " m/s²", "Change in Y-direction acceleration with respect to sideslip angle β; should be negative", 160, -1); StabilityLabel("Yp: ", stabDerivOutput.stabDerivs[18], " m/s", "Change in Y-direction acceleration with respect to roll-right rate; sign unimportant", 160, 0); StabilityLabel("Yr: ", stabDerivOutput.stabDerivs[21], " m/s", "Change in Y-direction acceleration with respect to yaw-right rate; should be positive", 160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Lβ: ", stabDerivOutput.stabDerivs[16], " s⁻²", "Change in roll-right angular acceleration with respect to sideslip angle β; should be negative", 160, -1); StabilityLabel("Lp: ", stabDerivOutput.stabDerivs[19], " s⁻¹", "Change in roll-right angular acceleration with respect to roll-right rate; should be negative", 160, -1); StabilityLabel("Lr: ", stabDerivOutput.stabDerivs[22], " s⁻¹", "Change in roll-right angular acceleration with respect to yaw-right rate; should be positive", 160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); StabilityLabel("Nβ: ", stabDerivOutput.stabDerivs[17], " s⁻²", "Change in yaw-right angular acceleration with respect to sideslip angle β; should be positive", 160, 1); StabilityLabel("Np: ", stabDerivOutput.stabDerivs[20], " s⁻¹", "Change in yaw-right angular acceleration with respect to roll-right rate; sign unimportant", 160, 0); StabilityLabel("Nr: ", stabDerivOutput.stabDerivs[23], " s⁻¹", "Change in yaw-right angular acceleration with respect to yaw-right rate; should be negative", 160, -1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); DrawTooltip(); }
private void OnAutoPilotUpdate(FlightCtrlState state) { if (_vessel.srfSpeed < 5) { return; } ControlSystem sys = systemInstances[0]; //wing leveler if (sys.active) { double phi = info.rollAngle - sys.zeroPoint; if (sys.kP < 0) { phi += 180; if (phi > 180) { phi -= 360; } } else { phi = -phi; } phi *= -FARMathUtil.deg2rad; double output = ControlStateChange(sys, phi); if (Math.Abs(state.roll - state.rollTrim) < 0.01) { if (output > 1) { output = 1; } else if (output < -1) { output = -1; } state.roll = (float)output + state.rollTrim; } } else { sys.errorIntegral = 0; } sys = systemInstances[1]; if (sys.active) { double beta = -(info.sideslipAngle - sys.zeroPoint) * FARMathUtil.deg2rad; double output = ControlStateChange(sys, beta); if (Math.Abs(state.yaw - state.yawTrim) < 0.01) { if (output > 1) { output = 1; } else if (output < -1) { output = -1; } state.yaw = (float)output + state.yawTrim; } } else { sys.errorIntegral = 0; } sys = systemInstances[2]; if (sys.active) { double pitch = (info.aoA - sys.zeroPoint) * FARMathUtil.deg2rad; double output = ControlStateChange(sys, pitch); if (Math.Abs(state.pitch - state.pitchTrim) < 0.01) { if (output > 1) { output = 1; } else if (output < -1) { output = -1; } state.pitch = (float)output + state.pitchTrim; } } else { sys.errorIntegral = 0; } sys = systemInstances[3]; if (sys.active) { if (info.aoA > aoAHighLim) { state.pitch = (float)FARMathUtil.Clamp(ControlStateChange(sys, info.aoA - aoAHighLim), -1, 1) + state.pitchTrim; } else if (info.aoA < aoALowLim) { state.pitch = (float)FARMathUtil.Clamp(ControlStateChange(sys, info.aoA - aoALowLim), -1, 1) + state.pitchTrim; } } else { sys.errorIntegral = 0; } sys = systemInstances[4]; if (sys.active) { double scalingFactor = scalingDynPres / info.dynPres; if (scalingFactor > 1) { scalingFactor = 1; } state.pitch = state.pitchTrim + (state.pitch - state.pitchTrim) * (float)scalingFactor; state.yaw = state.yawTrim + (state.yaw - state.yawTrim) * (float)scalingFactor; state.roll = state.rollTrim + (state.roll - state.rollTrim) * (float)scalingFactor; } }