#pragma once #include #include #include #include #include #include #include #include #include #include #include "ekf.h" #include "ekf_load.h" #define REWIND_TO_KEEP 512 namespace EKFS { typedef Eigen::Matrix MatrixXdr; typedef struct Observation { double t; int kind; std::vector z; std::vector R; std::vector> extra_args; } Observation; typedef struct Estimate { Eigen::VectorXd xk1; Eigen::VectorXd xk; MatrixXdr Pk1; MatrixXdr Pk; double t; int kind; std::vector y; std::vector z; std::vector> extra_args; } Estimate; class EKFSym { public: EKFSym(std::string name, Eigen::Map Q, Eigen::Map x_initial, Eigen::Map P_initial, int dim_main, int dim_main_err, int N = 0, int dim_augment = 0, int dim_augment_err = 0, std::vector maha_test_kinds = std::vector(), std::vector quaternion_idxs = std::vector(), std::vector global_vars = std::vector(), double max_rewind_age = 1.0); void init_state(Eigen::Map state, Eigen::Map covs, double filter_time); Eigen::VectorXd state(); MatrixXdr covs(); void set_filter_time(double t); double get_filter_time(); void normalize_quaternions(); void normalize_slice(int slice_start, int slice_end_ex); void set_global(std::string global_var, double val); void reset_rewind(); void predict(double t); std::optional predict_and_update_batch(double t, int kind, std::vector> z, std::vector> R, std::vector> extra_args = {{}}, bool augment = false); extra_routine_t get_extra_routine(const std::string& routine); private: std::deque rewind(double t); void checkpoint(Observation& obs); Estimate predict_and_update_batch(Observation& obs, bool augment); Eigen::VectorXd update(int kind, Eigen::VectorXd z, MatrixXdr R, std::vector extra_args); // stuct with linked sympy generated functions const EKF *ekf = NULL; Eigen::VectorXd x; // state MatrixXdr P; // covs bool msckf; int N; int dim_augment; int dim_augment_err; int dim_main; int dim_main_err; // state int dim_x; int dim_err; double filter_time; std::vector maha_test_kinds; std::vector quaternion_idxs; std::vector global_vars; // process noise MatrixXdr Q; // rewind stuff double max_rewind_age; std::deque rewind_t; std::deque> rewind_states; std::deque rewind_obscache; Eigen::VectorXd augment_times; std::vector feature_track_kinds; }; }