diff --git a/include/core/problem/problem.h b/include/core/problem/problem.h index 5570e0b9390424162c5fa5b4de070abbd18d508f..8e1c44860a8bb08e14f0e5488d3429e751050dc4 100644 --- a/include/core/problem/problem.h +++ b/include/core/problem/problem.h @@ -68,11 +68,11 @@ class Problem : public std::enable_shared_from_this<Problem> friend MotionProvider; protected: - HardwareBasePtr hardware_ptr_; - TrajectoryBasePtr trajectory_ptr_; - MapBasePtr map_ptr_; - TreeManagerBasePtr tree_manager_; - std::map<int, MotionProviderPtr> motion_provider_map_; + HardwareBasePtr hardware_ptr_; + TrajectoryBasePtr trajectory_ptr_; + MapBasePtr map_ptr_; + TreeManagerBasePtr tree_manager_; + std::map<unsigned int, MotionProviderPtr> motion_provider_map_; SizeEigen dim_; StateKeys frame_keys_; @@ -199,8 +199,8 @@ class Problem : public std::enable_shared_from_this<Problem> void removeMotionProvider(MotionProviderPtr proc); public: - std::map<int, MotionProviderConstPtr> getMotionProviderMap() const; - std::map<int, MotionProviderPtr> getMotionProviderMap(); + std::map<unsigned int, MotionProviderConstPtr> getMotionProviderMap() const; + std::map<unsigned int, MotionProviderPtr> getMotionProviderMap(); // Trajectory branch ---------------------------------- TrajectoryBaseConstPtr getTrajectory() const; @@ -430,14 +430,14 @@ inline bool Problem::isFirstFrameApplied() const return first_frame_status_ == 2; } -inline std::map<int, MotionProviderConstPtr> Problem::getMotionProviderMap() const +inline std::map<unsigned int, MotionProviderConstPtr> Problem::getMotionProviderMap() const { - std::map<int, MotionProviderConstPtr> map_const; + std::map<unsigned int, MotionProviderConstPtr> map_const; for (auto&& pair : motion_provider_map_) map_const[pair.first] = pair.second; return map_const; } -inline std::map<int, MotionProviderPtr> Problem::getMotionProviderMap() +inline std::map<unsigned int, MotionProviderPtr> Problem::getMotionProviderMap() { return motion_provider_map_; } diff --git a/include/core/processor/motion_provider.h b/include/core/processor/motion_provider.h index 3a2eb71de4eaeae9228c0e40b86fc045a5fd5314..ca19d80baa2b501204a48534053d3fe0fa268bb3 100644 --- a/include/core/processor/motion_provider.h +++ b/include/core/processor/motion_provider.h @@ -45,9 +45,9 @@ class MotionProvider VectorComposite getOdometry() const; void setOdometry(const VectorComposite&); - bool isStateProvider() const; - int getOrder() const; - void setOrder(int); + bool isStateProvider() const; + unsigned int getOrder() const; + void setOrder(unsigned int); public: TypeComposite getStateTypes() const @@ -67,21 +67,13 @@ class MotionProvider protected: TypeComposite state_types_; bool is_state_provider_; - double state_provider_order_; + unsigned int state_provider_order_; private: VectorComposite odometry_; mutable std::mutex mut_odometry_; }; -inline MotionProvider::MotionProvider(const TypeComposite& _state_types, const YAML::Node& _params) - : state_types_(_state_types), - is_state_provider_(_params["state_provider"].as<bool>()), - state_provider_order_(_params["state_provider_order"].as<double>()) -{ - checkTypeComposite(_state_types); -} - } // namespace wolf ///// IMPLEMENTATION /////// @@ -94,14 +86,14 @@ inline bool MotionProvider::isStateProvider() const return is_state_provider_; } -inline int MotionProvider::getOrder() const +inline unsigned int MotionProvider::getOrder() const { if (not isStateProvider()) throw std::runtime_error("MotionProvider::getOrder: not a motion provider, doesn't have order"); return state_provider_order_; } -inline void MotionProvider::setOrder(int _order) +inline void MotionProvider::setOrder(unsigned int _order) { if (not isStateProvider()) throw std::runtime_error("MotionProvider::getOrder: not a motion provider, cannot have order"); diff --git a/schema/processor/MotionProvider.schema b/schema/processor/MotionProvider.schema index 3881ba7120d2c2f21d4ccf002e8cdf5ef38342a4..95313cec713c5fb6fcae1c3b4314ec4643e91b5e 100644 --- a/schema/processor/MotionProvider.schema +++ b/schema/processor/MotionProvider.schema @@ -5,5 +5,5 @@ state_provider: state_provider_order: _mandatory: $state_provider - _type: double - _doc: The order number of this processor when problem gets the state (only used if state_provider = true). Two processors cannot have the same priority (if so, when installing the second is increased). \ No newline at end of file + _type: unsigned int + _doc: The order number of this processor when problem gets the state (only used if state_provider = true). Two processors cannot have the same order number. \ No newline at end of file diff --git a/src/problem/problem.cpp b/src/problem/problem.cpp index 6dd69ff8e66ef9166f152513750f79c65391faa1..eab9e22109eee86b69e17894d08b23d490dd18f3 100644 --- a/src/problem/problem.cpp +++ b/src/problem/problem.cpp @@ -168,13 +168,9 @@ ProblemPtr Problem::autoSetup(YAML::Node _param_node, // PROCESSORS =============================================================================== WOLF_DEBUG("Installing processors..."); - for (auto processor_n : _param_node["processors"]) - { - WOLF_DEBUG("Installing processor with the following YAML::Node:\n", processor_n); - problem->installProcessor(processor_n); - } + for (auto processor_n : _param_node["processors"]) problem->installProcessor(processor_n); - // MAP (optional) =============================================================================== + // MAP =============================================================================== WOLF_DEBUG("Creating map..."); // load plugin if map is not registered if (not FactoryMapNode::isCreatorRegistered(_param_node["map"]["type"].as<std::string>())) @@ -230,6 +226,9 @@ SensorBasePtr Problem::installSensor(const YAML::Node& _sensor_node, std::vector // Link sen_ptr->link(getHardware()); + + WOLF_DEBUG("Sensor installed correctly - ", sen_ptr->getName()); + return sen_ptr; } @@ -272,6 +271,8 @@ SensorBasePtr Problem::installSensor(const std::string& _params_yaml_filen // Link sen_ptr->link(getHardware()); + WOLF_DEBUG("Sensor installed correctly - ", sen_ptr->getName()); + return sen_ptr; } @@ -314,20 +315,17 @@ ProcessorBasePtr Problem::installProcessor(const YAML::Node& _processor_node, st } // Create processor (with derived class validation) ProcessorBasePtr prc_ptr = FactoryProcessorNode::create(processor_type, _processor_node, _schema_folders); - WOLF_DEBUG("Processor created: ", prc_ptr->getName()); if (not prc_ptr) throw std::runtime_error("Processor could not be created."); // Dimension check - WOLF_DEBUG("Checking dimension compatible: ", prc_ptr->getName()); if (prc_ptr->getDimCompatible() != 0 and prc_ptr->getDimCompatible() != this->getDim()) throw std::runtime_error("Processor not compatible with the Problem dimension."); // Link - WOLF_DEBUG("Configuring: ", prc_ptr->getName()); prc_ptr->configure(sen_ptr); - WOLF_DEBUG("linking: ", prc_ptr->getName(), " with ", sen_ptr->getName()); prc_ptr->link(sen_ptr); + WOLF_DEBUG("Processor installed correctly - ", prc_ptr->getName()); return prc_ptr; @@ -380,7 +378,7 @@ ProcessorBasePtr Problem::installProcessor(SensorBasePtr _sensor_corr prc_ptr->configure(_sensor_corresponding); prc_ptr->link(_sensor_corresponding); - WOLF_DEBUG("Processor installed: ", prc_ptr->getName()); + WOLF_DEBUG("Processor installed correctly - ", prc_ptr->getName()); return prc_ptr; } @@ -782,18 +780,19 @@ void Problem::addMotionProvider(MotionProviderPtr _motion_provider_ptr) // Check if is state getter if (not _motion_provider_ptr->isStateProvider()) { - WOLF_WARN("adding a MotionProvider processor with state_provider=false. Not adding this processor"); + WOLF_DEBUG( + "adding a MotionProvider processor with state_provider=false. Not adding this processor as state provider " + "in Problem."); return; } // check duplicated priority - while (motion_provider_map_.count(_motion_provider_ptr->getOrder()) == 1) + if (motion_provider_map_.count(_motion_provider_ptr->getOrder()) == 1) { WOLF_ERROR("Adding a MotionProvider processor with priority = ", _motion_provider_ptr->getOrder(), - " which is already taken. Trying to add it with priority = ", - _motion_provider_ptr->getOrder() + 1); - _motion_provider_ptr->setOrder(_motion_provider_ptr->getOrder() + 1); + " which is already taken."); + throw std::runtime_error("Problem::addMotionProvider: duplicated priority"); } // add to map ordered by priority diff --git a/src/processor/motion_provider.cpp b/src/processor/motion_provider.cpp index 4a11336ee5f775393bd827c6d3d96f1514a44253..d8d9d5e0af92ac03bd04125db65a8899d1c427d5 100644 --- a/src/processor/motion_provider.cpp +++ b/src/processor/motion_provider.cpp @@ -23,6 +23,14 @@ using namespace wolf; +MotionProvider::MotionProvider(const TypeComposite& _state_types, const YAML::Node& _params) + : state_types_(_state_types), + is_state_provider_(_params["state_provider"].as<bool>()), + state_provider_order_(_params["state_provider_order"] ? _params["state_provider_order"].as<unsigned int>() : 0) +{ + checkTypeComposite(_state_types); +} + void MotionProvider::addToProblem(ProblemPtr _prb_ptr, MotionProviderPtr _motion_ptr) { WOLF_DEBUG_COND(not isStateProvider(), @@ -37,7 +45,8 @@ void MotionProvider::addToProblem(ProblemPtr _prb_ptr, MotionProviderPtr _motion void MotionProvider::setOdometry(const VectorComposite& _odom) { std::lock_guard<std::mutex> lock(mut_odometry_); - assert(_odom.has(getStateKeys()) && "MotionProvider::setOdometry(): any key missing in _odom."); + if (not _odom.has(getStateKeys())) + throw std::runtime_error("MotionProvider::setOdometry(): any key missing in _odom."); for (auto key : getStateKeys()) odometry_[key] = _odom.at(key); // overwrite/insert only keys of the state_types_ } diff --git a/src/processor/processor_base.cpp b/src/processor/processor_base.cpp index b519c7f61d47b6bf938fb01620f2b59877044092..1a58306f42938ead927a976ee61de407c2cd0f6b 100644 --- a/src/processor/processor_base.cpp +++ b/src/processor/processor_base.cpp @@ -146,13 +146,9 @@ void ProcessorBase::link(SensorBasePtr _sen_ptr) if (_sen_ptr) { - WOLF_DEBUG("adding processor to sensor"); _sen_ptr->addProcessor(shared_from_this()); - WOLF_DEBUG("set sensor to processor"); this->setSensor(_sen_ptr); - WOLF_DEBUG("set problem to processor"); this->setProblem(_sen_ptr->getProblem()); - WOLF_DEBUG("done!"); } else { diff --git a/test/gtest_emplace.cpp b/test/gtest_emplace.cpp index 1ace7b2c2ce4d2606b5646bbf934bb6fcd378761..853edc8780633951d7ab05c2dd5fc8bb8b3e6f1f 100644 --- a/test/gtest_emplace.cpp +++ b/test/gtest_emplace.cpp @@ -104,8 +104,8 @@ TEST(Emplace, Processor) ASSERT_EQ(P->getHardware(), S->getHardware()); ASSERT_EQ(P->getHardware()->getSensorList().front(), S); - auto prc = ProcessorBase::emplace<ProcessorOdom2d>( - S, YAML::LoadFile(wolf_dir + "/test/yaml/processor_odom_2d.yaml"), {wolf_dir}); + auto params_proc = YAML::LoadFile(wolf_dir + "/test/yaml/processor_odom_2d.yaml"); + auto prc = ProcessorBase::emplace<ProcessorOdom2d>(S, params_proc, {wolf_dir}); ASSERT_EQ(P, prc->getProblem()); ASSERT_EQ(S, prc->getSensor()); @@ -117,8 +117,10 @@ TEST(Emplace, Processor) SensorBasePtr sen2 = SensorBase::emplace<SensorDummyPo2d>(P->getHardware(), params2, {wolf_dir}); - ProcessorOdom2dPtr prc2 = ProcessorBase::emplace<ProcessorOdom2d>( - sen2, YAML::LoadFile(wolf_dir + "/test/yaml/processor_odom_2d.yaml"), {wolf_dir}); + auto params_proc2 = params_proc; + params_proc["state_provider_order"] = 2; + + ProcessorOdom2dPtr prc2 = ProcessorBase::emplace<ProcessorOdom2d>(sen2, params_proc2, {wolf_dir}); ASSERT_EQ(P, prc->getProblem()); ASSERT_EQ(sen2, prc2->getSensor()); diff --git a/test/gtest_motion_provider.cpp b/test/gtest_motion_provider.cpp index abf74cb9f7c2bb23f75684fabd7df5d510ad4dd9..bb4cc27a2609df4180e8e74922c586ddd9cba6dd 100644 --- a/test/gtest_motion_provider.cpp +++ b/test/gtest_motion_provider.cpp @@ -97,7 +97,7 @@ TEST_F(MotionProviderTest, install) ASSERT_TRUE(mp2->isStateProvider()); ASSERT_TRUE(mp3->isStateProvider()); ASSERT_EQ(mp2->getOrder(), 1); - ASSERT_EQ(mp3->getOrder(), 2); // If duplicated priority, 2nd is changed to +1 priority. A WARN should be raised. + ASSERT_EQ(mp3->getOrder(), 2); ASSERT_TRUE(mp1->getStateTypes().has('P')); ASSERT_TRUE(mp1->getStateTypes().has('O')); ASSERT_FALSE(mp1->getStateTypes().has('V')); @@ -114,13 +114,19 @@ TEST_F(MotionProviderTest, install) ASSERT_EQ(std::next(problem->getMotionProviderMap().begin())->second, mp3); } +TEST_F(MotionProviderTest, duplicated_order) +{ + //try to install a processor with the same order --> throw + ASSERT_THROW(problem->installProcessor(sen, wolf_dir + "/test/yaml/processor_motion_provider_dummy2.yaml", {wolf_dir}), std::runtime_error); +} + TEST_F(MotionProviderTest, odometry) { VectorComposite odom_p({{'P', Vector2d::Zero()}}); VectorComposite odom_pov({{'P', Vector2d::Zero()}, {'O', Vector1d::Zero()}, {'V', Vector2d::Zero()}}); // Error: required PO keys to be added - ASSERT_DEATH({ mp1->setOdometry(odom_p); }, ""); + ASSERT_THROW(mp1->setOdometry(odom_p), std::runtime_error); mp1->setOdometry(odom_pov); mp2->setOdometry(odom_pov); mp3->setOdometry(odom_pov); diff --git a/test/yaml/processor_motion_provider_dummy3.yaml b/test/yaml/processor_motion_provider_dummy3.yaml index 8a769caaa4ef7ac26e5aac77a82594dba9c1c7d1..3414e1820bf47d574a1b5539588923abc9858a8f 100644 --- a/test/yaml/processor_motion_provider_dummy3.yaml +++ b/test/yaml/processor_motion_provider_dummy3.yaml @@ -11,4 +11,4 @@ keyframe_vote: apply_loss_function: false state_provider: true -state_provider_order: 1 # same as proc2, will be relegated after it \ No newline at end of file +state_provider_order: 2 \ No newline at end of file