#include class Kalman2DFilter { public: Kalman2DFilter(float dt=4.f, float accelUncertainty=10.f, float barometerUncertainty=100.f) { dt /= 1000.f; F = {1, dt, 0, 1}; G = {0.5f*dt*dt, dt}; H = {1,0}; I = {1, 0, 0, 1}; Q = G * ~G * accelUncertainty*accelUncertainty; R = {barometerUncertainty*barometerUncertainty}; P = {0, 0, 0, 0}; S = {0, 0}; } void filter(const float &AccZInertial, const float &AltitudeBarometer, float &AltitudeKalman, float &VelocityVerticalKalman) { Acc = {AccZInertial}; S = F * S + G * Acc; P = F * P * ~F + Q; L = H * P * ~H + R; K = P * ~H * Inverse(L); M = {AltitudeBarometer}; S = S + K * (M - H * S); AltitudeKalman = S(0,0); VelocityVerticalKalman = S(1,0); P = (I - K * H) * P; } private: BLA::Matrix<2,2> F; BLA::Matrix<2,1> G; BLA::Matrix<2,2> P; BLA::Matrix<2,2> Q; BLA::Matrix<2,1> S; BLA::Matrix<1,2> H; BLA::Matrix<2,2> I; BLA::Matrix<1,1> Acc; BLA::Matrix<2,1> K; BLA::Matrix<1,1> R; BLA::Matrix<1,1> L; BLA::Matrix<1,1> M; };