diff --git a/include/core/common/wolf.h b/include/core/common/wolf.h index 9f548fd325de45d8901f432975bf23563938c988..ebf11819669dd49a0660b0a318a3a59077aa9bb5 100644 --- a/include/core/common/wolf.h +++ b/include/core/common/wolf.h @@ -208,6 +208,10 @@ WOLF_PTR_TYPEDEFS(NodeBase); // Problem WOLF_PTR_TYPEDEFS(Problem); +// Graph Manager +WOLF_PTR_TYPEDEFS(GraphManagerBase); +WOLF_STRUCT_PTR_TYPEDEFS(ParamsGraphManagerBase); + // Hardware WOLF_PTR_TYPEDEFS(HardwareBase); diff --git a/include/core/graph_manager/factory_graph_manager.h b/include/core/graph_manager/factory_graph_manager.h index 52a954b87f4a40f44ad0b4a37bc44b1900e5f585..cb23c03e5b9707f5a5acbf94c29f3f8a1fc0fd35 100644 --- a/include/core/graph_manager/factory_graph_manager.h +++ b/include/core/graph_manager/factory_graph_manager.h @@ -31,8 +31,7 @@ inline std::string FactoryParamsGraphManager::getClass() // GraphManager factory typedef Factory<GraphManagerBase, const std::string&, - const ParamsGraphManagerBasePtr, - ProblemPtr> FactoryGraphManager; + const ParamsGraphManagerBasePtr> FactoryGraphManager; template<> inline std::string FactoryGraphManager::getClass() { @@ -45,8 +44,7 @@ inline std::string FactoryGraphManager::getClass() typedef Factory<GraphManagerBase, const std::string&, - const ParamsServer&, - ProblemPtr> AutoConfFactoryGraphManager; + const ParamsServer&> AutoConfFactoryGraphManager; template<> inline std::string AutoConfFactoryGraphManager::getClass() { diff --git a/include/core/graph_manager/graph_manager_base.h b/include/core/graph_manager/graph_manager_base.h index fac9999c80c285513e65bbeb300a6b42638401d5..962bdf54adc63645426c328d3f89f01b90383ded 100644 --- a/include/core/graph_manager/graph_manager_base.h +++ b/include/core/graph_manager/graph_manager_base.h @@ -1,7 +1,8 @@ #ifndef INCLUDE_GRAPH_MANAGER_BASE_H_ #define INCLUDE_GRAPH_MANAGER_BASE_H_ -#include "core/problem/problem.h" +#include "core/common/wolf.h" +#include "core/common/params_base.h" namespace wolf { @@ -18,31 +19,28 @@ namespace wolf */ #define WOLF_GRAPH_MANAGER_CREATE(GraphManagerClass, ParamsGraphManagerClass) \ static GraphManagerBasePtr create(const std::string& _unique_name, \ - const ParamsServer& _server, \ - ProblemPtr _problem) \ + const ParamsServer& _server) \ { \ auto params = std::make_shared<ParamsGraphManagerClass>(_unique_name, _server); \ \ - auto graph_manager = std::make_shared<GraphManagerClass>(params, _problem); \ + auto graph_manager = std::make_shared<GraphManagerClass>(params); \ \ graph_manager ->setName(_unique_name); \ \ return graph_manager; \ } \ static GraphManagerBasePtr create(const std::string& _unique_name, \ - const ParamsGraphManagerBasePtr _params, \ - ProblemPtr _problem) \ + const ParamsGraphManagerBasePtr _params) \ { \ auto params = std::static_pointer_cast<ParamsGraphManagerClass>(_params); \ \ - auto graph_manager = std::make_shared<GraphManagerClass>(params, _problem); \ + auto graph_manager = std::make_shared<GraphManagerClass>(params); \ \ graph_manager ->setName(_unique_name); \ \ return graph_manager; \ } \ -WOLF_STRUCT_PTR_TYPEDEFS(ParamsGraphManagerBase) struct ParamsGraphManagerBase : public ParamsBase { std::string prefix = "graph_manager/"; @@ -64,23 +62,21 @@ struct ParamsGraphManagerBase : public ParamsBase } }; -WOLF_PTR_TYPEDEFS(GraphManagerBase) class GraphManagerBase : public NodeBase { public: - GraphManagerBase(const std::string& _type, ParamsGraphManagerBasePtr _params, ProblemPtr _problem) : + GraphManagerBase(const std::string& _type, ParamsGraphManagerBasePtr _params) : NodeBase("GRAPH_MANAGER", _type), - problem_(_problem), params_(_params) {} virtual ~GraphManagerBase(){} - virtual void addKF(FrameBasePtr _KF) = 0; - virtual void addFactor(FactorBasePtr _factor) = 0; + virtual void newKeyFrame(FrameBasePtr _key_frame) = 0; + virtual void newAuxFrame(FrameBasePtr _aux_frame) = 0; + virtual void newFactor(FactorBasePtr _factor) = 0; protected: - ProblemPtr problem_; ParamsGraphManagerBasePtr params_; }; diff --git a/include/core/graph_manager/graph_manager_sliding_window.h b/include/core/graph_manager/graph_manager_sliding_window.h index 50b58c32714e0c01d16f54b7a84aa4d24148ebfc..5252a432fe48d187771e732f6191b8871ca7cad5 100644 --- a/include/core/graph_manager/graph_manager_sliding_window.h +++ b/include/core/graph_manager/graph_manager_sliding_window.h @@ -1,5 +1,5 @@ -#ifndef INCLUDE_GRAPH_MANAGER_H_ -#define INCLUDE_GRAPH_MANAGER_H_ +#ifndef INCLUDE_GRAPH_MANAGER_SLIDING_WINDOW_H_ +#define INCLUDE_GRAPH_MANAGER_SLIDING_WINDOW_H_ #include "core/graph_manager/graph_manager_base.h" @@ -29,16 +29,17 @@ struct ParamsGraphManagerSlidingWindow : public ParamsGraphManagerBase class GraphManagerSlidingWindow : public GraphManagerBase { public: - GraphManagerSlidingWindow(ParamsGraphManagerSlidingWindowPtr _params, ProblemPtr _problem) : - GraphManagerBase("GraphManagerSlidingWindow", _params, _problem), + GraphManagerSlidingWindow(ParamsGraphManagerSlidingWindowPtr _params) : + GraphManagerBase("GraphManagerSlidingWindow", _params), params_sw_(_params) {}; WOLF_GRAPH_MANAGER_CREATE(GraphManagerSlidingWindow, ParamsGraphManagerSlidingWindow) virtual ~GraphManagerSlidingWindow(){} - virtual void addKF(FrameBasePtr _KF) override; - virtual void addFactor(FactorBasePtr _factor) override {}; + virtual void newKeyFrame(FrameBasePtr _key_frame) override; + virtual void newAuxFrame(FrameBasePtr _aux_frame) override {}; + virtual void newFactor(FactorBasePtr _factor) override {}; protected: ParamsGraphManagerSlidingWindowPtr params_sw_; @@ -46,4 +47,4 @@ class GraphManagerSlidingWindow : public GraphManagerBase } /* namespace wolf */ -#endif /* INCLUDE_GRAPH_MANAGER_H_ */ +#endif /* INCLUDE_GRAPH_MANAGER_SLIDING_WINDOW_H_ */ diff --git a/include/core/problem/problem.h b/include/core/problem/problem.h index e1c48e685010cea4ba3311a7b9aa3fc24eef70ed..319ba9b282b6bf8bdb8ad23d5dd68d3a5f4a85f3 100644 --- a/include/core/problem/problem.h +++ b/include/core/problem/problem.h @@ -43,6 +43,7 @@ class Problem : public std::enable_shared_from_this<Problem> friend ProcessorMotion; protected: + GraphManagerBasePtr graph_manager_; HardwareBasePtr hardware_ptr_; TrajectoryBasePtr trajectory_ptr_; MapBasePtr map_ptr_; @@ -74,6 +75,9 @@ class Problem : public std::enable_shared_from_this<Problem> SizeEigen getDim() const; std::string getFrameStructure() const; + // Graph manager -------------------------------------- + void setGraphManager(GraphManagerBasePtr _gm); + // Hardware branch ------------------------------------ HardwareBasePtr getHardware() const; diff --git a/src/graph_manager/graph_manager_sliding_window.cpp b/src/graph_manager/graph_manager_sliding_window.cpp index 6acfe83ca0532912f605dd729d0b29fc92965cd9..31e42f49283889d528db18cd489cf0e19326d604 100644 --- a/src/graph_manager/graph_manager_sliding_window.cpp +++ b/src/graph_manager/graph_manager_sliding_window.cpp @@ -3,7 +3,7 @@ namespace wolf { -void GraphManagerSlidingWindow::addKF(FrameBasePtr _KF) +void GraphManagerSlidingWindow::newKeyFrame(FrameBasePtr _key_frame) { WOLF_INFO("GraphManagerSlidingWindow: new KF added!"); } diff --git a/src/problem/problem.cpp b/src/problem/problem.cpp index b35ae1a865bd9c8c90a2e8b08f4330685251b5b5..b95e1538a0db3160fe5a1f20b8240729d5eca183 100644 --- a/src/problem/problem.cpp +++ b/src/problem/problem.cpp @@ -15,7 +15,7 @@ #include "core/utils/params_server.hpp" #include "core/utils/loader.hpp" #include "core/utils/check_log.hpp" - +#include "core/graph_manager/graph_manager_base.h" // IRI libs includes @@ -451,6 +451,14 @@ std::string Problem::getFrameStructure() const return frame_structure_; } +void Problem::setGraphManager(GraphManagerBasePtr _gm) +{ + if (graph_manager_) + graph_manager_->setProblem(nullptr); + graph_manager_ = _gm; + graph_manager_->setProblem(shared_from_this()); +} + Eigen::VectorXd Problem::zeroState() const { Eigen::VectorXd state = Eigen::VectorXd::Zero(getFrameStructureSize()); @@ -496,6 +504,10 @@ void Problem::keyFrameCallback(FrameBasePtr _keyframe_ptr, ProcessorBasePtr _pro " microseconds: ", duration.count()); #endif } + + // notify graph manager + if (graph_manager_) + graph_manager_->newKeyFrame(_keyframe_ptr); } bool Problem::permitAuxFrame(ProcessorBasePtr _processor_ptr) const @@ -521,6 +533,10 @@ void Problem::auxFrameCallback(FrameBasePtr _frame_ptr, ProcessorBasePtr _proces // } // // processor_motion_ptr_->keyFrameCallback(_frame_ptr, _time_tolerance); + + // notify graph manager + if (graph_manager_) + graph_manager_->newAuxFrame(_frame_ptr); } StateBlockPtr Problem::notifyStateBlock(StateBlockPtr _state_ptr, Notification _noti) @@ -582,8 +598,14 @@ FactorBasePtr Problem::notifyFactor(FactorBasePtr _factor_ptr, Notification _not } // Add notification else + { factor_notification_map_[_factor_ptr] = _noti; + // notify graph manager + if (graph_manager_) + graph_manager_->newFactor(_factor_ptr); + } + return _factor_ptr; } diff --git a/test/dummy/graph_manager_dummy.h b/test/dummy/graph_manager_dummy.h new file mode 100644 index 0000000000000000000000000000000000000000..fbab3cb4b1e7ca0ffb4e4e78b0b8a01f19b709d6 --- /dev/null +++ b/test/dummy/graph_manager_dummy.h @@ -0,0 +1,38 @@ +#ifndef INCLUDE_GRAPH_MANAGER_DUMMY_H_ +#define INCLUDE_GRAPH_MANAGER_DUMMY_H_ + +#include "core/graph_manager/graph_manager_base.h" + +namespace wolf +{ + +WOLF_PTR_TYPEDEFS(GraphManagerDummy) + +class GraphManagerDummy : public GraphManagerBase +{ + public: + GraphManagerDummy(ParamsGraphManagerBasePtr _params) : + GraphManagerBase("GraphManagerDummy", _params), + n_factors_(0), + n_KF_(0) + {}; + WOLF_GRAPH_MANAGER_CREATE(GraphManagerDummy, ParamsGraphManagerBasePtr) + + virtual ~GraphManagerDummy(){} + + virtual void newKeyFrame(FrameBasePtr _KF) override + { + n_KF_++; + }; + + virtual void newFactor(FactorBasePtr _factor) override + { + n_factors_++; + }; + + int n_factors_, n_KF_; +}; + +} /* namespace wolf */ + +#endif /* INCLUDE_GRAPH_MANAGER_DUMMY_H_ */