#pragma once #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(Eigen::VectorXd& vec); Eigen::Map get_mapmat(MatrixXdr& mat); std::vector> get_vec_mapvec(std::vector& vec_vec); std::vector> get_vec_mapmat(std::vector& mat_vec); class LiveKalman { public: LiveKalman(); void init_state(Eigen::VectorXd& state, Eigen::VectorXd& covs_diag, double filter_time); void init_state(Eigen::VectorXd& state, MatrixXdr& covs, double filter_time); void init_state(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, 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); Eigen::VectorXd get_initial_x(); MatrixXdr get_initial_P(); MatrixXdr get_fake_gps_pos_cov(); MatrixXdr get_fake_gps_vel_cov(); MatrixXdr get_reset_orientation_P(); MatrixXdr H(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; };