#pragma once #include #include #include #include #include #include #include #include #include typedef void (*extra_routine_t)(double *, double *); struct EKF { std::string name; std::vector kinds; std::vector feature_kinds; void (*f_fun)(double *, double, double *); void (*F_fun)(double *, double, double *); void (*err_fun)(double *, double *, double *); void (*inv_err_fun)(double *, double *, double *); void (*H_mod_fun)(double *, double *); void (*predict)(double *, double *, double *, double); std::unordered_map hs = {}; std::unordered_map Hs = {}; std::unordered_map updates = {}; std::unordered_map Hes = {}; std::unordered_map sets = {}; std::unordered_map extra_routines = {}; }; #define ekf_lib_init(ekf) \ extern "C" void* ekf_get() { \ return (void*) &ekf; \ } \ extern void __attribute__((weak)) ekf_register(const EKF* ptr); \ static void __attribute__((constructor)) do_ekf_init_ ## ekf(void) { \ if (ekf_register) ekf_register(&ekf); \ }