diff --git a/src/shared/algorithms/MEA/MEA.cpp b/src/shared/algorithms/MEA/MEA.cpp index 8e1fcf93116ad7a569ce1336b9db82a5641b8b0d..528b1bcf8113e515864d20a9161c1977eca94741 100644 --- a/src/shared/algorithms/MEA/MEA.cpp +++ b/src/shared/algorithms/MEA/MEA.cpp @@ -63,7 +63,8 @@ MEA::MEA(const Config &config) baroR{config.baroR}, P{config.P}, x{0, 0, config.initialMass}, accelThresh{config.accelThresh}, speedThresh{config.speedThresh}, Kt{config.Kt}, alpha{config.alpha}, c{config.c}, coeffs{config.coeffs}, - crossSection{config.crossSection}, ae{config.ae}, p0{config.p0} + crossSection{config.crossSection}, ae{config.ae}, p0{config.p0}, + minMass{config.minMass}, maxMass{config.maxMass} { } @@ -81,6 +82,9 @@ void MEA::update(const Step &step) // Run accelerometer correction correctAccel(step); + // Compute current mass + computeMass(); + // Run apogee prediction computeApogee(step); @@ -164,13 +168,18 @@ void MEA::correctAccel(const Step &step) x = x + K * (step.acceleration.x() - y); } +void MEA::computeMass() +{ + // Clamp the used mass, so that we don't use bogus values in case the filter + // fails BAD + mass = std::max(std::min(x(2), maxMass), minMass); +} + void MEA::computeApogee(const Step &step) { if (!step.hasSpeedAndAlt) return; - float mass = x(2); - // TODO: Matlab uses CD_correction_shutDown, should we? // Holy fuck, massive formula, split this for the love of god apogee = step.mslAltitude + @@ -186,8 +195,9 @@ void MEA::updateState() state.x0 = x(0); state.x1 = x(1); + state.x2 = x(2); - state.estimatedMass = x(2); + state.estimatedMass = mass; state.estimatedPressure = baroH * x; state.estimatedApogee = apogee; state.estimatedForce = force; diff --git a/src/shared/algorithms/MEA/MEA.h b/src/shared/algorithms/MEA/MEA.h index 0fa99d9d445d628ab2a9307056d20547d7ab35c6..4600df16ec19f3079ff0bba9c7f959c38dd4fa98 100644 --- a/src/shared/algorithms/MEA/MEA.h +++ b/src/shared/algorithms/MEA/MEA.h @@ -61,6 +61,9 @@ public: float ae; //< Efflux area float p0; //< Pressure at nozzle exit + + float minMass; //< Minimum mass used for predicted apogee + float maxMass; //< Maximum mass used for predicted apogee }; struct Step @@ -104,6 +107,7 @@ private: void computeForce(const Step &step); void correctBaro(const Step &step); void correctAccel(const Step &step); + void computeMass(); void computeApogee(const Step &step); void updateState(); @@ -124,6 +128,7 @@ private: float q = 0.0f; //< Latest computed dynamic pressure float force = 0.0f; //< Latest computed force + float mass = 0.0f; //< Latest computed mass float apogee = 0.0f; //< Latest computed apogee float accelThresh; @@ -139,6 +144,9 @@ private: float ae; float p0; + float minMass; + float maxMass; + MEAState state; }; diff --git a/src/shared/algorithms/MEA/MEAData.h b/src/shared/algorithms/MEA/MEAData.h index 7358e242ae28b0f04c39768a1aacd93d84efa1f9..472e8f165c369ed8703cbfb03a57d740932661ca 100644 --- a/src/shared/algorithms/MEA/MEAData.h +++ b/src/shared/algorithms/MEA/MEAData.h @@ -39,19 +39,20 @@ struct MEAState float x0; float x1; + float x2; static std::string header() { return "timestamp,estimatedPressure,estimatedMass,estimatedApogee," "estimatedForce,x0," - "x1\n"; + "x1,x2\n"; } void print(std::ostream &os) const { os << timestamp << "," << estimatedPressure << "," << estimatedMass << "," << estimatedApogee << "," << estimatedForce << "," << x0 - << "," << x1 << "\n"; + << "," << x1 << "," << x2 << "\n"; } }; diff --git a/src/tests/catch/test-MEA.cpp b/src/tests/catch/test-MEA.cpp index 257a52cf0cce2985d258745655b996987cf6c61e..c644a6ff2b9faa813311db277c46e9cbf1e3c070 100644 --- a/src/tests/catch/test-MEA.cpp +++ b/src/tests/catch/test-MEA.cpp @@ -78,6 +78,9 @@ MEA::Config getMEAConfig() config.P = Matrix<float, 3, 3>::Zero(); config.initialMass = 35.01f; + + config.minMass = 20.0f; + config.maxMass = 40.0f; // clang-format on return config;