#pragma once #include #include #include #include #include #include #include #include "generated/live_kf_constants.h" #include "rednose/helpers/ekf_sym.h" #define EARTH_GM 3.986005e14 // m^3/s^2 (gravitational constant * mass of earth) using namespace EKFS; Eigen::Map get_mapvec(const Eigen::VectorXd &vec); Eigen::Map get_mapmat(const MatrixXdr &mat); std::vector> get_vec_mapvec(const std::vector &vec_vec); std::vector> get_vec_mapmat(const std::vector &mat_vec); class LiveKalman { public: LiveKalman(); void init_state(const Eigen::VectorXd &state, const Eigen::VectorXd &covs_diag, double filter_time); void init_state(const Eigen::VectorXd &state, const MatrixXdr &covs, double filter_time); void init_state(const Eigen::VectorXd &state, double filter_time); Eigen::VectorXd get_x(); MatrixXdr get_P(); double get_filter_time(); std::vector get_R(int kind, int n); std::optional predict_and_observe(double t, int kind, const std::vector &meas, std::vector R = {}); std::optional predict_and_update_odo_speed(std::vector speed, double t, int kind); std::optional predict_and_update_odo_trans(std::vector trans, double t, int kind); std::optional predict_and_update_odo_rot(std::vector rot, double t, int kind); void predict(double t); const Eigen::VectorXd &get_initial_x(); const MatrixXdr &get_initial_P(); const MatrixXdr &get_fake_gps_pos_cov(); const MatrixXdr &get_fake_gps_vel_cov(); const MatrixXdr &get_reset_orientation_P(); MatrixXdr H(const Eigen::VectorXd &in); private: std::string name = "live"; std::shared_ptr filter; int dim_state; int dim_state_err; Eigen::VectorXd initial_x; MatrixXdr initial_P; MatrixXdr fake_gps_pos_cov; MatrixXdr fake_gps_vel_cov; MatrixXdr reset_orientation_P; MatrixXdr Q; // process noise std::unordered_map obs_noise; };