diff --git a/CMakeLists.txt b/CMakeLists.txt index ecd68cab22364f4622c690bf8c121c1ac2eed53f..99e01fd2aedd98002570dd9a448c7e31a14d9737 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -221,14 +221,14 @@ SET(SRCS_YAML #OPTIONALS if(csm_FOUND) SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} - include/laser/processor/processor_closeloop_icp.h + include/laser/processor/processor_loop_closure_icp.h include/laser/processor/processor_odom_icp.h ) SET(HDRS_FEATURE ${HDRS_FEATURE} include/laser/feature/feature_icp_align.h ) SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} - src/processor/processor_closeloop_icp.cpp + src/processor/processor_loop_closure_icp.cpp src/processor/processor_odom_icp.cpp ) SET(SRCS_FEATURE ${SRCS_FEATURE} diff --git a/include/laser/factor/factor_container.h b/include/laser/factor/factor_container.h index 03c9ea6732fc337e44039acaedda88dd9b863560..0c3f5e29accee12a85f3945de1f36523e23a0881 100644 --- a/include/laser/factor/factor_container.h +++ b/include/laser/factor/factor_container.h @@ -24,6 +24,7 @@ class FactorContainer: public FactorAutodiff<FactorContainer,3,2,1,2,1> const unsigned int _corner, bool _apply_loss_function, FactorStatus _status = FAC_ACTIVE) : FactorAutodiff<FactorContainer,3,2,1,2,1>("FactorContainer", + TOP_LMK, nullptr, nullptr, nullptr, @@ -43,25 +44,20 @@ class FactorContainer: public FactorAutodiff<FactorContainer,3,2,1,2,1> std::cout << "new factor container: corner idx = " << corner_ << std::endl; } - virtual ~FactorContainer() = default; + virtual ~FactorContainer() = default; - virtual std::string getTopology() const override - { - return std::string("LMK"); - } + LandmarkContainerPtr getLandmark() + { + return lmk_ptr_.lock(); + } - LandmarkContainerPtr getLandmark() - { - return lmk_ptr_.lock(); - } - - template <typename T> - bool operator()(const T* const _robotP, const T* const _robotO, const T* const _landmarkP, const T* const _landmarkO, T* _residuals) const - { - // Mapping - Eigen::Map<const Eigen::Matrix<T,2,1>> landmark_position_map(_landmarkP); - Eigen::Map<const Eigen::Matrix<T,2,1>> robot_position_map(_robotP); - Eigen::Map<Eigen::Matrix<T,3,1>> residuals_map(_residuals); + template <typename T> + bool operator()(const T* const _robotP, const T* const _robotO, const T* const _landmarkP, const T* const _landmarkO, T* _residuals) const + { + // Mapping + Eigen::Map<const Eigen::Matrix<T,2,1>> landmark_position_map(_landmarkP); + Eigen::Map<const Eigen::Matrix<T,2,1>> robot_position_map(_robotP); + Eigen::Map<Eigen::Matrix<T,3,1>> residuals_map(_residuals); //std::cout << "getSensorPosition: " << std::endl; //std::cout << getCapture()->getSensor()->getSensorPosition()->head(2).transpose() << std::endl; @@ -69,7 +65,7 @@ class FactorContainer: public FactorAutodiff<FactorContainer,3,2,1,2,1> //std::cout << getCapture()->getSensor()->getSensorRotation()->topLeftCorner<2,2>() << std::endl; //std::cout << "atan2: " << atan2(getCapture()->getSensor()->getSensorRotation()->transpose()(0,1),getCapture()->getSensor()->getSensorRotation()->transpose()(0,0)) << std::endl; - // sensor transformation + // sensor transformation Eigen::Matrix<T,2,1> sensor_position = getCapture()->getSensor()->getP()->getState().head(2).cast<T>(); Eigen::Matrix<T,2,2> inverse_R_sensor = Eigen::Rotation2D<T>(T(-getCapture()->getSensorO()->getState()(0))).matrix(); // robot information @@ -128,8 +124,8 @@ class FactorContainer: public FactorAutodiff<FactorContainer,3,2,1,2,1> // std::cout << "\n\t" << _residuals[i] << " "; //std::cout << std::endl; - return true; - } + return true; + } }; } // namespace wolf diff --git a/include/laser/factor/factor_point_2d.h b/include/laser/factor/factor_point_2d.h index f2fd4e5c0790f33df685b5b12d032108dad68786..0e4188d5e69d29bbf619cc4b14fb6d8fff25bb13 100644 --- a/include/laser/factor/factor_point_2d.h +++ b/include/laser/factor/factor_point_2d.h @@ -31,6 +31,7 @@ class FactorPoint2d: public FactorAutodiff<FactorPoint2d, 2,2,1,2,1,2> bool _apply_loss_function, FactorStatus _status = FAC_ACTIVE) : FactorAutodiff<FactorPoint2d,2,2,1,2,1,2>("FactorPoint2d", + TOP_LMK, _ftr_ptr, nullptr, nullptr, nullptr, _lmk_ptr, _processor_ptr, @@ -62,11 +63,6 @@ class FactorPoint2d: public FactorAutodiff<FactorPoint2d, 2,2,1,2,1,2> ~FactorPoint2d() override = default; - std::string getTopology() const override - { - return std::string("LMK"); - } - /** * @brief getLandmarkPtr * @return diff --git a/include/laser/factor/factor_point_to_line_2d.h b/include/laser/factor/factor_point_to_line_2d.h index 01d389a1ce2158ff8b63fe0d987a90bab89deca7..80db7c795b47e5733bbbe620376c8d7716311516 100644 --- a/include/laser/factor/factor_point_to_line_2d.h +++ b/include/laser/factor/factor_point_to_line_2d.h @@ -30,6 +30,7 @@ class FactorPointToLine2d: public FactorAutodiff<FactorPointToLine2d, 1,2,1,2,1, unsigned int _ftr_point_id, int _lmk_point_id, int _lmk_point_aux_id, bool _apply_loss_function, FactorStatus _status = FAC_ACTIVE) : FactorAutodiff<FactorPointToLine2d, 1,2,1,2,1,2,2>("FactorPointToLine2d", + TOP_LMK, _ftr_ptr, nullptr, nullptr, @@ -69,11 +70,6 @@ class FactorPointToLine2d: public FactorAutodiff<FactorPointToLine2d, 1,2,1,2,1, ~FactorPointToLine2d() override = default; - std::string getTopology() const override - { - return std::string("GEOM"); - } - LandmarkPolyline2dPtr getLandmark() { return std::static_pointer_cast<LandmarkPolyline2d>( getLandmarkOther() ); diff --git a/include/laser/processor/processor_closeloop_icp.h b/include/laser/processor/processor_loop_closure_icp.h similarity index 91% rename from include/laser/processor/processor_closeloop_icp.h rename to include/laser/processor/processor_loop_closure_icp.h index 03c873441b3399d662ae1c1c1c9f25231933d826..8c0ab2d910f734e44864222b76461c7a6ed635ff 100644 --- a/include/laser/processor/processor_closeloop_icp.h +++ b/include/laser/processor/processor_loop_closure_icp.h @@ -1,15 +1,14 @@ -#include "core/common/wolf.h" -#include <iostream> -#include <fstream> +#ifndef SRC_PROCESSOR_LOOP_CLOSURE_ICP_H_ +#define SRC_PROCESSOR_LOOP_CLOSURE_ICP_H_ + /************************** * WOLF includes * **************************/ +#include "core/common/wolf.h" #include <core/processor/processor_base.h> #include <laser/capture/capture_laser_2d.h> -#include <core/factor/factor_base.h> -#include <core/factor/factor_loopclosure_2d.h> -#include <core/feature/feature_base.h> +#include <core/factor/factor_relative_pose_2d_with_extrinsics.h> #include <laser/feature/feature_icp_align.h> /************************** @@ -17,23 +16,13 @@ **************************/ #include <laser_scan_utils/laser_scan_utils.h> #include <laser_scan_utils/icp.h> -#include <map> - -/************************** - * STD includes * - **************************/ -// #include <fstream> -// #include <iomanip> -// #include <iostream> -// #include <queue> namespace wolf { -WOLF_PTR_TYPEDEFS(ProcessorCloseloopIcp); -WOLF_STRUCT_PTR_TYPEDEFS(ParamsProcessorCloseloopIcp); +WOLF_PTR_TYPEDEFS(ProcessorLoopClosureIcp); +WOLF_STRUCT_PTR_TYPEDEFS(ParamsProcessorLoopClosureIcp); - -struct ParamsProcessorCloseloopIcp : public ParamsProcessorBase +struct ParamsProcessorLoopClosureIcp : public ParamsProcessorBase { int recent_key_frames_ignored; int key_frames_to_wait; @@ -85,8 +74,8 @@ struct ParamsProcessorCloseloopIcp : public ParamsProcessorBase double hsm_linear_xc_max_npeaks; double hsm_linear_xc_peaks_min_distance; - ParamsProcessorCloseloopIcp() = default; - ParamsProcessorCloseloopIcp(std::string _unique_name, const ParamsServer& _server): + ParamsProcessorLoopClosureIcp() = default; + ParamsProcessorLoopClosureIcp(std::string _unique_name, const ParamsServer& _server): ParamsProcessorBase(_unique_name, _server) { recent_key_frames_ignored = _server.getParam<int> (prefix + _unique_name + "/recent_key_frames_ignored"); @@ -160,7 +149,7 @@ struct ParamsProcessorCloseloopIcp : public ParamsProcessorBase }; -class ProcessorCloseloopIcp : public ProcessorBase +class ProcessorLoopClosureIcp : public ProcessorBase { protected: // Useful sensor stuff @@ -181,9 +170,9 @@ class ProcessorCloseloopIcp : public ProcessorBase std::shared_ptr<laserscanutils::ICP> icp_tools_ptr_; public: laserscanutils::icpParams icp_params_; - ProcessorCloseloopIcp(ParamsProcessorCloseloopIcpPtr _params); + ProcessorLoopClosureIcp(ParamsProcessorLoopClosureIcpPtr _params); - WOLF_PROCESSOR_CREATE(ProcessorCloseloopIcp, ParamsProcessorCloseloopIcp); + WOLF_PROCESSOR_CREATE(ProcessorLoopClosureIcp, ParamsProcessorLoopClosureIcp); void configure(SensorBasePtr _sensor) override; protected: @@ -216,3 +205,5 @@ class ProcessorCloseloopIcp : public ProcessorBase }; } + +#endif // SRC_PROCESSOR_LOOP_CLOSURE_ICP_H_ diff --git a/include/laser/processor/processor_odom_icp.h b/include/laser/processor/processor_odom_icp.h index ac5c30a5c27a1407c58d0a9f1689a657173bfbb4..d98b1bba63c697c7fd6869657cb1fdedf9bdfb0e 100644 --- a/include/laser/processor/processor_odom_icp.h +++ b/include/laser/processor/processor_odom_icp.h @@ -1,12 +1,18 @@ #ifndef SRC_PROCESSOR_ODOM_ICP_H_ #define SRC_PROCESSOR_ODOM_ICP_H_ - +/************************** + * WOLF includes * + **************************/ +#include "core/common/wolf.h" +#include "core/processor/processor_tracker.h" #include "laser/capture/capture_laser_2d.h" +#include "core/factor/factor_relative_pose_2d_with_extrinsics.h" #include "laser/feature/feature_icp_align.h" -#include <core/processor/processor_tracker.h> - +/************************** + * ICP includes * + **************************/ #include <laser_scan_utils/laser_scan_utils.h> #include <laser_scan_utils/icp.h> @@ -190,19 +196,12 @@ class ProcessorOdomIcp : public ProcessorTracker, public IsMotion FeatureBasePtr emplaceFeature(CaptureBasePtr _capture_laser); FactorBasePtr emplaceFactor(FeatureBasePtr _feature); - inline bool voteForKeyFrameDistance() const; - inline bool voteForKeyFrameAngle() const; - inline bool voteForKeyFrameTime() const; - inline bool voteForKeyFrameMatchQuality() const; - - - - + bool voteForKeyFrameDistance() const; + bool voteForKeyFrameAngle() const; + bool voteForKeyFrameTime() const; + bool voteForKeyFrameMatchQuality() const; }; - - - } #endif // SRC_PROCESSOR_ODOM_ICP_H_ diff --git a/src/processor/processor_closeloop_icp.cpp b/src/processor/processor_loop_closure_icp.cpp similarity index 85% rename from src/processor/processor_closeloop_icp.cpp rename to src/processor/processor_loop_closure_icp.cpp index 2b5d24a8e87a6bb61416719b9892ea1c665d4f44..ef2acf5f3690dd40bf7e98925b8edcf21d2b0c5a 100644 --- a/src/processor/processor_closeloop_icp.cpp +++ b/src/processor/processor_loop_closure_icp.cpp @@ -1,16 +1,13 @@ -#include "laser/processor/processor_closeloop_icp.h" -#include "core/common/wolf.h" +#include "laser/processor/processor_loop_closure_icp.h" #include "laser/sensor/sensor_laser_2d.h" -#include <algorithm> -#include <iterator> using namespace wolf; using namespace laserscanutils; namespace wolf{ // Constructor -ProcessorCloseloopIcp::ProcessorCloseloopIcp(ParamsProcessorCloseloopIcpPtr _params) : - ProcessorBase("ProcessorCloseloopIcp", 2, _params) +ProcessorLoopClosureIcp::ProcessorLoopClosureIcp(ParamsProcessorLoopClosureIcpPtr _params) : + ProcessorBase("ProcessorLoopClosureIcp", 2, _params) { recent_key_frames_ignored_ = _params->recent_key_frames_ignored; key_frames_to_wait_ = _params->key_frames_to_wait; @@ -55,17 +52,17 @@ ProcessorCloseloopIcp::ProcessorCloseloopIcp(ParamsProcessorCloseloopIcpPtr _par icp_tools_ptr_ = std::make_shared<ICP>(); } -void ProcessorCloseloopIcp::configure(SensorBasePtr _sensor) +void ProcessorLoopClosureIcp::configure(SensorBasePtr _sensor) { sensor_laser_ = std::static_pointer_cast<SensorLaser2d>(_sensor); laser_scan_params_ = sensor_laser_->getScanParams(); } -void ProcessorCloseloopIcp::processCapture(CaptureBasePtr _capture_ptr) +void ProcessorLoopClosureIcp::processCapture(CaptureBasePtr _capture_ptr) { } -void ProcessorCloseloopIcp::processKeyFrame(FrameBasePtr _keyframe_ptr, const double& _time_tolerance) +void ProcessorLoopClosureIcp::processKeyFrame(FrameBasePtr _keyframe_ptr, const double& _time_tolerance) { // TODO: iterate all stored KF // packs buffer_pack_kf_.selectFirstPackBefore(_keyframe_ptr->getTimeStamp(),_time_tolerance); @@ -112,32 +109,32 @@ void ProcessorCloseloopIcp::processKeyFrame(FrameBasePtr _keyframe_ptr, const do } } -bool ProcessorCloseloopIcp::triggerInCapture(CaptureBasePtr) const +bool ProcessorLoopClosureIcp::triggerInCapture(CaptureBasePtr) const { return false; } -bool ProcessorCloseloopIcp::triggerInKeyFrame(FrameBasePtr _keyframe_ptr, const double& _time_tolerance) const +bool ProcessorLoopClosureIcp::triggerInKeyFrame(FrameBasePtr _keyframe_ptr, const double& _time_tolerance) const { return true; } -bool ProcessorCloseloopIcp::storeKeyFrame(FrameBasePtr) +bool ProcessorLoopClosureIcp::storeKeyFrame(FrameBasePtr) { return false; } -bool ProcessorCloseloopIcp::storeCapture(CaptureBasePtr) +bool ProcessorLoopClosureIcp::storeCapture(CaptureBasePtr) { return true; } -bool ProcessorCloseloopIcp::voteForKeyFrame() const +bool ProcessorLoopClosureIcp::voteForKeyFrame() const { return false; } -FrameBasePtrList ProcessorCloseloopIcp::selectCandidates(FrameBasePtr _keyframe_ptr, const double &_time_tolerance) +FrameBasePtrList ProcessorLoopClosureIcp::selectCandidates(FrameBasePtr _keyframe_ptr, const double &_time_tolerance) { FrameBasePtrList candidates; int key_frames_counter = 0; @@ -155,7 +152,7 @@ FrameBasePtrList ProcessorCloseloopIcp::selectCandidates(FrameBasePtr _keyframe_ WOLF_DEBUG("%%%%%%%%%%%%%%%%%% CANDIDATES SIZE ", candidates.size()); return candidates; } -std::map<double, CapturesAligned> ProcessorCloseloopIcp::evaluateCandidates(FrameBasePtr _keyframe_own, FrameBasePtrList &_keyframe_candidates) +std::map<double, CapturesAligned> ProcessorLoopClosureIcp::evaluateCandidates(FrameBasePtr _keyframe_own, FrameBasePtrList &_keyframe_candidates) { std::map<double, CapturesAligned> captures_candidates; CaptureLaser2dPtr capture_current = std::static_pointer_cast<wolf::CaptureLaser2d>(_keyframe_own->getCaptureOf(this->getSensor())); @@ -236,19 +233,25 @@ std::map<double, CapturesAligned> ProcessorCloseloopIcp::evaluateCandidates(Fram } return captures_candidates; } -CapturesAligned ProcessorCloseloopIcp::bestCandidate(std::map<double, CapturesAligned> &_capture_candidates) +CapturesAligned ProcessorLoopClosureIcp::bestCandidate(std::map<double, CapturesAligned> &_capture_candidates) { return _capture_candidates.begin()->second; } -FactorBasePtr ProcessorCloseloopIcp::emplaceFeatureAndFactor(CapturesAligned &_captures_aligned) +FactorBasePtr ProcessorLoopClosureIcp::emplaceFeatureAndFactor(CapturesAligned &_captures_aligned) { - auto ftr = FeatureBase::emplace<FeatureICPAlign>(_captures_aligned.capture_own, _captures_aligned.align_result); - return FactorBase::emplace<FactorLoopclosure2d>(ftr, ftr, _captures_aligned.capture_other->getFrame(), shared_from_this(), params_->apply_loss_function); + auto ftr = FeatureBase::emplace<FeatureICPAlign>(_captures_aligned.capture_own, + _captures_aligned.align_result); + return FactorBase::emplace<FactorRelativePose2dWithExtrinsics>(ftr, + ftr, + _captures_aligned.capture_other->getFrame(), + shared_from_this(), + params_->apply_loss_function, + TOP_LOOP); } } // Register in the FactorySensor #include "core/processor/factory_processor.h" namespace wolf { -WOLF_REGISTER_PROCESSOR(ProcessorCloseloopIcp) -WOLF_REGISTER_PROCESSOR_AUTO(ProcessorCloseloopIcp) +WOLF_REGISTER_PROCESSOR(ProcessorLoopClosureIcp) +WOLF_REGISTER_PROCESSOR_AUTO(ProcessorLoopClosureIcp) } /* namespace wolf */ diff --git a/src/processor/processor_odom_icp.cpp b/src/processor/processor_odom_icp.cpp index d27a141e1a6008cd24ee94c17cf60f4bb4d7a39c..bb8a3346523cca4149658d1997d1cf76c65fd5e3 100644 --- a/src/processor/processor_odom_icp.cpp +++ b/src/processor/processor_odom_icp.cpp @@ -1,11 +1,9 @@ #include "laser/processor/processor_odom_icp.h" -#include "core/factor/factor_odom_2d.h" #include "laser/math/laser_tools.h" -#include <core/common/wolf.h> - -using namespace wolf; using namespace laserscanutils; +namespace wolf +{ ProcessorOdomIcp::ProcessorOdomIcp(ParamsProcessorOdomIcpPtr _params): ProcessorTracker("ProcessorOdomIcp", "PO", 2, _params), @@ -269,11 +267,12 @@ FeatureBasePtr ProcessorOdomIcp::emplaceFeature(CaptureBasePtr _capture_laser) FactorBasePtr ProcessorOdomIcp::emplaceFactor(FeatureBasePtr _feature) { - return FactorBase::emplace<FactorOdom2d>(_feature, - _feature, - origin_ptr_->getFrame(), - shared_from_this(), - params_->apply_loss_function); + return FactorBase::emplace<FactorRelativePose2dWithExtrinsics>(_feature, + _feature, + origin_ptr_->getFrame(), + shared_from_this(), + params_->apply_loss_function, + TOP_MOTION); } VectorComposite ProcessorOdomIcp::getState( const StateStructure& _structure ) const @@ -346,6 +345,9 @@ void ProcessorOdomIcp::setProblem(ProblemPtr _problem_ptr) addToProblem(_problem_ptr, std::dynamic_pointer_cast<IsMotion>(shared_from_this())); } +} // namespace wolf + + // Register in the FactorySensor #include "core/processor/factory_processor.h" namespace wolf {