diff --git a/src/shared/algorithms/MEA/MEA.cpp b/src/shared/algorithms/MEA/MEA.cpp index c519f8654c8a8d8a09079295588577c1599e96bf..a30f73b6ffca1a05e1cb562b41b88edc09a0af5a 100644 --- a/src/shared/algorithms/MEA/MEA.cpp +++ b/src/shared/algorithms/MEA/MEA.cpp @@ -61,10 +61,11 @@ void MEA::Step::withSpeedAndAlt(float verticalSpeed, float mslAltitude) MEA::MEA(const Config &config) : F{config.F}, Q{config.Q}, G{config.G}, baroH{config.baroH}, 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}, - minMass{config.minMass}, maxMass{config.maxMass} + mass{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}, minMass{config.minMass}, maxMass{ + config.maxMass} { updateState(); } @@ -181,13 +182,13 @@ void MEA::computeApogee(const Step &step) if (!step.hasSpeedAndAlt) return; - // TODO: Matlab uses CD_correction_shutDown, should we? - // Holy fuck, massive formula, split this for the love of god - apogee = step.mslAltitude + - 1 / (2 * ((0.5f * rho * cd * crossSection) / mass)) * - log1p(1 + (step.verticalSpeed * step.verticalSpeed * - ((0.5f * rho * cd * crossSection) / mass)) / - Constants::g); + // Simplified massive formula for apogee estimation. + // Warning: log1p(x) = log(1 + x) + float temp = ((rho * cd * crossSection) / mass); + apogee = step.mslAltitude + + 1 / temp * + log1p(0.5 * (step.verticalSpeed * step.verticalSpeed * temp) / + Constants::g); } void MEA::updateState() diff --git a/src/shared/algorithms/MEA/MEA.h b/src/shared/algorithms/MEA/MEA.h index 4600df16ec19f3079ff0bba9c7f959c38dd4fa98..795761e43e8c0abf7f6cba62de4d9fef0f2d9cfd 100644 --- a/src/shared/algorithms/MEA/MEA.h +++ b/src/shared/algorithms/MEA/MEA.h @@ -128,8 +128,8 @@ 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 mass; //< Latest computed mass float accelThresh; float speedThresh; diff --git a/src/shared/algorithms/MEA/MEAData.h b/src/shared/algorithms/MEA/MEAData.h index 472e8f165c369ed8703cbfb03a57d740932661ca..8e26d62a43bc27ec970fa3ed0d3bd65330a3fb15 100644 --- a/src/shared/algorithms/MEA/MEAData.h +++ b/src/shared/algorithms/MEA/MEAData.h @@ -32,20 +32,19 @@ struct MEAState { uint64_t timestamp; - float estimatedPressure; - float estimatedMass; - float estimatedApogee; - float estimatedForce; + float estimatedPressure; ///< Estimated pressure in combustion chamber [Pa] + float estimatedMass; ///< Estimated rocket mass [kg] + float estimatedApogee; ///< Estimated apogee in msl [m] + float estimatedForce; ///< Estimated drag force [N] - float x0; - float x1; - float x2; + float x0; ///< first kalman state + float x1; ///< second kalman state + float x2; ///< third kalman state representing the mass static std::string header() { return "timestamp,estimatedPressure,estimatedMass,estimatedApogee," - "estimatedForce,x0," - "x1,x2\n"; + "estimatedForce,x0,x1,x2\n"; } void print(std::ostream &os) const