diff --git a/demos/hello_wolf/capture_range_bearing.h b/demos/hello_wolf/capture_range_bearing.h index 8bc32a93d452629b5c69358c5d751c070eeba1a6..10fb8fa05f14fc4801effce4fb734c90a9ea2e90 100644 --- a/demos/hello_wolf/capture_range_bearing.h +++ b/demos/hello_wolf/capture_range_bearing.h @@ -21,7 +21,7 @@ class CaptureRangeBearing : public CaptureBase { public: CaptureRangeBearing(const TimeStamp& _ts, const SensorBasePtr& _scanner, const Eigen::VectorXi& _ids, const Eigen::VectorXd& _ranges, const Eigen::VectorXd& _bearings); - virtual ~CaptureRangeBearing(); + ~CaptureRangeBearing() override; const VectorXi& getIds () const; const int& getId (int _i) const; diff --git a/demos/hello_wolf/factor_range_bearing.h b/demos/hello_wolf/factor_range_bearing.h index 226a6335e7966a0d3bdd7042c017913bc64b419b..978f88846d5dee608a47a01c101676a0bfd23037 100644 --- a/demos/hello_wolf/factor_range_bearing.h +++ b/demos/hello_wolf/factor_range_bearing.h @@ -45,12 +45,12 @@ class FactorRangeBearing : public FactorAutodiff<FactorRangeBearing, 2, 2, 1, 2, // } - virtual ~FactorRangeBearing() + ~FactorRangeBearing() override { // } - virtual std::string getTopology() const override + std::string getTopology() const override { return "LMK"; } diff --git a/demos/hello_wolf/feature_range_bearing.h b/demos/hello_wolf/feature_range_bearing.h index 8571a8fb933976c740440c9d4d9ba8a2fb3d8f20..b924d29eea0a22a80267ace90718f9a66f54dac1 100644 --- a/demos/hello_wolf/feature_range_bearing.h +++ b/demos/hello_wolf/feature_range_bearing.h @@ -19,7 +19,7 @@ class FeatureRangeBearing : public FeatureBase { public: FeatureRangeBearing(const Eigen::VectorXd& _measurement, const Eigen::MatrixXd& _meas_covariance); - virtual ~FeatureRangeBearing(); + ~FeatureRangeBearing() override; }; } // namespace wolf diff --git a/demos/hello_wolf/landmark_point_2d.h b/demos/hello_wolf/landmark_point_2d.h index 0ec660c9e70944a8de9dd152649dc78d8a85b86b..79287af069fb5b5da0ef7186333b90fc18664bbb 100644 --- a/demos/hello_wolf/landmark_point_2d.h +++ b/demos/hello_wolf/landmark_point_2d.h @@ -19,7 +19,7 @@ class LandmarkPoint2d : public LandmarkBase { public: LandmarkPoint2d(int _id, const Eigen::Vector2d& _xy); - virtual ~LandmarkPoint2d(); + ~LandmarkPoint2d() override; }; } /* namespace wolf */ diff --git a/demos/hello_wolf/processor_range_bearing.h b/demos/hello_wolf/processor_range_bearing.h index 1203b217e4f07c3e02a287f63b0bace4ba46ede2..bdcefb3a7141627523a6f2111307fc776abbadbb 100644 --- a/demos/hello_wolf/processor_range_bearing.h +++ b/demos/hello_wolf/processor_range_bearing.h @@ -46,31 +46,31 @@ class ProcessorRangeBearing : public ProcessorBase typedef Eigen::Transform<double, 2, Eigen::Isometry> Trf; ProcessorRangeBearing(ParamsProcessorBasePtr _params); - virtual ~ProcessorRangeBearing() {/* empty */} - virtual void configure(SensorBasePtr _sensor) override; + ~ProcessorRangeBearing() override {/* empty */} + void configure(SensorBasePtr _sensor) override; // Factory method for high level API WOLF_PROCESSOR_CREATE(ProcessorRangeBearing, ParamsProcessorRangeBearing); protected: // Implementation of pure virtuals from ProcessorBase - virtual void processCapture (CaptureBasePtr _capture) override; - virtual void processKeyFrame (FrameBasePtr _keyframe_ptr, const double& _time_tol_other) override {}; - virtual bool triggerInCapture (CaptureBasePtr) const override { return true;}; - virtual bool triggerInKeyFrame (FrameBasePtr _keyframe_ptr, const double& _time_tol_other) const override {return false;} - virtual bool voteForKeyFrame () const override {return false;} + void processCapture (CaptureBasePtr _capture) override; + void processKeyFrame (FrameBasePtr _keyframe_ptr, const double& _time_tol_other) override {}; + bool triggerInCapture (CaptureBasePtr) const override { return true;}; + bool triggerInKeyFrame (FrameBasePtr _keyframe_ptr, const double& _time_tol_other) const override {return false;} + bool voteForKeyFrame () const override {return false;} /** \brief store key frame * * Returns true if the key frame should be stored */ - virtual bool storeKeyFrame(FrameBasePtr) override; + bool storeKeyFrame(FrameBasePtr) override; /** \brief store capture * * Returns true if the capture should be stored */ - virtual bool storeCapture(CaptureBasePtr) override; + bool storeCapture(CaptureBasePtr) override; private: // control variables diff --git a/demos/hello_wolf/sensor_range_bearing.h b/demos/hello_wolf/sensor_range_bearing.h index 491efff4f533edc993051482de7d0e84562a790a..59c217fe0f3f9f5f70973dca8a2ef4b060a6696a 100644 --- a/demos/hello_wolf/sensor_range_bearing.h +++ b/demos/hello_wolf/sensor_range_bearing.h @@ -45,7 +45,7 @@ class SensorRangeBearing : public SensorBase SensorRangeBearing(const Eigen::VectorXd& _extrinsics, const Eigen::Vector2d& _noise_std); SensorRangeBearing(const Eigen::VectorXd& _extrinsics, const ParamsSensorRangeBearingPtr _intr); WOLF_SENSOR_CREATE(SensorRangeBearing, ParamsSensorRangeBearing, 3); - virtual ~SensorRangeBearing(); + ~SensorRangeBearing() override; }; diff --git a/include/core/common/factory.h b/include/core/common/factory.h index c9aa0cd1980d55577179a07be2c6c819055d2b4b..edd07448729ba69ddda1fdc447b2610c22cd298c 100644 --- a/include/core/common/factory.h +++ b/include/core/common/factory.h @@ -126,18 +126,20 @@ namespace wolf * * Second to know, the Factory class is a <a href="http://stackoverflow.com/questions/1008019/c-singleton-design-pattern#1008289">singleton</a>: * it can only exist once in your application. - * To access it, use the static method get(), + * To access it, we internally use the static method get(), * * \code * Factory<MyTypeBase, MyTypeInput>::get() * \endcode * - * where, of course, you better make use of the appropriate typedef in place of ````Factory<MyTypeBase, MyTypeInput>````. + * but this is a private method. * - * You can then call the methods you like, e.g. to create a landmark, you use: + * The interesting methods are designed static, and are the ones responsible for accessing the Factory instance via .get(). + * + * You must therefore call the methods you like statically, e.g. to create a landmark, you use: * * \code - * FactoryLandmark::get().create(TYPE, args...); // see below for creating objects ... + * FactoryLandmark::create(TYPE, args...); // see below for creating objects ... * \endcode * * #### Write creator methods (in your derived object classes) @@ -172,7 +174,7 @@ namespace wolf * that knows how to create your specific object, e.g.: * * \code - * FactoryLandmark::get().registerCreator("LandmarkPolyline2d", LandmarkPolyline2d::create); + * FactoryLandmark::registerCreator("LandmarkPolyline2d", LandmarkPolyline2d::create); * \endcode * * #### Automatic registration @@ -180,7 +182,7 @@ namespace wolf * For example, in sensor_camera_yaml.cpp we find the line: * * \code - * const bool registered_camera_intr = FactoryParamsSensor::get().registerCreator("ParamsSensorCamera", createParamsSensorCamera); + * const bool registered_camera_intr = FactoryParamsSensor::registerCreator("ParamsSensorCamera", createParamsSensorCamera); * \endcode * * which is a static invocation (i.e., it is placed at global scope outside of the ParamsSensorCamera class). @@ -191,7 +193,7 @@ namespace wolf * The method unregisterCreator() unregisters the ObjectXxx::create() method. It only needs to be passed the string of the object type. * * \code - * Factory<MyTypeBase, MyTypeInput>::get().unregisterCreator("ParamsSensorCamera"); + * Factory<MyTypeBase, MyTypeInput>::unregisterCreator("ParamsSensorCamera"); * \endcode * * #### Create objects using the factory @@ -201,13 +203,13 @@ namespace wolf * To create e.g. a LandmarkPolyline2d from a YAML node you type: * * \code - * LandmarkBasePtr lmk_ptr = Factory<LandmarkBasePtr, YAML::Node>::get().create("LandmarkPolyline2d", lmk_yaml_node); + * LandmarkBasePtr lmk_ptr = Factory<LandmarkBasePtr, YAML::Node>::create("LandmarkPolyline2d", lmk_yaml_node); * \endcode * * or even better, make use of the convenient typedefs: * * \code - * LandmarkBasePtr lmk_ptr = FactoryLandmark::get().create("LandmarkPolyline2d", lmk_yaml_node); + * LandmarkBasePtr lmk_ptr = FactoryLandmark::create("LandmarkPolyline2d", lmk_yaml_node); * \endcode * * ### Examples @@ -247,7 +249,7 @@ namespace wolf * // Register landmark creator (put the register code inside an unnamed namespace): * namespace * { - * const bool registered_lmk_polyline_2d = FactoryLandmark::get().registerCreator("LandmarkPolyline2d", LandmarkPolyline2d::create); + * const bool registered_lmk_polyline_2d = FactoryLandmark::registerCreator("LandmarkPolyline2d", LandmarkPolyline2d::create); * } * * \endcode @@ -280,9 +282,9 @@ class Factory typedef std::map<std::string, CreatorCallback> CallbackMap; public: - bool registerCreator(const std::string& _type, CreatorCallback createFn); - bool unregisterCreator(const std::string& _type); - TypeBasePtr create(const std::string& _type, TypeInput... _input); + static bool registerCreator(const std::string& _type, CreatorCallback createFn); + static bool unregisterCreator(const std::string& _type); + static TypeBasePtr create(const std::string& _type, TypeInput... _input); std::string getClass() const; private: @@ -291,7 +293,7 @@ class Factory // Singleton --------------------------------------------------- // This class is a singleton. The code below guarantees this. // See: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern - public: + private: static Factory& get(); public: Factory(const Factory&) = delete; @@ -304,11 +306,11 @@ class Factory template<class TypeBase, typename... TypeInput> inline bool Factory<TypeBase, TypeInput...>::registerCreator(const std::string& _type, CreatorCallback createFn) { - bool reg = callbacks_.insert(typename CallbackMap::value_type(_type, createFn)).second; + bool reg = get().callbacks_.insert(typename CallbackMap::value_type(_type, createFn)).second; if (reg) - std::cout << std::setw(26) << std::left << getClass() << " <-- registered " << _type << std::endl; + std::cout << std::setw(26) << std::left << get().getClass() << " <-- registered " << _type << std::endl; else - std::cout << std::setw(26) << std::left << getClass() << " X-- skipping " << _type << ": already registered." << std::endl; + std::cout << std::setw(26) << std::left << get().getClass() << " X-- skipping " << _type << ": already registered." << std::endl; return reg; } @@ -316,17 +318,17 @@ inline bool Factory<TypeBase, TypeInput...>::registerCreator(const std::string& template<class TypeBase, typename... TypeInput> inline bool Factory<TypeBase, TypeInput...>::unregisterCreator(const std::string& _type) { - return callbacks_.erase(_type) == 1; + return get().callbacks_.erase(_type) == 1; } template<class TypeBase, typename... TypeInput> inline typename Factory<TypeBase, TypeInput...>::TypeBasePtr Factory<TypeBase, TypeInput...>::create(const std::string& _type, TypeInput... _input) { - typename CallbackMap::const_iterator creator_callback_it = callbacks_.find(_type); + typename CallbackMap::const_iterator creator_callback_it = get().callbacks_.find(_type); - if (creator_callback_it == callbacks_.end()) + if (creator_callback_it == get().callbacks_.end()) // not found - throw std::runtime_error(getClass() + " : Unknown type \"" + _type + "\". Possibly you tried to use an unregistered creator."); + throw std::runtime_error(get().getClass() + " : Unknown type \"" + _type + "\". Possibly you tried to use an unregistered creator."); // Invoke the creation function return (creator_callback_it->second)(std::forward<TypeInput>(_input)...); diff --git a/include/core/factor/factor_odom_2d_closeloop.h b/include/core/factor/factor_odom_2d_closeloop.h index a4ea7b1dff8484a89885edd424a6ac899331d3d7..16f1d677024f4dd97968dbfda45c0e3aaca82723 100644 --- a/include/core/factor/factor_odom_2d_closeloop.h +++ b/include/core/factor/factor_odom_2d_closeloop.h @@ -35,7 +35,7 @@ class FactorOdom2dCloseloop : public FactorAutodiff<FactorOdom2dCloseloop, 3, 2, virtual ~FactorOdom2dCloseloop() = default; - virtual std::string getTopology() const override + std::string getTopology() const override { return std::string("LOOP"); } diff --git a/include/core/frame/frame_base.h b/include/core/frame/frame_base.h index 5c45c103c33b77542a1d136b870d6a0f88c177eb..91a94d274b36d0023a0ba267583f4b67726d8665 100644 --- a/include/core/frame/frame_base.h +++ b/include/core/frame/frame_base.h @@ -63,12 +63,6 @@ class FrameBase : public NodeBase, public HasStateBlocks, public std::enable_sha StateBlockPtr _o_ptr = nullptr, StateBlockPtr _v_ptr = nullptr); - FrameBase(const FrameType & _tp, - const TimeStamp& _ts, - const std::string _frame_structure, - const SizeEigen _dim, - const Eigen::VectorXd& _x); - FrameBase(const FrameType & _tp, const TimeStamp& _ts, const std::string _frame_structure, diff --git a/include/core/processor/factory_processor.h b/include/core/processor/factory_processor.h index 9d101848eb54966e970a48d08416548a259b7154..e36e85a6d109572070bf2d317d81349df73f824a 100644 --- a/include/core/processor/factory_processor.h +++ b/include/core/processor/factory_processor.h @@ -75,7 +75,7 @@ namespace wolf * To create a ProcessorOdom2d, you type: * * \code - * auto prc_odom2d_ptr = FactoryProcessor::get().create("ProcessorOdom2d", "main odometry", params_ptr); + * auto prc_odom2d_ptr = FactoryProcessor::create("ProcessorOdom2d", "main odometry", params_ptr); * \endcode * * #### Example 1 : Create a sensor and its processor @@ -90,14 +90,14 @@ namespace wolf * // Note: ProcessorOdom2d::create() is already registered, automatically. * * // First create the sensor (See FactorySensor for details) - * SensorBasePtr sensor_ptr = FactorySensor::get().create ( "SensorOdom2d" , "Main odometer" , extrinsics , &intrinsics ); + * SensorBasePtr sensor_ptr = FactorySensor::create ( "SensorOdom2d" , "Main odometer" , extrinsics , &intrinsics ); * * // To create a odometry integrator, provide a type="ProcessorOdom2d", a name="main odometry", and a pointer to the parameters struct: * * auto params = make_shared<ParamsProcessorOdom2d>({...}); // fill in the derived struct (note: ProcessorOdom2d actually has no input params) * * ProcessorBasePtr processor_ptr = - * FactoryProcessor::get().create ( "ProcessorOdom2d" , "main odometry" , params ); + * FactoryProcessor::create ( "ProcessorOdom2d" , "main odometry" , params ); * * // Bind processor to sensor * sensor_ptr->addProcessor(processor_ptr); @@ -126,7 +126,7 @@ inline std::string FactoryParamsProcessor::getClass() const #define WOLF_REGISTER_PROCESSOR(ProcessorType) \ namespace{ const bool WOLF_UNUSED ProcessorType##Registered = \ - wolf::FactoryProcessor::get().registerCreator(#ProcessorType, ProcessorType::create); } \ + wolf::FactoryProcessor::registerCreator(#ProcessorType, ProcessorType::create); } \ typedef Factory<ProcessorBase, const std::string&, @@ -140,7 +140,7 @@ inline std::string AutoConfFactoryProcessor::getClass() const #define WOLF_REGISTER_PROCESSOR_AUTO(ProcessorType) \ namespace{ const bool WOLF_UNUSED ProcessorType##AutoConfRegistered = \ - wolf::AutoConfFactoryProcessor::get().registerCreator(#ProcessorType, ProcessorType::create); } \ + wolf::AutoConfFactoryProcessor::registerCreator(#ProcessorType, ProcessorType::create); } \ } /* namespace wolf */ diff --git a/include/core/sensor/factory_sensor.h b/include/core/sensor/factory_sensor.h index 3e787dd56cf710390cce53ed81d3b3800b2445b6..fb75e84cd1c27c6f3681d1a6a5065ba6d29ac9f4 100644 --- a/include/core/sensor/factory_sensor.h +++ b/include/core/sensor/factory_sensor.h @@ -79,7 +79,7 @@ namespace wolf * To create e.g. a SensorCamera, you type: * * \code - * auto camera_ptr = FactorySensor::get().create("SensorCamera", "Front-left camera", params_extrinsics, params_camera); + * auto camera_ptr = FactorySensor::create("SensorCamera", "Front-left camera", params_extrinsics, params_camera); * \endcode * * where ABSOLUTELY ALL input parameters are important. In particular, the sensor name "Front-left camera" will be used to identify this camera @@ -119,14 +119,14 @@ namespace wolf * Put the code either at global scope (you must define a dummy variable for this), * \code * namespace { - * const bool registered_camera = FactorySensor::get().registerCreator("SensorCamera", SensorCamera::create); + * const bool registered_camera = FactorySensor::registerCreator("SensorCamera", SensorCamera::create); * } * main () { ... } * \endcode * or inside your main(), where a direct call is possible: * \code * main () { - * FactorySensor::get().registerCreator("SensorCamera", SensorCamera::create); + * FactorySensor::registerCreator("SensorCamera", SensorCamera::create); * ... * } * \endcode @@ -135,7 +135,7 @@ namespace wolf * Put the code at the last line of the sensor_xxx.cpp file, * \code * namespace { - * const bool registered_camera = FactorySensor::get().registerCreator("SensorCamera", SensorCamera::create); + * const bool registered_camera = FactorySensor::registerCreator("SensorCamera", SensorCamera::create); * } * \endcode * Automatic registration is recommended in wolf, and implemented in the classes shipped with it. @@ -163,11 +163,11 @@ namespace wolf * * // Create a pointer to the struct of sensor parameters stored in a YAML file ( see FactoryParamsSensor ) * ParamsSensorCameraPtr intrinsics_1 = - * FactoryParamsSensor::get().create("ParamsSensorCamera", + * FactoryParamsSensor::create("ParamsSensorCamera", * camera_1.yaml); * * SensorBasePtr camera_1_ptr = - * FactorySensor::get().create ( "SensorCamera" , + * FactorySensor::create ( "SensorCamera" , * "Front-left camera" , * extrinsics_1 , * intrinsics_1 ); @@ -177,11 +177,11 @@ namespace wolf * Eigen::VectorXd extrinsics_2(7); * * ParamsSensorCameraPtr intrinsics_2 = - * FactoryParamsSensor::get().create("ParamsSensorCamera", + * FactoryParamsSensor::create("ParamsSensorCamera", * camera_2.yaml); * * SensorBasePtr camera_2_ptr = - * FactorySensor::get().create( "SensorCamera" , + * FactorySensor::create( "SensorCamera" , * "Front-right camera" , * extrinsics_2 , * intrinsics_2 ); @@ -214,7 +214,7 @@ inline std::string FactoryParamsSensor::getClass() const #define WOLF_REGISTER_SENSOR(SensorType) \ namespace{ const bool WOLF_UNUSED SensorType##Registered = \ - FactorySensor::get().registerCreator(#SensorType, SensorType::create); } \ + FactorySensor::registerCreator(#SensorType, SensorType::create); } \ typedef Factory<SensorBase, @@ -229,7 +229,7 @@ inline std::string AutoConfFactorySensor::getClass() const #define WOLF_REGISTER_SENSOR_AUTO(SensorType) \ namespace{ const bool WOLF_UNUSED SensorType##AutoConfRegistered = \ - AutoConfFactorySensor::get().registerCreator(#SensorType, SensorType::create); } \ + AutoConfFactorySensor::registerCreator(#SensorType, SensorType::create); } \ } /* namespace wolf */ diff --git a/include/core/solver/factory_solver.h b/include/core/solver/factory_solver.h index fc2031cdb245ee6364aa9de3bb38e834812e22a7..3e13e598fbd2726532333f2a71d4eabc5adcc1fb 100644 --- a/include/core/solver/factory_solver.h +++ b/include/core/solver/factory_solver.h @@ -37,7 +37,7 @@ inline std::string FactorySolver::getClass() const #define WOLF_REGISTER_SOLVER(SolverType) \ namespace{ const bool WOLF_UNUSED SolverType##Registered = \ - wolf::FactorySolver::get().registerCreator(#SolverType, SolverType::create); } \ + wolf::FactorySolver::registerCreator(#SolverType, SolverType::create); } \ } /* namespace wolf */ diff --git a/include/core/state_block/factory_state_block.h b/include/core/state_block/factory_state_block.h index 0ffb0f23bbd9d18896c68f01b2c3f48183f39cc7..efa0db6d76410f4437180b3bc9f2c844c2b878d5 100644 --- a/include/core/state_block/factory_state_block.h +++ b/include/core/state_block/factory_state_block.h @@ -68,19 +68,19 @@ namespace wolf * To create a StateQuaternion, you type: * * \code - * auto sq_ptr = FactoryStateBlock::get().create("StateQuaternion", Vector4d(1,0,0,0), false); + * auto sq_ptr = FactoryStateBlock::create("StateQuaternion", Vector4d(1,0,0,0), false); * \endcode * * If your problem has dimension 3 (e.g. is 3D), you can use the key "O" to create a StateQuaternion, * * \code - * auto sq_ptr = FactoryStateBlock::get().create("O", Vector4d(1,0,0,0), false); + * auto sq_ptr = FactoryStateBlock::create("O", Vector4d(1,0,0,0), false); * \endcode * * However if your problem has dimension 2 (e.g. is 2D), the key "O" will create a StateAngle, * * \code - * auto sa_ptr = FactoryStateBlock::get().create("O", Vector1d(angle_in_radians), false); + * auto sa_ptr = FactoryStateBlock::create("O", Vector1d(angle_in_radians), false); * \endcode * * Note: It is an error to provide state vectors of the wrong size (4 for 3D orientation, 1 for 2D). @@ -88,22 +88,22 @@ namespace wolf * To create StateBlocks to store 2D position and velocity, you type: * * \code - * auto sp2_ptr = FactoryStateBlock::get().create("StateBlock", Vector2d(1,2), false); - * auto sv2_ptr = FactoryStateBlock::get().create("StateBlock", Vector2d(1,2), false); + * auto sp2_ptr = FactoryStateBlock::create("StateBlock", Vector2d(1,2), false); + * auto sv2_ptr = FactoryStateBlock::create("StateBlock", Vector2d(1,2), false); * \endcode * * To create StateBlocks to store 2D position and velocity, you can also use the key letters: * * \code - * auto sp2_ptr = FactoryStateBlock::get().create("P", Vector2d(1,2), false); - * auto sv2_ptr = FactoryStateBlock::get().create("V", Vector2d(1,2), false); + * auto sp2_ptr = FactoryStateBlock::create("P", Vector2d(1,2), false); + * auto sv2_ptr = FactoryStateBlock::create("V", Vector2d(1,2), false); * \endcode * * To create StateBlocks to store 3D position and velocity, you type: * * \code - * auto sp3_ptr = FactoryStateBlock::get().create("P", Vector3d(1,2,3), false); - * auto sv3_ptr = FactoryStateBlock::get().create("V", Vector3d(1,2,3), false); + * auto sp3_ptr = FactoryStateBlock::create("P", Vector3d(1,2,3), false); + * auto sv3_ptr = FactoryStateBlock::create("V", Vector3d(1,2,3), false); * \endcode * * Note: for base state blocks, the size is determined by the size of the provided vector parameter `VectorXd& _state`. @@ -118,9 +118,9 @@ inline std::string FactoryStateBlock::getClass() const template<> inline StateBlockPtr FactoryStateBlock::create(const std::string& _type, const Eigen::VectorXd& _state, bool _fixed) { - typename CallbackMap::const_iterator creator_callback_it = callbacks_.find(_type); + typename CallbackMap::const_iterator creator_callback_it = get().callbacks_.find(_type); - if (creator_callback_it == callbacks_.end()) + if (creator_callback_it == get().callbacks_.end()) // not found: return StateBlock base return std::make_shared<StateBlock>(_state, _fixed); @@ -130,11 +130,11 @@ inline StateBlockPtr FactoryStateBlock::create(const std::string& _type, const E #define WOLF_REGISTER_STATEBLOCK(StateBlockType) \ namespace{ const bool WOLF_UNUSED StateBlockType##Registered = \ - FactoryStateBlock::get().registerCreator(#StateBlockType, StateBlockType::create); } \ + FactoryStateBlock::registerCreator(#StateBlockType, StateBlockType::create); } \ #define WOLF_REGISTER_STATEBLOCK_WITH_KEY(Key, StateBlockType) \ namespace{ const bool WOLF_UNUSED StateBlockType##RegisteredWith##Key = \ - FactoryStateBlock::get().registerCreator(#Key, StateBlockType::create); } \ + FactoryStateBlock::registerCreator(#Key, StateBlockType::create); } \ diff --git a/include/core/state_block/has_state_blocks.h b/include/core/state_block/has_state_blocks.h index 9462efe7a6dd314ff2ab94cbf923ee79f5c4e21e..8880fc0a2cfb09a46712a502601a801a1f923a39 100644 --- a/include/core/state_block/has_state_blocks.h +++ b/include/core/state_block/has_state_blocks.h @@ -301,9 +301,9 @@ inline VectorXd HasStateBlocks::getStateVector(const StateStructure& _sub_struct for (const char key : structure) { const auto& sb = getStateBlock(key); - if (!sb){ - WOLF_ERROR("Stateblock key ", key, " not in the structure"); - } + + assert(sb != nullptr && "Requested StateBlock key not in the structure"); + state.segment(index,sb->getSize()) = sb->getState(); index += sb->getSize(); } diff --git a/include/core/state_block/state_composite.h b/include/core/state_block/state_composite.h index 44fdc98d588d46cbdf996ff94ec788f38bf7ce9c..0d3cafcc80c602a4de1bf59b9ce7c2ddd9123c9a 100644 --- a/include/core/state_block/state_composite.h +++ b/include/core/state_block/state_composite.h @@ -49,8 +49,6 @@ class VectorComposite : public std::unordered_map < std::string, Eigen::VectorXd VectorComposite(const VectorXd& _v, const StateStructure& _structure, const std::list<int>& _sizes); VectorComposite(const StateStructure& _structure, const std::list<VectorXd>& _vectors); - unsigned int size(const StateStructure& _structure) const; - Eigen::VectorXd vector(const StateStructure& _structure) const; /** diff --git a/include/core/tree_manager/factory_tree_manager.h b/include/core/tree_manager/factory_tree_manager.h index a56dae93e138c0f99cc51f73884a50be9f252707..c9e91935fe52e08b2ea1bf0c264b5e67ca5ef4e1 100644 --- a/include/core/tree_manager/factory_tree_manager.h +++ b/include/core/tree_manager/factory_tree_manager.h @@ -40,7 +40,7 @@ inline std::string FactoryTreeManager::getClass() const #define WOLF_REGISTER_TREE_MANAGER(TreeManagerType) \ namespace{ const bool WOLF_UNUSED TreeManagerType##Registered = \ - wolf::FactoryTreeManager::get().registerCreator(#TreeManagerType, TreeManagerType::create); } \ + wolf::FactoryTreeManager::registerCreator(#TreeManagerType, TreeManagerType::create); } \ typedef Factory<TreeManagerBase, const std::string&, @@ -54,7 +54,7 @@ inline std::string AutoConfFactoryTreeManager::getClass() const #define WOLF_REGISTER_TREE_MANAGER_AUTO(TreeManagerType) \ namespace{ const bool WOLF_UNUSED TreeManagerType##AutoConfRegistered = \ - wolf::AutoConfFactoryTreeManager::get().registerCreator(#TreeManagerType, TreeManagerType::create); } \ + wolf::AutoConfFactoryTreeManager::registerCreator(#TreeManagerType, TreeManagerType::create); } \ } /* namespace wolf */ diff --git a/src/frame/frame_base.cpp b/src/frame/frame_base.cpp index de9fc606991d9f3b9cc73d52f130123c07e3d6e1..4147b98ca8dcd67d76fb732f11cbbee85cea9df8 100644 --- a/src/frame/frame_base.cpp +++ b/src/frame/frame_base.cpp @@ -28,7 +28,7 @@ FrameBase::FrameBase(const FrameType & _tp, const auto& key = pair_key_vec.first; const auto& vec = pair_key_vec.second; - StateBlockPtr sb = FactoryStateBlock::get().create(key, vec, false); // false = non fixed + StateBlockPtr sb = FactoryStateBlock::create(key, vec, false); // false = non fixed addStateBlock(key, sb); } @@ -54,7 +54,7 @@ FrameBase::FrameBase(const FrameType & _tp, const auto& key = string(1,ckey); const auto& vec = *vec_it; - StateBlockPtr sb = FactoryStateBlock::get().create(key, vec, false); // false = non fixed + StateBlockPtr sb = FactoryStateBlock::create(key, vec, false); // false = non fixed addStateBlock(key, sb); @@ -89,65 +89,6 @@ FrameBase::FrameBase(const FrameType & _tp, } } -FrameBase::FrameBase(const FrameType & _tp, - const TimeStamp& _ts, - const std::string _frame_structure, - const SizeEigen _dim, - const Eigen::VectorXd& _x) : - NodeBase("FRAME", "FrameBase"), - HasStateBlocks(_frame_structure), - trajectory_ptr_(), - frame_id_(++frame_id_count_), - type_(_tp), - time_stamp_(_ts) -{ - if(_frame_structure.compare("PO") == 0 and _dim == 2){ - assert(_x.size() == 3 && "Wrong state vector size. Should be 3 for PO 2D!"); - StateBlockPtr p_ptr ( std::make_shared<StateBlock> (_x.head <2> ( ) ) ); - StateBlockPtr o_ptr ( std::make_shared<StateAngle> ((double) _x(2) ) ); - addStateBlock("P", p_ptr); - addStateBlock("O", o_ptr); - this->setType("PO 2d"); - }else if(_frame_structure.compare("PO") == 0 and _dim == 3){ - assert(_x.size() == 7 && "Wrong state vector size. Should be 7 for PO 3D!"); - StateBlockPtr p_ptr ( std::make_shared<StateBlock> (_x.head <3> ( ) ) ); - StateBlockPtr o_ptr ( std::make_shared<StateQuaternion> (_x.tail <4> ( ) ) ); - addStateBlock("P", p_ptr); - addStateBlock("O", o_ptr); - this->setType("PO 3d"); - }else if(_frame_structure.compare("POV") == 0 and _dim == 3){ - // auto _x = Eigen::VectorXd::Zero(10); - assert(_x.size() == 10 && "Wrong state vector size. Should be 10 for POV 3D!"); - StateBlockPtr p_ptr ( std::make_shared<StateBlock> (_x.head <3> ( ) ) ); - StateBlockPtr o_ptr ( std::make_shared<StateQuaternion> (_x.segment <4> (3) ) ); - StateBlockPtr v_ptr ( std::make_shared<StateBlock> (_x.tail <3> ( ) ) ); - addStateBlock("P", p_ptr); - addStateBlock("O", o_ptr); - addStateBlock("V", v_ptr); - this->setType("POV 3d"); - }else if(_frame_structure.compare("POVCDL") == 0 and _dim == 3){ - // auto _x = Eigen::VectorXd::Zero(10); - assert(_x.size() == 19 && "Wrong state vector size. Should be 19 for POVCDL 3D!"); - StateBlockPtr p_ptr ( std::make_shared<StateBlock> (_x.head <3> ( ) ) ); - StateBlockPtr o_ptr ( std::make_shared<StateQuaternion> (_x.segment <4> (3 ) ) ); - StateBlockPtr v_ptr ( std::make_shared<StateBlock> (_x.segment <3> (7 ) ) ); - StateBlockPtr c_ptr ( std::make_shared<StateBlock> (_x.segment <3> (10) ) ); - StateBlockPtr cd_ptr ( std::make_shared<StateBlock> (_x.segment <3> (13) ) ); - StateBlockPtr Lc_ptr ( std::make_shared<StateBlock> (_x.segment <3> (16) ) ); - addStateBlock("P", p_ptr); - addStateBlock("O", o_ptr); - addStateBlock("V", v_ptr); - addStateBlock("C", c_ptr); - addStateBlock("D", cd_ptr); - addStateBlock("L", Lc_ptr); - this->setType("POVCDL 3d"); - }else{ - std::cout << _frame_structure << " ^^ " << _dim << std::endl; - throw std::runtime_error("Unknown frame structure"); - } - - -} FrameBase::~FrameBase() { diff --git a/src/landmark/landmark_base.cpp b/src/landmark/landmark_base.cpp index ada2bef9648e15ca6a2809d9bf35dc88f2e454ac..0fdd18775a2ea50c2ca6ee51ffaeaff9db7c85fa 100644 --- a/src/landmark/landmark_base.cpp +++ b/src/landmark/landmark_base.cpp @@ -311,7 +311,7 @@ bool LandmarkBase::check(CheckLog& _log, std::shared_ptr<NodeBase> _node_ptr, bo // Register landmark creator namespace { -const bool WOLF_UNUSED registered_lmk_base = FactoryLandmark::get().registerCreator("LandmarkBase", LandmarkBase::create); +const bool WOLF_UNUSED registered_lmk_base = FactoryLandmark::registerCreator("LandmarkBase", LandmarkBase::create); } } // namespace wolf diff --git a/src/map/map_base.cpp b/src/map/map_base.cpp index 4c13360effa052b61b189042a95d2ec92bedfa4d..67c37971b4e0517017f03b9cd798080fcd40808d 100644 --- a/src/map/map_base.cpp +++ b/src/map/map_base.cpp @@ -49,7 +49,7 @@ void MapBase::load(const std::string& _map_file_dot_yaml) for (unsigned int i = 0; i < nlandmarks; i++) { YAML::Node lmk_node = map["landmarks"][i]; - LandmarkBasePtr lmk_ptr = FactoryLandmark::get().create(lmk_node["type"].as<std::string>(), lmk_node); + LandmarkBasePtr lmk_ptr = FactoryLandmark::create(lmk_node["type"].as<std::string>(), lmk_node); lmk_ptr->link(shared_from_this()); } diff --git a/src/problem/problem.cpp b/src/problem/problem.cpp index 225e6f1ed184b3b51959ab4f125c1dbb9066eaec..4d2462f72d4e9bbf2fc6cb2c453389ea02028309 100644 --- a/src/problem/problem.cpp +++ b/src/problem/problem.cpp @@ -172,7 +172,7 @@ ProblemPtr Problem::autoSetup(ParamsServer &_server) std::string tree_manager_type = _server.getParam<std::string>("problem/tree_manager/type"); WOLF_TRACE("Tree Manager Type: ", tree_manager_type); if (tree_manager_type != "None" and tree_manager_type != "none") - problem->setTreeManager(AutoConfFactoryTreeManager::get().create(tree_manager_type, "tree manager", _server)); + problem->setTreeManager(AutoConfFactoryTreeManager::create(tree_manager_type, "tree manager", _server)); // Prior std::string prior_mode = _server.getParam<std::string>("problem/prior/mode"); @@ -213,7 +213,7 @@ SensorBasePtr Problem::installSensor(const std::string& _sen_type, // const Eigen::VectorXd& _extrinsics, // ParamsSensorBasePtr _intrinsics) { - SensorBasePtr sen_ptr = FactorySensor::get().create(_sen_type, _unique_sensor_name, _extrinsics, _intrinsics); + SensorBasePtr sen_ptr = FactorySensor::create(_sen_type, _unique_sensor_name, _extrinsics, _intrinsics); sen_ptr->link(getHardware()); return sen_ptr; } @@ -228,7 +228,7 @@ SensorBasePtr Problem::installSensor(const std::string& _sen_type, // if (_intrinsics_filename != "") { assert(file_exists(_intrinsics_filename) && "Cannot install sensor: intrinsics' YAML file does not exist."); - ParamsSensorBasePtr intr_ptr = FactoryParamsSensor::get().create(_sen_type, _intrinsics_filename); + ParamsSensorBasePtr intr_ptr = FactoryParamsSensor::create(_sen_type, _intrinsics_filename); return installSensor(_sen_type, _unique_sensor_name, _extrinsics, intr_ptr); } else @@ -240,7 +240,7 @@ SensorBasePtr Problem::installSensor(const std::string& _sen_type, // const std::string& _unique_sensor_name, // const ParamsServer& _server) { - SensorBasePtr sen_ptr = AutoConfFactorySensor::get().create(_sen_type, _unique_sensor_name, _server); + SensorBasePtr sen_ptr = AutoConfFactorySensor::create(_sen_type, _unique_sensor_name, _server); sen_ptr->link(getHardware()); return sen_ptr; } @@ -257,7 +257,7 @@ ProcessorBasePtr Problem::installProcessor(const std::string& _prc_type, // return ProcessorBasePtr(); } - ProcessorBasePtr prc_ptr = FactoryProcessor::get().create(_prc_type, _unique_processor_name, _prc_params); + ProcessorBasePtr prc_ptr = FactoryProcessor::create(_prc_type, _unique_processor_name, _prc_params); //Dimension check int prc_dim = prc_ptr->getDim(); @@ -283,7 +283,7 @@ ProcessorBasePtr Problem::installProcessor(const std::string& _prc_type, // else { assert(file_exists(_params_filename) && "Cannot install processor: parameters' YAML file does not exist."); - ParamsProcessorBasePtr prc_params = FactoryParamsProcessor::get().create(_prc_type, _params_filename); + ParamsProcessorBasePtr prc_params = FactoryParamsProcessor::create(_prc_type, _params_filename); return installProcessor(_prc_type, _unique_processor_name, sen_ptr, prc_params); } } @@ -297,7 +297,7 @@ ProcessorBasePtr Problem::installProcessor(const std::string& _prc_type, // if (sen_ptr == nullptr) throw std::runtime_error("Cannot bind processor. Reason: Sensor \"" + _corresponding_sensor_name + "\" not found. Check sensor name, it must match in sensor and processor!"); - ProcessorBasePtr prc_ptr = AutoConfFactoryProcessor::get().create(_prc_type, _unique_processor_name, _server); + ProcessorBasePtr prc_ptr = AutoConfFactoryProcessor::create(_prc_type, _unique_processor_name, _server); //Dimension check int prc_dim = prc_ptr->getDim(); @@ -331,12 +331,35 @@ FrameBasePtr Problem::emplaceFrame(FrameType _frame_key_type, // const SizeEigen _dim, // const Eigen::VectorXd& _frame_state) { + VectorComposite state; + SizeEigen index = 0; + SizeEigen size = 0; + for (const auto& ckey : _frame_structure) + { + const auto& key = string(1,ckey); // ckey is char + + if (key == "O") + { + if (_dim == 2) size = 1; + else size = 4; + } + else + size = _dim; + + assert (_frame_state.size() >= index+size && "State vector incompatible with given structure and dimension! Vector too small."); + + state.emplace(key, _frame_state.segment(index, size)); + + index += size; + } + + assert (_frame_state.size() == index && "State vector incompatible with given structure and dimension! Vector too large."); + auto frm = FrameBase::emplace<FrameBase>(trajectory_ptr_, _frame_key_type, _time_stamp, _frame_structure, - _dim, - _frame_state); + state); return frm; } @@ -440,6 +463,7 @@ VectorComposite Problem::getState(const StateStructure& _structure) const state.insert(pair_key_vec); } } + // check for empty blocks and fill them with zeros for (const auto& ckey : frame_structure_) { @@ -483,6 +507,15 @@ VectorComposite Problem::getState (const TimeStamp& _ts, const StateStructure& _ state.insert(pair_key_vec); } } + + // check for empty blocks and fill them with zeros + for (const auto& ckey : frame_structure_) + { + const auto& key = string(1,ckey); + if (state.count(key) == 0) + state.emplace(key, stateZero(key).at(key)); + } + return state; } diff --git a/src/processor/processor_tracker.cpp b/src/processor/processor_tracker.cpp index 7b5d5dec09eadb5aa13b84d9340c760adba3f7c4..ef801eb6d525375272fd95d89a50eec9bed4dc1e 100644 --- a/src/processor/processor_tracker.cpp +++ b/src/processor/processor_tracker.cpp @@ -201,7 +201,7 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) // make F; append incoming to new F FrameBasePtr frm = getProblem()->emplaceFrame(NON_ESTIMATED, incoming_ptr_->getTimeStamp(), - last_ptr_->getFrame()->getStateVector()); + last_ptr_->getFrame()->getState()); incoming_ptr_->link(frm); origin_ptr_ = last_ptr_; @@ -250,7 +250,7 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr) // Replace last frame for a new one in incoming FrameBasePtr frm = getProblem()->emplaceFrame(NON_ESTIMATED, incoming_ptr_->getTimeStamp(), - last_ptr_->getFrame()->getStateVector()); + last_ptr_->getFrame()->getState()); incoming_ptr_->link(frm); last_ptr_->getFrame()->remove(); // implicitly calling last_ptr_->remove(); diff --git a/src/state_block/state_block.cpp b/src/state_block/state_block.cpp index ea2c9a4cd4f32b4a1c49e1bfec6ad28efb397cbe..0280e2657a3e5bb0bd0dcc184b6800844ee68ef8 100644 --- a/src/state_block/state_block.cpp +++ b/src/state_block/state_block.cpp @@ -73,5 +73,5 @@ StateBlockPtr create_orientation(const Eigen::VectorXd& _state, bool _fixed) //WOLF_REGISTER_STATEBLOCK_WITH_KEY(O, wolf::create_orientation); namespace{ const bool __attribute__((used)) create_orientationRegisteredWithO = \ - FactoryStateBlock::get().registerCreator("O", wolf::create_orientation); } + FactoryStateBlock::registerCreator("O", wolf::create_orientation); } } diff --git a/src/state_block/state_composite.cpp b/src/state_block/state_composite.cpp index 612b8e53ec55d7e5b787a5aa0c49312d21dfe4a9..90b7f47c6b5ffa2a28374b5673827d325224430f 100644 --- a/src/state_block/state_composite.cpp +++ b/src/state_block/state_composite.cpp @@ -62,18 +62,6 @@ VectorComposite::VectorComposite (const StateStructure& _structure, const std::l } -unsigned int VectorComposite::size(const StateStructure &_structure) const -{ - unsigned int size = 0; - for (const auto& ckey : _structure) - { - std::string key(1,ckey); // ckey is char - const VectorXd& v = this->at(key); - size += v.size(); - } - return size; -} - Eigen::VectorXd VectorComposite::vector(const StateStructure &_structure) const { // traverse once with unordered_map access diff --git a/src/yaml/parser_yaml.cpp b/src/yaml/parser_yaml.cpp index 2d1aa8200790d5d5484b7c24c1f8dc78304a3218..d37d8c022de839efbdeddbdacae80007168a282e 100644 --- a/src/yaml/parser_yaml.cpp +++ b/src/yaml/parser_yaml.cpp @@ -497,13 +497,11 @@ void ParserYAML::parse() YAML::Node n; n = loadYAML(generatePath(file_)); - if (n.Type() == YAML::NodeType::Map) { for (auto it : n) { auto node = it.second; - // WOLF_INFO("WUT ", it.first); std::vector<std::string> tags = std::vector<std::string>(); if (it.first.as<std::string>() != "config") walkTreeR(node, tags, it.first.as<std::string>()); @@ -515,7 +513,15 @@ void ParserYAML::parse() if (node_key != "problem" and node_key != "sensors" and node_key != "processors" and node_key != "ROS subscriber" and node_key != "ROS publisher") { - walkTreeR(itt.second, tags, node_key); + std::regex rr("follow"); + if (not std::regex_match(node_key, rr)) + { + walkTreeR(itt.second, tags, node_key); + } + else + { + walkTree(itt.second.as<std::string>(), tags, ""); + } } } } diff --git a/src/yaml/processor_odom_3d_yaml.cpp b/src/yaml/processor_odom_3d_yaml.cpp index 0a0884454f126a46e169c5edc25d26b3bb04ef64..9c21e3842304e475146194bc04da7be9f73de396 100644 --- a/src/yaml/processor_odom_3d_yaml.cpp +++ b/src/yaml/processor_odom_3d_yaml.cpp @@ -48,7 +48,7 @@ static ParamsProcessorBasePtr createProcessorOdom3dParams(const std::string & _f } // Register in the FactorySensor -const bool WOLF_UNUSED registered_prc_odom_3d = FactoryParamsProcessor::get().registerCreator("ProcessorOdom3d", createProcessorOdom3dParams); +const bool WOLF_UNUSED registered_prc_odom_3d = FactoryParamsProcessor::registerCreator("ProcessorOdom3d", createProcessorOdom3dParams); } // namespace [unnamed] diff --git a/src/yaml/sensor_odom_2d_yaml.cpp b/src/yaml/sensor_odom_2d_yaml.cpp index b8ef1a083111a877b5b283c13d751df88a5af20d..a33b7e3c7d1cf0b73374aa10510083bf9e47f9fd 100644 --- a/src/yaml/sensor_odom_2d_yaml.cpp +++ b/src/yaml/sensor_odom_2d_yaml.cpp @@ -40,7 +40,7 @@ static ParamsSensorBasePtr createParamsSensorOdom2d(const std::string & _filenam } // Register in the FactorySensor -const bool WOLF_UNUSED registered_odom_2d_intr = FactoryParamsSensor::get().registerCreator("SensorOdom2d", createParamsSensorOdom2d); +const bool WOLF_UNUSED registered_odom_2d_intr = FactoryParamsSensor::registerCreator("SensorOdom2d", createParamsSensorOdom2d); } // namespace [unnamed] diff --git a/src/yaml/sensor_odom_3d_yaml.cpp b/src/yaml/sensor_odom_3d_yaml.cpp index 5b700eb8210b337d59f1186be90b869fe123874f..edba0bd17d21b86508e01a407b4dea5bf41f91bd 100644 --- a/src/yaml/sensor_odom_3d_yaml.cpp +++ b/src/yaml/sensor_odom_3d_yaml.cpp @@ -42,7 +42,7 @@ static ParamsSensorBasePtr createParamsSensorOdom3d(const std::string & _filenam } // Register in the FactorySensor -const bool WOLF_UNUSED registered_odom_3d_intr = FactoryParamsSensor::get().registerCreator("SensorOdom3d", createParamsSensorOdom3d); +const bool WOLF_UNUSED registered_odom_3d_intr = FactoryParamsSensor::registerCreator("SensorOdom3d", createParamsSensorOdom3d); } // namespace [unnamed] diff --git a/test/gtest_factor_diff_drive.cpp b/test/gtest_factor_diff_drive.cpp index 713fd1c1b26624b84612a1e721eb4924db08777c..f2e8e5f6014811ea3b99c2843fa4b0e8e94c5b72 100644 --- a/test/gtest_factor_diff_drive.cpp +++ b/test/gtest_factor_diff_drive.cpp @@ -163,14 +163,12 @@ class FactorDiffDriveTest : public testing::Test KEY, 0.0, "PO", - 2, - Vector3d(0,0,0)); + std::list<VectorXd>{Vector2d(0,0), Vector1d(0)}); F1 = FrameBase::emplace<FrameBase>(trajectory, KEY, 1.0, "PO", - 2, - Vector3d(1,0,0)); + std::list<VectorXd>{Vector2d(1,0), Vector1d(0)}); // captures C0 = CaptureBase::emplace<CaptureDiffDrive>(F0, diff --git a/test/gtest_factory_state_block.cpp b/test/gtest_factory_state_block.cpp index fbded073c2e9a226c0f66b1feb34388bd5c06dfc..726fa7e47566cae2c1071b7c3511ace30f03308e 100644 --- a/test/gtest_factory_state_block.cpp +++ b/test/gtest_factory_state_block.cpp @@ -41,20 +41,20 @@ TEST_F(TestInit, testName) } */ -TEST(FactoryStateBlock, get_getClass) -{ - const auto& f = FactoryStateBlock::get(); - - const std::string& s = f.getClass(); - - ASSERT_EQ(s, "FactoryStateBlock"); -} +//TEST(FactoryStateBlock, get_getClass) +//{ +// const auto& f = FactoryStateBlock::get(); +// +// const std::string& s = f.getClass(); +// +// ASSERT_EQ(s, "FactoryStateBlock"); +//} TEST(FactoryStateBlock, creator_default) { - auto sbp = FactoryStateBlock::get().create("P", Eigen::Vector3d(1,2,3), false); - auto sbv = FactoryStateBlock::get().create("V", Eigen::Vector2d(4,5), false); - auto sbw = FactoryStateBlock::get().create("W", Eigen::Vector1d(6), false); + auto sbp = FactoryStateBlock::create("P", Eigen::Vector3d(1,2,3), false); + auto sbv = FactoryStateBlock::create("V", Eigen::Vector2d(4,5), false); + auto sbw = FactoryStateBlock::create("W", Eigen::Vector1d(6), false); ASSERT_MATRIX_APPROX(Eigen::Vector3d(1,2,3) , sbp->getState(), 1e-20); ASSERT_MATRIX_APPROX(Eigen::Vector2d(4,5) , sbv->getState(), 1e-20); @@ -67,9 +67,9 @@ TEST(FactoryStateBlock, creator_default) TEST(FactoryStateBlock, creator_StateBlock) { - auto sbp = FactoryStateBlock::get().create("StateBlock", Eigen::Vector3d(1,2,3), false); - auto sbv = FactoryStateBlock::get().create("StateBlock", Eigen::Vector2d(4,5), true); - auto sbw = FactoryStateBlock::get().create("StateBlock", Eigen::Vector1d(6), false); + auto sbp = FactoryStateBlock::create("StateBlock", Eigen::Vector3d(1,2,3), false); + auto sbv = FactoryStateBlock::create("StateBlock", Eigen::Vector2d(4,5), true); + auto sbw = FactoryStateBlock::create("StateBlock", Eigen::Vector1d(6), false); ASSERT_MATRIX_APPROX(Eigen::Vector3d(1,2,3) , sbp->getState(), 1e-20); ASSERT_MATRIX_APPROX(Eigen::Vector2d(4,5) , sbv->getState(), 1e-20); @@ -86,7 +86,7 @@ TEST(FactoryStateBlock, creator_StateBlock) TEST(FactoryStateBlock, creator_Quaternion) { - auto sbq = FactoryStateBlock::get().create("StateQuaternion", Eigen::Vector4d(1,2,3,4), false); + auto sbq = FactoryStateBlock::create("StateQuaternion", Eigen::Vector4d(1,2,3,4), false); ASSERT_EQ(sbq->getSize() , 4); ASSERT_EQ(sbq->getLocalSize(), 3); @@ -95,7 +95,7 @@ TEST(FactoryStateBlock, creator_Quaternion) TEST(FactoryStateBlock, creator_Angle) { - auto sba = FactoryStateBlock::get().create("StateAngle", Eigen::Vector1d(1), false); + auto sba = FactoryStateBlock::create("StateAngle", Eigen::Vector1d(1), false); ASSERT_EQ(sba->getSize() , 1); ASSERT_EQ(sba->getLocalSize(), 1); @@ -104,7 +104,7 @@ TEST(FactoryStateBlock, creator_Angle) TEST(FactoryStateBlock, creator_Homogeneous3d) { - auto sbh = FactoryStateBlock::get().create("StateHomogeneous3d", Eigen::Vector4d(1,2,3,4), false); + auto sbh = FactoryStateBlock::create("StateHomogeneous3d", Eigen::Vector4d(1,2,3,4), false); ASSERT_EQ(sbh->getSize() , 4); ASSERT_EQ(sbh->getLocalSize(), 3); @@ -113,7 +113,7 @@ TEST(FactoryStateBlock, creator_Homogeneous3d) TEST(FactoryStateBlock, creator_H) { - auto sbh = FactoryStateBlock::get().create("H", Eigen::Vector4d(1,2,3,4), false); + auto sbh = FactoryStateBlock::create("H", Eigen::Vector4d(1,2,3,4), false); ASSERT_EQ(sbh->getSize() , 4); ASSERT_EQ(sbh->getLocalSize(), 3); @@ -122,7 +122,7 @@ TEST(FactoryStateBlock, creator_H) TEST(FactoryStateBlock, creator_O_is_quaternion) { - auto sbq = FactoryStateBlock::get().create("O", Eigen::Vector4d(1,2,3,4), false); + auto sbq = FactoryStateBlock::create("O", Eigen::Vector4d(1,2,3,4), false); ASSERT_EQ(sbq->getSize() , 4); ASSERT_EQ(sbq->getLocalSize(), 3); @@ -131,7 +131,7 @@ TEST(FactoryStateBlock, creator_O_is_quaternion) TEST(FactoryStateBlock, creator_O_is_angle) { - auto sba = FactoryStateBlock::get().create("O", Eigen::Vector1d(1), false); + auto sba = FactoryStateBlock::create("O", Eigen::Vector1d(1), false); ASSERT_EQ(sba->getSize() , 1); ASSERT_EQ(sba->getLocalSize(), 1); @@ -140,7 +140,7 @@ TEST(FactoryStateBlock, creator_O_is_angle) TEST(FactoryStateBlock, creator_O_is_wrong_size) { - ASSERT_THROW(auto sba = FactoryStateBlock::get().create("O", Eigen::Vector2d(1,2), false) , std::length_error); + ASSERT_THROW(auto sba = FactoryStateBlock::create("O", Eigen::Vector2d(1,2), false) , std::length_error); } int main(int argc, char **argv) diff --git a/test/gtest_problem.cpp b/test/gtest_problem.cpp index 8ec6ebcae42990451909902ee8f245c35fbf16c4..20e272cfa698f904e3bb63c6d7730b11e0fe4568 100644 --- a/test/gtest_problem.cpp +++ b/test/gtest_problem.cpp @@ -227,17 +227,13 @@ TEST(Problem, emplaceFrame_factory) FrameBasePtr f1 = P->emplaceFrame(KEY, 1, "PO" , 3, VectorXd(7) ); FrameBasePtr f2 = P->emplaceFrame(KEY, 2, "POV", 3, VectorXd(10) ); - // std::cout << "f0: type PO 2d? " << f0->getType() << std::endl; - // std::cout << "f1: type PO 3d? " << f1->getType() << std::endl; - // std::cout << "f2: type POV 3d? " << f2->getType() << std::endl; - - ASSERT_EQ(f0->getType().compare("PO 2d"), 0); - ASSERT_EQ(f1->getType().compare("PO 3d"), 0); - ASSERT_EQ(f2->getType().compare("POV 3d"), 0); - // check that all frames are effectively in the trajectory ASSERT_EQ(P->getTrajectory()->getFrameList().size(), (SizeStd) 3); + ASSERT_EQ(f0->getStateVector().size(), 3 ); + ASSERT_EQ(f1->getStateVector().size(), 7 ); + ASSERT_EQ(f2->getStateVector().size(), 10); + // check that all frames are linked to Problem ASSERT_EQ(f0->getProblem(), P); ASSERT_EQ(f1->getProblem(), P); @@ -497,5 +493,6 @@ TEST(Problem, check) int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); +// ::testing::GTEST_FLAG(filter) = "Problem.emplaceFrame_factory"; return RUN_ALL_TESTS(); } diff --git a/test/gtest_state_composite.cpp b/test/gtest_state_composite.cpp index 4d5a420119526c2fc1984aecfc22e01b40d0084b..56f705aa3b9c3689a076989fcd8e30896d80fe13 100644 --- a/test/gtest_state_composite.cpp +++ b/test/gtest_state_composite.cpp @@ -331,20 +331,6 @@ TEST(VectorComposite, unary_Minus) ASSERT_MATRIX_APPROX((-x).at("O"), Vector3d(-2,-2,-2), 1e-20); } -TEST(VectorComposite, size) -{ - VectorComposite x; - - x.emplace("P", Vector2d(1,1)); - x.emplace("O", Vector3d(2,2,2)); - x.emplace("V", Vector4d(3,3,3,3)); - - ASSERT_EQ(x.size("PO"), 5); - ASSERT_EQ(x.size("VO"), 7); - ASSERT_EQ(x.size("PVO"), 9); - ASSERT_EQ(x.size("OPV"), 9); -} - TEST(VectorComposite, stateVector) { VectorComposite x;