private static void ConversionIntegrityTest(float altitude) { float derivedPressure = StaticPressureHelper.GetPressure(altitude, SeaLevelStaticPressure); float derivedAltitude = StaticPressureHelper.GetAltitude(derivedPressure, SeaLevelStaticPressure); AssertWithin(derivedAltitude, altitude, 0.001f); }
public override void Update(PhysicalHeliState startState, PhysicalHeliState endState, JoystickOutput output, TimeSpan totalSimulationTime, TimeSpan endTime) { PhysicalHeliState stateToMeasure = endState; float trueAltitude = stateToMeasure.Position.Y; if (IsPerfect) { Altitude = trueAltitude; } else { float simulatedPressure = _pressureProvider.GetSimulatedStaticPressure(trueAltitude); Altitude = StaticPressureHelper.GetAltitude(simulatedPressure, SeaLevelStaticPressure); } }
public void GetPressureTest() { float altitude, expected, actual; // All expected values are taken from a lookup table altitude = 11000f; expected = 22632f; actual = StaticPressureHelper.GetPressure(altitude, SeaLevelStaticPressure); AssertWithin(actual, expected, 100); altitude = 0f; expected = 101325f; actual = StaticPressureHelper.GetPressure(altitude, SeaLevelStaticPressure); AssertWithin(actual, expected, 100); altitude = 5000f; expected = 54019f; actual = StaticPressureHelper.GetPressure(altitude, SeaLevelStaticPressure); AssertWithin(actual, expected, 100); }
public float GetSimulatedStaticPressure(float trueAltitude) { float truePressure = StaticPressureHelper.GetPressure(trueAltitude, SeaLevelStaticPresure); // If we assume the pressure is rising linearly (although it is not) we would want to further distort the // measured pressure by applying non-linearity to the readings. Vector2 lowestPressurePlot = GetPressurePlot(StaticPressureHelper.MinAltitude); Vector2 highestPressurePlot = GetPressurePlot(StaticPressureHelper.MaxAltitude); var pressurePlot = new Vector2(trueAltitude, truePressure); // float nonLinearPressure = NonLinearity.SinusOffset(pressurePlot, lowestPressurePlot, highestPressurePlot).Y; float nonLinearPressure = NonLinearity.SinusOffset(pressurePlot, lowestPressurePlot, highestPressurePlot, 5f, 100).Y; // Noise amplitude is selected to give a few meters of variation, both positive and negative const float pressurePerMeter = 11.989f; const float noiseAmplitudeMeters = 0.5f; const float noiseAmplitudePressure = noiseAmplitudeMeters * pressurePerMeter; return(Noise.WhiteNoise(nonLinearPressure, noiseAmplitudePressure)); }
public void GetAltitudeTest() { float pressure, expected, actual; // All expected values are taken from a lookup table pressure = 22632; expected = 11000; actual = StaticPressureHelper.GetAltitude(pressure, SeaLevelStaticPressure); AssertWithin(actual, expected, 100); pressure = 101325; expected = 0; actual = StaticPressureHelper.GetAltitude(pressure, SeaLevelStaticPressure); AssertWithin(actual, expected, 100); pressure = 54019; expected = 5000; actual = StaticPressureHelper.GetAltitude(pressure, SeaLevelStaticPressure); AssertWithin(actual, expected, 100); }
private Vector2 GetPressurePlot(float altitude) { return(new Vector2(altitude, StaticPressureHelper.GetPressure(altitude, SeaLevelStaticPresure))); }