diff --git a/include/laser/capture/capture_laser_2d.h b/include/laser/capture/capture_laser_2d.h index 579f4475b3e2bd3a59fd41c4fb3fb9dc24db883a..fca364b7234505008a311b93ebbe60007ed4c4a6 100644 --- a/include/laser/capture/capture_laser_2d.h +++ b/include/laser/capture/capture_laser_2d.h @@ -47,6 +47,7 @@ class CaptureLaser2d : public CaptureBase CaptureLaser2d(const TimeStamp& _ts, SensorBasePtr _sensor_ptr, const std::vector<float>& _ranges); ~CaptureLaser2d() override = default; + const laserscanutils::LaserScan& getScan() const; laserscanutils::LaserScan& getScan(); void setSensor(const SensorBasePtr sensor_ptr) override; @@ -57,6 +58,11 @@ class CaptureLaser2d : public CaptureBase }; +inline const laserscanutils::LaserScan& CaptureLaser2d::getScan() const +{ + return scan_; +} + inline laserscanutils::LaserScan& CaptureLaser2d::getScan() { return scan_; diff --git a/include/laser/factor/factor_point_2d.h b/include/laser/factor/factor_point_2d.h index 30b4884d08fa0874c97722f47f0804b3b0e3b3c4..15d6ee7185659a0e5068388748140d09993ce02b 100644 --- a/include/laser/factor/factor_point_2d.h +++ b/include/laser/factor/factor_point_2d.h @@ -88,6 +88,10 @@ class FactorPoint2d: public FactorAutodiff<FactorPoint2d, 2,2,1,2,1,2> * @brief getLandmarkPtr * @return */ + LandmarkPolyline2dConstPtr getLandmark() const + { + return std::static_pointer_cast<const LandmarkPolyline2d>(getLandmarkOther()); + } LandmarkPolyline2dPtr getLandmark() { return std::static_pointer_cast<LandmarkPolyline2d>(getLandmarkOther()); @@ -97,7 +101,7 @@ class FactorPoint2d: public FactorAutodiff<FactorPoint2d, 2,2,1,2,1,2> * @brief getLandmarkPointId * @return */ - int getLandmarkPointId() + int getLandmarkPointId() const { return landmark_point_id_; } @@ -106,7 +110,7 @@ class FactorPoint2d: public FactorAutodiff<FactorPoint2d, 2,2,1,2,1,2> * @brief getFeaturePointId * @return */ - unsigned int getFeaturePointId() + unsigned int getFeaturePointId() const { return feature_point_id_; } @@ -115,6 +119,10 @@ class FactorPoint2d: public FactorAutodiff<FactorPoint2d, 2,2,1,2,1,2> * @brief getLandmarkPointPtr * @return */ + StateBlockConstPtr getLandmarkPoint() const + { + return point_state_ptr_; + } StateBlockPtr getLandmarkPoint() { return point_state_ptr_; diff --git a/include/laser/factor/factor_point_to_line_2d.h b/include/laser/factor/factor_point_to_line_2d.h index cc975d802a098f3dc610bb5b185e5184e489c69c..f2035e32e3f84b8ff44c1bae60b95ecb6636f4e4 100644 --- a/include/laser/factor/factor_point_to_line_2d.h +++ b/include/laser/factor/factor_point_to_line_2d.h @@ -36,8 +36,8 @@ WOLF_PTR_TYPEDEFS(FactorPointToLine2d); class FactorPointToLine2d: public FactorAutodiff<FactorPointToLine2d, 1,2,1,2,1,2,2> { protected: - int landmark_point_id_; - int landmark_point_aux_id_; + int landmark_point_id_; + int landmark_point_aux_id_; unsigned int feature_point_id_; StateBlockPtr point_state_ptr_; StateBlockPtr point_aux_state_ptr_; @@ -91,31 +91,45 @@ class FactorPointToLine2d: public FactorAutodiff<FactorPointToLine2d, 1,2,1,2,1, ~FactorPointToLine2d() override = default; + LandmarkPolyline2dConstPtr getLandmark() const + { + return std::static_pointer_cast<const LandmarkPolyline2d>( getLandmarkOther() ); + } LandmarkPolyline2dPtr getLandmark() { return std::static_pointer_cast<LandmarkPolyline2d>( getLandmarkOther() ); } - int getLandmarkPointId() + int getLandmarkPointId() const { return landmark_point_id_; } - int getLandmarkPointAuxId() + int getLandmarkPointAuxId() const { return landmark_point_aux_id_; } - unsigned int getFeaturePointId() + unsigned int getFeaturePointId() const { return feature_point_id_; } + StateBlockConstPtr getLandmarkPoint() const + { + return point_state_ptr_; + } + StateBlockPtr getLandmarkPoint() { return point_state_ptr_; } + StateBlockConstPtr getLandmarkPointAux() const + { + return point_state_ptr_; + } + StateBlockPtr getLandmarkPointAux() { return point_state_ptr_; diff --git a/include/laser/feature/feature_polyline_2d.h b/include/laser/feature/feature_polyline_2d.h index b889c49b827b3f76f197b9f4fa7f801285cecf82..c5cd36350ff9757a9dcbc058ae65d2292e8ada64 100644 --- a/include/laser/feature/feature_polyline_2d.h +++ b/include/laser/feature/feature_polyline_2d.h @@ -55,13 +55,8 @@ class FeaturePolyline2d : public FeatureBase int getNPoints() const; }; -//<<<<<<< HEAD inline FeaturePolyline2d::FeaturePolyline2d(const Eigen::MatrixXd& _points, const Eigen::MatrixXd& _points_cov, const bool& _first_defined, const bool& _last_defined) : FeatureBase("FeaturePolyline2d", Eigen::Vector1d::Zero(), Eigen::Vector1d::Ones()), -//======= -//inline FeaturePolyline2d::FeaturePolyline2d(const Eigen::MatrixXd& _points, const Eigen::MatrixXd& _points_cov, const bool& _first_defined, const bool& _last_defined) : -// FeatureBase("POLYLINE 2d", Eigen::Vector1d::Zero(), Eigen::Vector1d::Ones()), -//>>>>>>> 8-replace-scalar-to-double points_(_points), points_cov_(_points_cov), first_defined_(_first_defined), diff --git a/include/laser/feature/feature_scene_falko.h b/include/laser/feature/feature_scene_falko.h index c571db55da8177dadbd4e63818317ce2271a76d3..69d449fe653d7b3003d61b4230f553ba2bdf4b90 100644 --- a/include/laser/feature/feature_scene_falko.h +++ b/include/laser/feature/feature_scene_falko.h @@ -48,29 +48,11 @@ template <typename D> class FeatureSceneFalko : public FeatureBase std::shared_ptr<laserscanutils::SceneFalko<D>> scene_; }; -WOLF_PTR_TYPEDEFS(FeatureSceneFalkoBsc); +typedef FeatureSceneFalko<laserscanutils::bsc> FeatureSceneFalkoBsc; +WOLF_DECLARED_PTR_TYPEDEFS(FeatureSceneFalkoBsc); -class FeatureSceneFalkoBsc : public FeatureSceneFalko<laserscanutils::bsc> -{ - public: - FeatureSceneFalkoBsc(const std::shared_ptr<laserscanutils::SceneFalko<laserscanutils::bsc>> _falko_scene) - : FeatureSceneFalko(_falko_scene) - { - } - ~FeatureSceneFalkoBsc(); -}; - -WOLF_PTR_TYPEDEFS(FeatureSceneFalkoCgh); - -class FeatureSceneFalkoCgh : public FeatureSceneFalko<laserscanutils::cgh> -{ - public: - FeatureSceneFalkoCgh(const std::shared_ptr<laserscanutils::SceneFalko<laserscanutils::cgh>> _falko_scene) - : FeatureSceneFalko(_falko_scene) - { - } - ~FeatureSceneFalkoCgh() override{}; -}; +typedef FeatureSceneFalko<laserscanutils::cgh> FeatureSceneFalkoCgh; +WOLF_DECLARED_PTR_TYPEDEFS(FeatureSceneFalkoCgh); } // namespace wolf diff --git a/include/laser/landmark/landmark_polyline_2d.h b/include/laser/landmark/landmark_polyline_2d.h index 4d1574cf3bb765c674435ba65cd2afb1c632b584..4d930a8edcc460bf117d9f4fd38fdde6c1bb4da0 100644 --- a/include/laser/landmark/landmark_polyline_2d.h +++ b/include/laser/landmark/landmark_polyline_2d.h @@ -39,6 +39,12 @@ namespace wolf { +static std::vector<char> available_chars({'0','1','2','3','4','5','6','7','8','9', + 'a','b','c','d','e','f','g','h','i','j','k','l', + 'm','n','r','s','t','u','v','w','x','y','z', + 'A','B','C','D','E','F','G','H','I','J','K','L', + 'M','N','R','S','T','U','V','W','X','Y','Z'}); + //landmark classification typedef enum { @@ -92,7 +98,7 @@ WOLF_LIST_TYPEDEFS(LandmarkPolyline2d); class LandmarkPolyline2d : public LandmarkBase { protected: - std::map<int,StateBlockPtr> point_state_ptr_map_; ///< polyline points state blocks + std::map<int,StateBlockPtr> point_state_map_; ///< polyline points state blocks bool first_defined_; ///< Wether the first point is an extreme of a line or the line may continue bool last_defined_; ///< Wether the last point is an extreme of a line or the line may continue bool closed_; ///< Wether the polyline is closed or not @@ -101,19 +107,29 @@ class LandmarkPolyline2d : public LandmarkBase LandmarkPolyline2dPtr merged_in_lmk_; private: - - StateBlockPtr& firstStateBlock(); - StateBlockPtr& lastStateBlock(); + char idToChar(int id) const; + StateBlockPtr firstStateBlock(); + StateBlockPtr lastStateBlock(); public: - LandmarkPolyline2d(StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, const Eigen::MatrixXd& _points, const bool _first_defined, const bool _last_defined, unsigned int _first_id = 0); - LandmarkPolyline2d(StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, const Eigen::MatrixXd& _points, const bool _first_defined, const bool _last_defined, unsigned int _first_id, PolylineRectangularClass _class); + LandmarkPolyline2d(StateBlockPtr _p_ptr, + StateBlockPtr _o_ptr, + const Eigen::MatrixXd& _points, + const bool _first_defined, + const bool _last_defined, + unsigned int _first_id = 0); + LandmarkPolyline2d(StateBlockPtr _p_ptr, + StateBlockPtr _o_ptr, + const Eigen::MatrixXd& _points, + const bool _first_defined, + const bool _last_defined, + unsigned int _first_id, + PolylineRectangularClass _class); ~LandmarkPolyline2d() override; /** \brief Gets a const reference to the point state block pointer vector **/ - std::map<int,StateBlockPtr>& getPointStatePtrMap(); - + std::map<int,StateBlockPtr>& getPointStateMap(); /** \brief Gets wether the first/last points are defined or not **/ @@ -126,7 +142,8 @@ class LandmarkPolyline2d : public LandmarkBase /** \brief Get the landmark pointer in which was merged (nullptr in case of no merged) **/ - LandmarkPolyline2dPtr getMergedInLandmark() const; + LandmarkPolyline2dConstPtr getMergedInLandmark() const; + LandmarkPolyline2dPtr getMergedInLandmark(); /** \brief Set the landmark pointer in which was merged **/ @@ -134,7 +151,7 @@ class LandmarkPolyline2d : public LandmarkBase /** \brief Gets whether the given state block point is defined or not (assumes the state block is in the landmark) **/ - bool isDefined(StateBlockPtr _state_block) const; + bool isDefined(StateBlockConstPtr _state_block) const; /** \brief Sets the first/last extreme point **/ @@ -152,18 +169,15 @@ class LandmarkPolyline2d : public LandmarkBase int getPrevValidId(const int& i) const; int getVersion() const; - const Eigen::VectorXd getPointVector(int _i) const; + Eigen::VectorXd getPointVector(int _i) const; Eigen::MatrixXd computePointsGlobal() const; Eigen::MatrixXd computePointsGlobal(const int& _from_id, const int& _to_id) const; Eigen::MatrixXd computePointsCovGlobal() const; + StateBlockConstPtr getPointStateBlock(int _i) const; StateBlockPtr getPointStateBlock(int _i); - /** \brief Gets a vector of all state blocks pointers - **/ - virtual std::vector<StateBlockPtr> getPointsStateBlockVector() const; - /** \brief Adds a new point to the landmark * \param _point: the point to be added * \param _extreme: if its extreme or not @@ -219,11 +233,6 @@ class LandmarkPolyline2d : public LandmarkBase **/ PolylineRectangularClass getClassification() const; - /** \brief Adds all stateBlocks of the frame to the wolfProblem list of new stateBlocks - **/ - virtual void registerNewStateBlocks() const; - virtual void removeStateBlocks(); - /** Factory method to create new landmarks from YAML nodes */ static LandmarkBasePtr create(const YAML::Node& _lmk_node); @@ -240,19 +249,19 @@ class LandmarkPolyline2d : public LandmarkBase // STL #include <iterator> -inline StateBlockPtr& LandmarkPolyline2d::firstStateBlock() +inline StateBlockPtr LandmarkPolyline2d::firstStateBlock() { - return point_state_ptr_map_.begin()->second; + return point_state_map_.begin()->second; } -inline StateBlockPtr& LandmarkPolyline2d::lastStateBlock() +inline StateBlockPtr LandmarkPolyline2d::lastStateBlock() { - return point_state_ptr_map_.rbegin()->second; + return point_state_map_.rbegin()->second; } -inline std::map<int,StateBlockPtr>& LandmarkPolyline2d::getPointStatePtrMap() +inline std::map<int,StateBlockPtr>& LandmarkPolyline2d::getPointStateMap() { - return point_state_ptr_map_; + return point_state_map_; } inline bool LandmarkPolyline2d::isFirstDefined() const @@ -267,7 +276,7 @@ inline bool LandmarkPolyline2d::isLastDefined() const inline bool LandmarkPolyline2d::isValidId(const int& i) const { - return point_state_ptr_map_.count(i) != 0; + return point_state_map_.count(i) != 0; }; inline bool LandmarkPolyline2d::isClosed() const @@ -275,7 +284,15 @@ inline bool LandmarkPolyline2d::isClosed() const return closed_; } -inline LandmarkPolyline2dPtr LandmarkPolyline2d::getMergedInLandmark() const +inline LandmarkPolyline2dConstPtr LandmarkPolyline2d::getMergedInLandmark() const +{ + // recursive call + if (merged_in_lmk_ != nullptr && merged_in_lmk_->getMergedInLandmark() != nullptr) + return merged_in_lmk_->getMergedInLandmark(); + return merged_in_lmk_; +} + +inline LandmarkPolyline2dPtr LandmarkPolyline2d::getMergedInLandmark() { // recursive call if (merged_in_lmk_ != nullptr && merged_in_lmk_->getMergedInLandmark() != nullptr) @@ -283,12 +300,12 @@ inline LandmarkPolyline2dPtr LandmarkPolyline2d::getMergedInLandmark() const return merged_in_lmk_; } -inline bool LandmarkPolyline2d::isDefined(StateBlockPtr _state_block) const +inline bool LandmarkPolyline2d::isDefined(StateBlockConstPtr _state_block) const { - if (_state_block == point_state_ptr_map_.begin()->second) + if (_state_block == point_state_map_.begin()->second) return first_defined_; - if (_state_block == point_state_ptr_map_.rbegin()->second) + if (_state_block == point_state_map_.rbegin()->second) return last_defined_; return true; @@ -296,18 +313,18 @@ inline bool LandmarkPolyline2d::isDefined(StateBlockPtr _state_block) const inline int LandmarkPolyline2d::getNPoints() const { - return (int)point_state_ptr_map_.size(); + return (int)point_state_map_.size(); } inline int LandmarkPolyline2d::getNDefinedPoints() const { - return (int)point_state_ptr_map_.size() - (first_defined_ ? 0 : 1) - (last_defined_ ? 0 : 1); + return (int)point_state_map_.size() - (first_defined_ ? 0 : 1) - (last_defined_ ? 0 : 1); } inline std::vector<int> LandmarkPolyline2d::getValidIds() const { std::vector<int> valid_ids; - for (auto st_pair : point_state_ptr_map_) + for (auto st_pair : point_state_map_) valid_ids.push_back(st_pair.first); return valid_ids; @@ -316,17 +333,17 @@ inline std::vector<int> LandmarkPolyline2d::getValidIds() const inline int LandmarkPolyline2d::id2idx(int id) const { assert(isValidId(id)); - return std::distance(point_state_ptr_map_.begin(),point_state_ptr_map_.find(id)); + return std::distance(point_state_map_.begin(),point_state_map_.find(id)); } inline int LandmarkPolyline2d::getFirstId() const { - return point_state_ptr_map_.begin()->first; + return point_state_map_.begin()->first; } inline int LandmarkPolyline2d::getLastId() const { - return point_state_ptr_map_.rbegin()->first; + return point_state_map_.rbegin()->first; } @@ -337,7 +354,7 @@ inline int LandmarkPolyline2d::getNextValidId(const int& i) const if (i == getLastId() && closed_) return getFirstId(); - return std::next(point_state_ptr_map_.find(i))->first; + return std::next(point_state_map_.find(i))->first; } inline int LandmarkPolyline2d::getPrevValidId(const int& i) const @@ -347,7 +364,7 @@ inline int LandmarkPolyline2d::getPrevValidId(const int& i) const if (i == getFirstId() && closed_) return getLastId(); - return std::prev(point_state_ptr_map_.find(i))->first; + return std::prev(point_state_map_.find(i))->first; } inline int LandmarkPolyline2d::getVersion() const @@ -355,15 +372,6 @@ inline int LandmarkPolyline2d::getVersion() const return version_; } -inline std::vector<StateBlockPtr> LandmarkPolyline2d::getPointsStateBlockVector() const -{ - std::vector<StateBlockPtr> state_block_vec; - for (auto st_pair : point_state_ptr_map_) - state_block_vec.push_back(st_pair.second); - - return state_block_vec; -} - inline void LandmarkPolyline2d::classify(PolylineRectangularClass _class) { classification_ = _class; diff --git a/include/laser/processor/processor_loop_closure_falko.h b/include/laser/processor/processor_loop_closure_falko.h index 755b702fa89231af99f6b43330a6393e40bb1e7a..d05b1f5d083aee9bf1fb05bf1abfd5492d6bda28 100644 --- a/include/laser/processor/processor_loop_closure_falko.h +++ b/include/laser/processor/processor_loop_closure_falko.h @@ -604,7 +604,7 @@ class ProcessorLoopClosureFalko : public ProcessorLoopClosure int init_outData_; }; -WOLF_STRUCT_PTR_TYPEDEFS(ProcessorLoopClosureFalkoNnBsc); +WOLF_PTR_TYPEDEFS(ProcessorLoopClosureFalkoNnBsc); /** \brief A class that implements the loop closure with BSC descriptors and NN matcher **/ @@ -621,7 +621,7 @@ class ProcessorLoopClosureFalkoNnBsc ~ProcessorLoopClosureFalkoNnBsc() = default; }; -WOLF_STRUCT_PTR_TYPEDEFS(ProcessorLoopClosureFalkoAhtBsc); +WOLF_PTR_TYPEDEFS(ProcessorLoopClosureFalkoAhtBsc); /** \brief A class that implements the loop closure with BSC descriptors and AHT matcher **/ @@ -638,7 +638,7 @@ class ProcessorLoopClosureFalkoAhtBsc : public ProcessorLoopClosureFalko<lasersc ~ProcessorLoopClosureFalkoAhtBsc() = default; }; -WOLF_STRUCT_PTR_TYPEDEFS(ProcessorLoopClosureFalkoNnCgh); +WOLF_PTR_TYPEDEFS(ProcessorLoopClosureFalkoNnCgh); /** \brief A class that implements the loop closure with CGH descriptors and NN matcher **/ @@ -655,7 +655,7 @@ class ProcessorLoopClosureFalkoNnCgh : public ProcessorLoopClosureFalko<lasersca ~ProcessorLoopClosureFalkoNnCgh() = default; }; -WOLF_STRUCT_PTR_TYPEDEFS(ProcessorLoopClosureFalkoAhtCgh); +WOLF_PTR_TYPEDEFS(ProcessorLoopClosureFalkoAhtCgh); /** \brief A class that implements the loop closure with CGH descriptors and AHT matcher **/ diff --git a/include/laser/processor/processor_loop_closure_icp.h b/include/laser/processor/processor_loop_closure_icp.h index 5741d1110f42beca9cf2c473917bde618d164119..f2324d07117dfc842aefd4c02befd2c9f7f47cbc 100644 --- a/include/laser/processor/processor_loop_closure_icp.h +++ b/include/laser/processor/processor_loop_closure_icp.h @@ -138,7 +138,7 @@ class ProcessorLoopClosureIcp : public ProcessorLoopClosure */ std::map<double,MatchLoopClosurePtr> findLoopClosures(CaptureBasePtr _capture) override; - MatchLoopClosurePtr matchScans(CaptureLaser2dPtr cap_ref, CaptureLaser2dPtr cap_target) const; + MatchLoopClosurePtr matchScans(CaptureLaser2dPtr cap_ref, CaptureLaser2dPtr cap_target); /** \brief validates a loop closure */ @@ -150,7 +150,7 @@ class ProcessorLoopClosureIcp : public ProcessorLoopClosure /** \brief returns a list containing the loop closure frame candidates list */ - FrameBasePtrList generateSearchList(CaptureBasePtr) const; + FrameBasePtrList generateSearchList(CaptureBasePtr); }; } diff --git a/src/landmark/landmark_polyline_2d.cpp b/src/landmark/landmark_polyline_2d.cpp index bdd6566a85dcf025d6053ce62cfc7b47ab2e98a4..7be128506e5bd3451cb5399bf68b3e9d0c22139e 100644 --- a/src/landmark/landmark_polyline_2d.cpp +++ b/src/landmark/landmark_polyline_2d.cpp @@ -44,31 +44,25 @@ LandmarkPolyline2d::LandmarkPolyline2d(StateBlockPtr _p_ptr, StateBlockPtr _o_pt { } -//<<<<<<< HEAD LandmarkPolyline2d::LandmarkPolyline2d(StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, const Eigen::MatrixXd& _points, const bool _first_defined, const bool _last_defined, unsigned int _first_id, PolylineRectangularClass _class) : LandmarkBase("LandmarkPolyline2d", _p_ptr, _o_ptr), first_defined_(_first_defined), last_defined_(_last_defined), closed_(false), classification_(_class), version_(0), merged_in_lmk_(nullptr) -//======= -//LandmarkPolyline2d::LandmarkPolyline2d(StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, const Eigen::MatrixXd& _points, const bool _first_defined, const bool _last_defined, unsigned int _first_id, PolylineRectangularClass _class) : -// LandmarkBase("POLYLINE 2d", _p_ptr, _o_ptr), first_defined_(_first_defined), last_defined_(_last_defined), closed_(false), classification_(_class), version_(0), merged_in_lmk_(nullptr) -//>>>>>>> 8-replace-scalar-to-double { //std::cout << "LandmarkPolyline2d::LandmarkPolyline2d" << std::endl; assert(_points.cols() >= 2 && "2 points at least needed."); for (auto i = 0; i < _points.cols(); i++) - point_state_ptr_map_[i+_first_id] = std::make_shared<StateBlock>(_points.col(i).head<2>()); + point_state_map_[i+_first_id] = std::make_shared<StateBlock>(_points.col(i).head<2>()); if (!first_defined_) - firstStateBlock()->setLocalParametrization(std::make_shared<LocalParametrizationPolylineExtreme>(std::next(point_state_ptr_map_.begin())->second)); + firstStateBlock()->setLocalParametrization(std::make_shared<LocalParametrizationPolylineExtreme>(std::next(point_state_map_.begin())->second)); if (!last_defined_) - lastStateBlock()->setLocalParametrization(std::make_shared<LocalParametrizationPolylineExtreme>(std::next(point_state_ptr_map_.rbegin())->second)); + lastStateBlock()->setLocalParametrization(std::make_shared<LocalParametrizationPolylineExtreme>(std::next(point_state_map_.rbegin())->second)); //std::cout << "LandmarkPolyline2d " << id() << " created. First: " << getFirstId() << " last: "<< getLastId() << std::endl; } LandmarkPolyline2d::~LandmarkPolyline2d() { - removeStateBlocks(); } void LandmarkPolyline2d::setFirst(const Eigen::VectorXd& _point, bool _defined) @@ -91,16 +85,16 @@ void LandmarkPolyline2d::setLast(const Eigen::VectorXd& _point, bool _defined) defineLast(); } -const Eigen::VectorXd LandmarkPolyline2d::getPointVector(int _i) const +Eigen::VectorXd LandmarkPolyline2d::getPointVector(int _i) const { - assert(point_state_ptr_map_.find(_i) != point_state_ptr_map_.end()); - return point_state_ptr_map_.at(_i)->getState(); + assert(point_state_map_.find(_i) != point_state_map_.end()); + return point_state_map_.at(_i)->getState(); } StateBlockPtr LandmarkPolyline2d::getPointStateBlock(int _i) { - assert(point_state_ptr_map_.find(_i) != point_state_ptr_map_.end()); - return point_state_ptr_map_.at(_i); + assert(point_state_map_.find(_i) != point_state_map_.end()); + return point_state_map_.at(_i); } Eigen::MatrixXd LandmarkPolyline2d::computePointsGlobal() const @@ -155,8 +149,6 @@ Eigen::MatrixXd LandmarkPolyline2d::computePointsGlobal(const int& _from_id, con return points_global; } - - Eigen::MatrixXd LandmarkPolyline2d::computePointsCovGlobal() const { Eigen::MatrixXd points_cov_global = Eigen::MatrixXd::Zero(2,2*getNPoints()); @@ -173,6 +165,17 @@ Eigen::MatrixXd LandmarkPolyline2d::computePointsCovGlobal() const return points_cov_global; } +char LandmarkPolyline2d::idToChar(int id) const +{ + if (id < 0) + id += available_chars.size(); + + if (id < 0 or id >= available_chars.size()) + throw std::runtime_error("Too many points in LandmarkPolyline2d"); + + return available_chars[id]; +} + void LandmarkPolyline2d::addPoint(const Eigen::VectorXd& _point, const bool& _defined, const bool& _back) { assert(!closed_ && "adding point to a closed polyline!"); @@ -192,10 +195,9 @@ void LandmarkPolyline2d::addPoint(const Eigen::VectorXd& _point, const bool& _de (!_defined ? std::make_shared<LocalParametrizationPolylineExtreme>(lastStateBlock()) : nullptr)); - point_state_ptr_map_[getLastId()+1]= new_sb_ptr; - - if (getProblem()) - getProblem()->notifyStateBlock(new_sb_ptr,ADD); + auto point_id = getLastId()+1; + point_state_map_[point_id]= new_sb_ptr; + HasStateBlocks::addStateBlock(idToChar(point_id),new_sb_ptr,getProblem()); last_defined_ = _defined; } @@ -206,10 +208,9 @@ void LandmarkPolyline2d::addPoint(const Eigen::VectorXd& _point, const bool& _de (!_defined ? std::make_shared<LocalParametrizationPolylineExtreme>(firstStateBlock()) : nullptr)); - point_state_ptr_map_[getFirstId()-1] = new_sb_ptr; - - if (getProblem()) - getProblem()->notifyStateBlock(new_sb_ptr,ADD); + auto point_id = getLastId()-1; + point_state_map_[point_id] = new_sb_ptr; + HasStateBlocks::addStateBlock(idToChar(point_id),new_sb_ptr,getProblem()); first_defined_ = _defined; } @@ -241,10 +242,9 @@ void LandmarkPolyline2d::addPoints(const Eigen::MatrixXd& _points, const unsigne (i == _points.cols()-1 && !_defined ? std::make_shared<LocalParametrizationPolylineExtreme>(lastStateBlock()) : nullptr)); - point_state_ptr_map_[getLastId()+1] = new_sb_ptr; - - if (getProblem()) - getProblem()->notifyStateBlock(new_sb_ptr,ADD); + auto point_id = getLastId()+1; + point_state_map_[point_id]= new_sb_ptr; + HasStateBlocks::addStateBlock(idToChar(point_id),new_sb_ptr,getProblem()); } last_defined_ = _defined; } @@ -257,10 +257,9 @@ void LandmarkPolyline2d::addPoints(const Eigen::MatrixXd& _points, const unsigne (i == 0 && !_defined ? std::make_shared<LocalParametrizationPolylineExtreme>(firstStateBlock()) : nullptr)); - point_state_ptr_map_[getFirstId()-1] = new_sb_ptr; - - if (getProblem()) - getProblem()->notifyStateBlock(new_sb_ptr,ADD); + auto point_id = getLastId()-1; + point_state_map_[point_id] = new_sb_ptr; + HasStateBlocks::addStateBlock(idToChar(point_id),new_sb_ptr,getProblem()); } first_defined_ = _defined; } @@ -481,16 +480,13 @@ void LandmarkPolyline2d::setClosed() void LandmarkPolyline2d::mergePoints(int _remove_id, int _remain_id) { - assert(point_state_ptr_map_.find(_remove_id) != point_state_ptr_map_.end() && "removing an inexistent point"); - assert(point_state_ptr_map_.find(_remain_id) != point_state_ptr_map_.end() && "merging an inexistent point"); + assert(point_state_map_.find(_remove_id) != point_state_map_.end() && "removing an inexistent point"); + assert(point_state_map_.find(_remain_id) != point_state_map_.end() && "merging an inexistent point"); assert(!(_remain_id == getLastId() && !last_defined_) && "in merging points, the remaining point must be defined"); assert(!(_remain_id == getFirstId() && !first_defined_) && "in merging points, the remaining point must be defined"); //std::cout << "merge points: remove " << _remove_id << " and keep " << _remain_id << " (ids: " << getFirstId() << " to " << getLastId() << ")" << std::endl; - StateBlockPtr remove_state = getPointStateBlock(_remove_id); - //std::cout << "state block to remove " << remove_state->getState().transpose() << std::endl; - // Change factors from remove_state to remain_state FactorBasePtrList old_factors_list = getConstrainedByList(); //std::cout << "changing " << old_factors_list.size() << " factors." << std::endl; @@ -565,12 +561,11 @@ void LandmarkPolyline2d::mergePoints(int _remove_id, int _remain_id) last_defined_ = true; // Remove remove_state - if (getProblem() != nullptr) - getProblem()->notifyStateBlock(remove_state, REMOVE); + HasStateBlocks::removeStateBlock(idToChar(_remove_id)); //std::cout << "state removed " << std::endl; // remove element from deque - point_state_ptr_map_.erase(_remove_id); + point_state_map_.erase(_remove_id); //std::cout << "state removed from point vector " << std::endl; // new version @@ -774,7 +769,7 @@ bool LandmarkPolyline2d::tryClassify(const double& _dist_tol, std::vector<Polyli getPointStateBlock(points_ids[3])->setState(Eigen::Vector2d( classification_.L / 2,-classification_.W / 2)); } - for (auto st_pair : point_state_ptr_map_) + for (auto st_pair : point_state_map_) st_pair.second->fix(); return true; @@ -933,27 +928,6 @@ void LandmarkPolyline2d::mergeLandmark(const LandmarkPolyline2dPtr _merged_lmk, //std::cout << "\tLandmark deleted\n"; } -void LandmarkPolyline2d::registerNewStateBlocks() const -{ - LandmarkBase::registerNewStateBlocks(getProblem()); - if (getProblem()) - for (auto state_it : point_state_ptr_map_) - getProblem()->notifyStateBlock(state_it.second, ADD); -} - -void LandmarkPolyline2d::removeStateBlocks() -{ - auto sbp_pair = point_state_ptr_map_.begin(); - while (sbp_pair != point_state_ptr_map_.end()) - { - if (getProblem()) - getProblem()->notifyStateBlock(sbp_pair->second, REMOVE); - - sbp_pair = point_state_ptr_map_.erase(sbp_pair); - } - LandmarkBase::removeStateBlocks(getProblem()); -} - // static LandmarkBasePtr LandmarkPolyline2d::create(const YAML::Node& _lmk_node) { @@ -989,7 +963,7 @@ LandmarkBasePtr LandmarkPolyline2d::create(const YAML::Node& _lmk_node) lmk_ptr->setId(id); // fix all points - for (auto st_pair : lmk_ptr->getPointStatePtrMap()) + for (auto st_pair : lmk_ptr->getPointStateMap()) st_pair.second->fix(); return lmk_ptr; @@ -1008,8 +982,8 @@ YAML::Node LandmarkPolyline2d::saveToYaml() const node["classification_L"] = classification_.L; node["classification_W"] = classification_.W; - for (auto st : getPointsStateBlockVector()) - node["points"].push_back(st->getState()); + for (auto st_id : getValidIds()) + node["points"].push_back(getPointVector(st_id)); return node; } diff --git a/src/processor/processor_loop_closure_falko.cpp b/src/processor/processor_loop_closure_falko.cpp index 92ba29fa13ecaecfb684287e56426c4102ecc467..91259910eba66e2baf445fa5a01a26d7b3ff0db5 100644 --- a/src/processor/processor_loop_closure_falko.cpp +++ b/src/processor/processor_loop_closure_falko.cpp @@ -20,6 +20,7 @@ // //--------LICENSE_END-------- #include "laser/processor/processor_loop_closure_falko.h" + // Register in the FactorySensor #include "core/processor/factory_processor.h" namespace wolf { diff --git a/src/processor/processor_loop_closure_icp.cpp b/src/processor/processor_loop_closure_icp.cpp index a57559753b2cd4cf8503ab1f10a422ba18b52dfc..09d35ccdf3fcc2eb75ced42a97da1d4844b798db 100644 --- a/src/processor/processor_loop_closure_icp.cpp +++ b/src/processor/processor_loop_closure_icp.cpp @@ -113,7 +113,7 @@ std::map<double,MatchLoopClosurePtr> ProcessorLoopClosureIcp::findLoopClosures(C return match_lc_map; } -MatchLoopClosurePtr ProcessorLoopClosureIcp::matchScans(CaptureLaser2dPtr cap_ref, CaptureLaser2dPtr cap_tar) const +MatchLoopClosurePtr ProcessorLoopClosureIcp::matchScans(CaptureLaser2dPtr cap_ref, CaptureLaser2dPtr cap_tar) { auto frm_tar = cap_tar->getFrame(); auto frm_ref = cap_ref->getFrame(); @@ -212,18 +212,18 @@ void ProcessorLoopClosureIcp::emplaceFactors(MatchLoopClosurePtr match) last_loop_closure_ = match; } -FrameBasePtrList ProcessorLoopClosureIcp::generateSearchList(CaptureBasePtr _cap) const +FrameBasePtrList ProcessorLoopClosureIcp::generateSearchList(CaptureBasePtr _cap) { assert(_cap->getFrame() and _cap->getFrame()->getTrajectory()); - int N = getProblem()->getTrajectory()->getFrameMap().size() - 1 - params_loop_closure_icp_->recent_frames_ignored; + int N = getProblem()->getTrajectory()->size() - 1 - params_loop_closure_icp_->recent_frames_ignored; WOLF_DEBUG("ProcessorLoopClosureIcp::generateSearchList N = ", N); if (N <= 0) return FrameBasePtrList(); - auto map_begin = getProblem()->getTrajectory()->getFrameMap().begin(); + auto first_frame = getProblem()->getTrajectory()->getFirstFrame(); //std::vector<int> idxs; std::vector<bool> done(N, false); @@ -241,10 +241,10 @@ FrameBasePtrList ProcessorLoopClosureIcp::generateSearchList(CaptureBasePtr _cap // initialize with first: 0 done.at(0) = true; - if (not map_begin->second->getCapturesOfType<CaptureLaser2d>().empty()) + if (not first_frame->getCapturesOfType<CaptureLaser2d>().empty()) { //idxs.push_back(0); - frame_list.push_back(map_begin->second); + frame_list.push_back(first_frame); } // continue with tree @@ -262,7 +262,7 @@ FrameBasePtrList ProcessorLoopClosureIcp::generateSearchList(CaptureBasePtr _cap { done.at(idx) = true; checked++; - auto frame_idx = std::next(map_begin, idx)->second; + auto frame_idx = first_frame->getNextFrame(idx); assert(frame_idx); assert(frame_idx != _cap->getFrame()); if (not frame_idx->getCapturesOfType<CaptureLaser2d>().empty()) @@ -297,7 +297,7 @@ FrameBasePtrList ProcessorLoopClosureIcp::generateSearchList(CaptureBasePtr _cap checked++; // consider adding - auto frame_idx = std::next(map_begin, idx)->second; + auto frame_idx = first_frame->getNextFrame(idx); assert(frame_idx); assert(frame_idx != _cap->getFrame()); if (not frame_idx->getCapturesOfType<CaptureLaser2d>().empty()) diff --git a/src/processor/processor_tracker_feature_polyline_2d.cpp b/src/processor/processor_tracker_feature_polyline_2d.cpp index be4e0ad864a4d5ec1aafd8d9b71aa6f5bf90f3a8..d5a6c8ce3958b1fada4636b17c136818231ffc30 100644 --- a/src/processor/processor_tracker_feature_polyline_2d.cpp +++ b/src/processor/processor_tracker_feature_polyline_2d.cpp @@ -622,7 +622,7 @@ LandmarkBasePtr ProcessorTrackerFeaturePolyline2d::emplaceLandmark(FeatureBasePt //std::cout << "Robot global pose: " << t_world_robot_.transpose() << std::endl; //std::cout << "Sensor global pose: " << t_world_sensor_.transpose() << std::endl; assert(_feature_ptr->getType() == "POLYLINE 2d"); - assert(std::find(last_ptr_->getFeatureList().begin(),last_ptr_->getFeatureList().end(),_feature_ptr) != last_ptr_->getFeatureList().end() && "creating a landmark for a feature which is not in last capture"); + assert(last_ptr_->hasFeature(_feature_ptr) && "creating a landmark for a feature which is not in last capture"); FeaturePolyline2dPtr polyline_ptr = std::static_pointer_cast<FeaturePolyline2d>(_feature_ptr); diff --git a/test/gtest_landmark_polyline.cpp b/test/gtest_landmark_polyline.cpp index d84c18d1ac15c24aac47545cae3513561b823aca..93dd5c8fc27e83ea3685b9ab4bfd2f742c9e234f 100644 --- a/test/gtest_landmark_polyline.cpp +++ b/test/gtest_landmark_polyline.cpp @@ -143,7 +143,7 @@ TEST_F(LandmarkPolylineTest, Classify) // test points fixed and center unfixed ASSERT_FALSE(lmk_ptr->getP()->isFixed()); ASSERT_FALSE(lmk_ptr->getO()->isFixed()); - for (auto st_pair : lmk_ptr->getPointStatePtrMap()) + for (auto st_pair : lmk_ptr->getPointStateMap()) ASSERT_TRUE(st_pair.second->isFixed()); // test points are in the same place (compoping with object pose) diff --git a/test/gtest_processor_odom_icp.cpp b/test/gtest_processor_odom_icp.cpp index b0f24d0d3bbedd22b82cda213ec0499925ea2669..57c7b06ba718af26849a25c57d594283b6459ce5 100644 --- a/test/gtest_processor_odom_icp.cpp +++ b/test/gtest_processor_odom_icp.cpp @@ -199,15 +199,15 @@ TEST_F(ProcessorOdomIcp_Test, solve) t += 1.0; } - for (auto F : *problem->getTrajectory()) - F->perturb(0.5); + for (auto F_pair : problem->getTrajectory()->getFrameMap()) + F_pair.second->perturb(0.5); std::string report = solver->solve(SolverManager::ReportVerbosity::BRIEF); WOLF_TRACE(report); - for (auto F : *problem->getTrajectory()) + for (auto F_pair : problem->getTrajectory()->getFrameMap()) { - ASSERT_MATRIX_APPROX(F->getState().vector("PO") , x0.vector("PO") , 1e-6); + ASSERT_MATRIX_APPROX(F_pair.second->getState().vector("PO") , x0.vector("PO") , 1e-6); } } @@ -242,15 +242,15 @@ TEST_F(ProcessorOdomIcp_Test, solve_3D) t += 1.0; } - for (auto F : *problem->getTrajectory()) - F->perturb(0.5); + for (auto F_pair : problem->getTrajectory()->getFrameMap()) + F_pair.second->perturb(0.5); - std::string report = solver->solve(SolverManager::ReportVerbosity::BRIEF); + std::string report = solver->solve(SolverManager::ReportVerbosity::BRIEF); WOLF_TRACE(report); - for (auto F : *problem->getTrajectory()) + for (auto F_pair : problem->getTrajectory()->getFrameMap()) { - ASSERT_MATRIX_APPROX(F->getState().vector("PO") , x0.vector("PO") , 1e-6); + ASSERT_MATRIX_APPROX(F_pair.second->getState().vector("PO") , x0.vector("PO") , 1e-6); } }