From 212247a549a2a0575c39c4422302107f6e51406b Mon Sep 17 00:00:00 2001 From: Joaquim Casals <jcasals@iri.upc.edu> Date: Tue, 7 May 2019 09:16:58 +0200 Subject: [PATCH 01/58] WIP --- CMakeLists.txt | 149 +++--------------- .../processor/processor_bundle_adjustment.h | 4 +- src/processor/processor_bundle_adjustment.cpp | 4 +- src/yaml/processor_bundle_adjustment_yaml.cpp | 6 +- test/gtest_track_matrix.cpp | 2 +- 5 files changed, 30 insertions(+), 135 deletions(-) rename include/{base => vision}/processor/processor_bundle_adjustment.h (98%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6815c9de..faf392575 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,6 +184,7 @@ include/vision/processor/processor_tracker_feature_trifocal.h include/vision/processor/processor_params_image.h include/vision/processor/processor_tracker_landmark_image.h include/vision/processor/processor_tracker_feature_image.h +include/vision/processor/processor_bundle_adjustment.h ) SET(HDRS_SENSOR include/vision/sensor/sensor_camera.h @@ -215,6 +216,7 @@ SET(SRCS_PROCESSOR src/processor/processor_tracker_feature_trifocal.cpp src/processor/processor_tracker_feature_image.cpp src/processor/processor_tracker_landmark_image.cpp +src/processor/processor_bundle_adjustment.cpp ) SET(SRCS_SENSOR src/sensor/sensor_camera.cpp @@ -227,136 +229,29 @@ SET(SRCS_YAML src/yaml/processor_tracker_feature_trifocal_yaml.cpp src/yaml/sensor_camera_yaml.cpp src/yaml/processor_image_yaml.cpp +src/yaml/processor_bundle_adjustment_yaml.cpp ) #OPTIONALS #optional HDRS and SRCS -IF (Ceres_FOUND) - SET(HDRS_WRAPPER - include/base/solver_suitesparse/sparse_utils.h - include/base/solver/solver_manager.h - include/base/ceres_wrapper/ceres_manager.h - #ceres_wrapper/qr_manager.h - include/base/ceres_wrapper/cost_function_wrapper.h - include/base/ceres_wrapper/create_numeric_diff_cost_function.h - include/base/ceres_wrapper/local_parametrization_wrapper.h - ) - SET(SRCS_WRAPPER - src/solver/solver_manager.cpp - src/ceres_wrapper/ceres_manager.cpp - #ceres_wrapper/qr_manager.cpp - src/ceres_wrapper/local_parametrization_wrapper.cpp - ) -ELSE(Ceres_FOUND) - SET(HDRS_WRAPPER) - SET(SRCS_WRAPPER) -ENDIF(Ceres_FOUND) - -IF (laser_scan_utils_FOUND) - SET(HDRS_CAPTURE ${HDRS_CAPTURE} - include/base/capture/capture_laser_2D.h - ) - SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} - include/base/processor/processor_tracker_feature_corner.h - include/base/processor/processor_tracker_landmark_corner.h - ) - SET(HDRS_SENSOR ${HDRS_SENSOR} - include/base/sensor/sensor_laser_2D.h - ) - SET(SRCS ${SRCS} - src/sensor/sensor_laser_2D.cpp - src/processor/processor_tracker_feature_corner.cpp - src/processor/processor_tracker_landmark_corner.cpp - ) -ENDIF(laser_scan_utils_FOUND) - -IF (raw_gps_utils_FOUND) - SET(HDRS_CAPTURE ${HDRS_CAPTURE} - include/base/capture/capture_GPS.h - ) - SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} - include/base/processor/processor_GPS.h - ) - SET(SRCS ${SRCS} - src/capture/capture_GPS.cpp - src/processor/processor_GPS.cpp - ) -ENDIF(raw_gps_utils_FOUND) - -# Vision -IF (vision_utils_FOUND) - SET(HDRS_CAPTURE ${HDRS_CAPTURE} - include/base/capture/capture_image.h - ) - SET(HDRS_FEATURE ${HDRS_FEATURE} - include/base/feature/feature_point_image.h - ) - SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} - include/base/processor/processor_bundle_adjustment.h - include/base/processor/processor_tracker_feature_trifocal.h - include/base/processor/processor_params_image.h - include/base/processor/processor_tracker_feature_image.h - include/base/processor/processor_tracker_landmark_image.h - ) - SET(HDRS_LANDMARK ${HDRS_LANDMARK} - include/base/landmark/landmark_point_3D.h - include/base/landmark/landmark_AHP.h - ) - SET(SRCS ${SRCS} - src/capture/capture_image.cpp - src/feature/feature_point_image.cpp - ) - SET(SRCS_LANDMARK ${SRCS_LANDMARK} - src/landmark/landmark_point_3D.cpp - src/landmark/landmark_AHP.cpp - ) - SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} - src/processor/processor_bundle_adjustment.cpp - src/processor/processor_tracker_feature_trifocal.cpp - src/processor/processor_tracker_feature_image.cpp - src/processor/processor_tracker_landmark_image.cpp - ) -ENDIF(vision_utils_FOUND) -#SUBDIRECTORIES -add_subdirectory(hello_wolf) -IF (cereal_FOUND) - ADD_SUBDIRECTORY(serialization/cereal) -ENDIF(cereal_FOUND) - -IF (Suitesparse_FOUND) - #DOES NOTHING?! - #ADD_SUBDIRECTORY(solver_suitesparse) -ENDIF(Suitesparse_FOUND) -# LEAVE YAML FILES ALWAYS IN THE LAST POSITION !! -IF(YAMLCPP_FOUND) - # headers - SET(HDRS ${HDRS} - include/base/yaml/yaml_conversion.h - ) - SET(HDRS_YAML ${HDRS_YAML} - include/base/yaml/yaml_conversion.h - ) - - # sources - SET(SRCS ${SRCS} - src/yaml/processor_odom_3D_yaml.cpp - src/yaml/processor_IMU_yaml.cpp - src/yaml/sensor_camera_yaml.cpp - src/yaml/sensor_odom_3D_yaml.cpp - src/yaml/sensor_IMU_yaml.cpp - ) - IF(laser_scan_utils_FOUND) - SET(SRCS ${SRCS} - src/yaml/sensor_laser_2D_yaml.cpp - ) - ENDIF(laser_scan_utils_FOUND) - IF(vision_utils_FOUND) - SET(SRCS ${SRCS} - src/yaml/processor_image_yaml.cpp - src/yaml/processor_bundle_adjustment_yaml.cpp - src/yaml/processor_tracker_feature_trifocal_yaml.cpp - ) - ENDIF(vision_utils_FOUND) -ENDIF(YAMLCPP_FOUND) +# ==================EXAMPLE=============== +# IF (Ceres_FOUND) +# SET(HDRS_WRAPPER +# include/base/solver_suitesparse/sparse_utils.h +# include/base/solver/solver_manager.h +# include/base/ceres_wrapper/ceres_manager.h +# include/base/ceres_wrapper/cost_function_wrapper.h +# include/base/ceres_wrapper/create_numeric_diff_cost_function.h +# include/base/ceres_wrapper/local_parametrization_wrapper.h +# ) +# SET(SRCS_WRAPPER +# src/solver/solver_manager.cpp +# src/ceres_wrapper/ceres_manager.cpp +# src/ceres_wrapper/local_parametrization_wrapper.cpp +# ) +# ELSE(Ceres_FOUND) +# SET(HDRS_WRAPPER) +# SET(SRCS_WRAPPER) +# ENDIF(Ceres_FOUND) # create the shared library ADD_LIBRARY(${PROJECT_NAME} diff --git a/include/base/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h similarity index 98% rename from include/base/processor/processor_bundle_adjustment.h rename to include/vision/processor/processor_bundle_adjustment.h index 82e34dffd..cf07d1b0d 100644 --- a/include/base/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -9,8 +9,8 @@ #define INCLUDE_BASE_PROCESSOR_PROCESSOR_BUNDLE_ADJUSTMENT_H_ //wolf includes -#include "base/processor/processor_tracker_feature.h" -#include "base/capture/capture_image.h" +#include "core/processor/processor_tracker_feature.h" +#include "vision/capture/capture_image.h" //vision utils includes #include "vision_utils/vision_utils.h" diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 11d418a6c..ddffdabe9 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -13,7 +13,7 @@ //standard #include <memory> -#include "../../include/base/processor/processor_bundle_adjustment.h" +#include "vision/processor/processor_bundle_adjustment.h" namespace wolf{ @@ -193,7 +193,7 @@ ProcessorBasePtr ProcessorBundleAdjustment::create(const std::string& _unique_na } //namespace wolf // Register in the ProcessorFactory -#include "base/processor/processor_factory.h" +#include "core/processor/processor_factory.h" namespace wolf { WOLF_REGISTER_PROCESSOR("TRACKER BUNDLE ADJUSTMENT", ProcessorBundleAdjustment) } // namespace wolf diff --git a/src/yaml/processor_bundle_adjustment_yaml.cpp b/src/yaml/processor_bundle_adjustment_yaml.cpp index eaca887c9..5006e127e 100644 --- a/src/yaml/processor_bundle_adjustment_yaml.cpp +++ b/src/yaml/processor_bundle_adjustment_yaml.cpp @@ -6,14 +6,14 @@ */ // wolf yaml -#include "base/yaml/yaml_conversion.h" +#include "core/yaml/yaml_conversion.h" // wolf -#include "base/common/factory.h" +#include "core/common/factory.h" // yaml-cpp library #include <yaml-cpp/yaml.h> -#include "../../include/base/processor/processor_bundle_adjustment.h" +#include "vision/processor/processor_bundle_adjustment.h" namespace wolf { diff --git a/test/gtest_track_matrix.cpp b/test/gtest_track_matrix.cpp index 454862f1d..cc56a045d 100644 --- a/test/gtest_track_matrix.cpp +++ b/test/gtest_track_matrix.cpp @@ -9,7 +9,7 @@ #include "core/processor/track_matrix.h" -#include "base/common/time_stamp.h" +#include "core/common/time_stamp.h" using namespace wolf; -- GitLab From daec62c6d1ef6898846ab14d92c12a46033984a8 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Mon, 13 May 2019 11:31:42 +0200 Subject: [PATCH 02/58] WIP --- .gitignore | 2 + CMakeLists.txt | 3 + include/vision/factor/factor_pixelHP.h | 184 +++++ include/vision/landmark/landmark_HP.h | 72 ++ .../processor/processor_bundle_adjustment.h | 36 +- src/CMakeLists.txt | 714 ------------------ src/examples/processor_bundle_adjustment.yaml | 2 +- src/landmark/landmark_HP.cpp | 74 ++ src/processor/processor_bundle_adjustment.cpp | 231 +++++- src/yaml/processor_bundle_adjustment_yaml.cpp | 16 +- test/CMakeLists.txt | 6 +- test/gtest_processor_bundle_adjustment.cpp | 80 ++ test/gtest_sensor_camera.cpp | 26 +- 13 files changed, 676 insertions(+), 770 deletions(-) create mode 100644 include/vision/factor/factor_pixelHP.h create mode 100644 include/vision/landmark/landmark_HP.h delete mode 100644 src/CMakeLists.txt create mode 100644 src/landmark/landmark_HP.cpp create mode 100644 test/gtest_processor_bundle_adjustment.cpp diff --git a/.gitignore b/.gitignore index d683ba3c8..8c8bcaa25 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ src/CMakeCache.txt src/CMakeFiles/cmake.check_cache src/examples/map_apriltag_save.yaml + +vision.found diff --git a/CMakeLists.txt b/CMakeLists.txt index faf392575..425193f81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,12 +172,14 @@ include/vision/capture/capture_image.h SET(HDRS_FACTOR include/vision/factor/factor_autodiff_trifocal.h include/vision/factor/factor_AHP.h +include/vision/factor/factor_pixelHP.h ) SET(HDRS_FEATURE include/vision/feature/feature_point_image.h ) SET(HDRS_LANDMARK include/vision/landmark/landmark_AHP.h + include/vision/landmark/landmark_HP.h ) SET(HDRS_PROCESSOR include/vision/processor/processor_tracker_feature_trifocal.h @@ -211,6 +213,7 @@ src/feature/feature_point_image.cpp ) SET(SRCS_LANDMARK src/landmark/landmark_AHP.cpp +src/landmark/landmark_HP.cpp ) SET(SRCS_PROCESSOR src/processor/processor_tracker_feature_trifocal.cpp diff --git a/include/vision/factor/factor_pixelHP.h b/include/vision/factor/factor_pixelHP.h new file mode 100644 index 000000000..070ee1062 --- /dev/null +++ b/include/vision/factor/factor_pixelHP.h @@ -0,0 +1,184 @@ +#ifndef FACTOR_AHP_H +#define FACTOR_AHP_H + +//Wolf includes +#include "core/factor/factor_autodiff.h" +#include "vision/landmark/landmark_HP.h" +#include "vision/sensor/sensor_camera.h" +//#include "core/feature/feature_point_image.h" +#include "core/math/pinhole_tools.h" + +#include <iomanip> //setprecision + +namespace wolf { + +WOLF_PTR_TYPEDEFS(FactorPixelHP); + +//class +class FactorPixelHP : public FactorAutodiff<FactorPixelHP, 2, 3, 4, 3, 4, 4> +{ + protected: + + Eigen::Vector4s intrinsic_; + Eigen::VectorXs distortion_; + + public: + + FactorPixelHP(const FeatureBasePtr& _ftr_ptr, + const LandmarkHPPtr& _landmark_ptr, + const ProcessorBasePtr& _processor_ptr = nullptr, + bool _apply_loss_function = false, + FactorStatus _status = FAC_ACTIVE); + + virtual ~FactorPixelHP() = default; + + template<typename T> + void expectation(const T* const _frame_p, + const T* const _frame_o, + const T* const _sensor_p, + const T* const _sensor_o, + const T* const _lmk_hmg, + T* _expectation) const; + + Eigen::VectorXs expectation() const; + + template<typename T> + bool operator ()(const T* const _frame_p, + const T* const _frame_o, + const T* const _sensor_p, + const T* const _sensor_o, + const T* const _lmk_hmg, + T* _residuals) const; + + // Static creator method + static FactorPixelHPPtr create(const FeatureBasePtr& _ftr_ptr, + const LandmarkHPPtr& _lmk_ahp_ptr, + const ProcessorBasePtr& _processor_ptr = nullptr, + bool _apply_loss_function = false, + FactorStatus _status = FAC_ACTIVE); + +}; + +inline FactorPixelHP::FactorPixelHP(const FeatureBasePtr& _ftr_ptr, + const LandmarkHPPtr& _landmark_ptr, + const ProcessorBasePtr& _processor_ptr, + bool _apply_loss_function, + FactorStatus _status) : + FactorAutodiff<FactorPixelHP, 2, 3, 4, 3, 4, 4>("PIXELHP", + nullptr, + nullptr, + nullptr, + _landmark_ptr, + _processor_ptr, + _apply_loss_function, + _status, + _ftr_ptr->getCapture()->getFrame()->getP(), + _ftr_ptr->getCapture()->getFrame()->getO(), + _ftr_ptr->getCapture()->getSensorP(), + _ftr_ptr->getCapture()->getSensorO(), + _landmark_ptr->getP()), + intrinsic_(_ftr_ptr->getCapture()->getSensor()->getIntrinsic()->getState()) //TODO: what to do with intrinsic? +{ + // obtain some intrinsics from provided sensor + distortion_ = (std::static_pointer_cast<SensorCamera>(_ftr_ptr->getCapture()->getSensor()))->getDistortionVector(); +} + +inline Eigen::VectorXs FactorPixelHP::expectation() const +{ + FrameBasePtr frm = getFeature()->getCapture()->getFrame(); + SensorBasePtr sen = getFeature()->getCapture()->getSensor(); + LandmarkBasePtr lmk = getLandmarkOther(); + + const Eigen::MatrixXs frame_pos = frm->getP()->getState(); + const Eigen::MatrixXs frame_ori = frm->getO()->getState(); + const Eigen::MatrixXs sensor_pos = sen ->getP()->getState(); + const Eigen::MatrixXs sensor_ori = sen ->getO()->getState(); + const Eigen::MatrixXs lmk_pos_hmg = lmk ->getP()->getState(); + + Eigen::Vector2s exp; + expectation(frame_pos.data(), frame_ori.data(), sensor_pos.data(), sensor_ori.data(), + lmk_pos_hmg.data(), exp.data()); + + return exp; +} + +template<typename T> +inline void FactorPixelHP::expectation(const T* const _frame_p, + const T* const _frame_o, + const T* const _sensor_p, + const T* const _sensor_o, + const T* const _lmk_hmg, + T* _expectation) const +{ + using namespace Eigen; + + // All involved transforms typedef + typedef Eigen::Transform<T, 3, Eigen::Affine> TransformType; + + // world to current robot transform + Map<const Matrix<T, 3, 1> > p_w_r(_frame_p); + Translation<T, 3> t_w_r(p_w_r); + Map<const Quaternion<T> > q_w_r(_frame_o); + TransformType T_W_R = t_w_r * q_w_r; + + // current robot to current camera transform + CaptureBasePtr capture = this->getFeature()->getCapture(); + Translation<T, 3> t_r_c (capture->getSensorP()->getState().cast<T>()); + Quaternions q_r_c_s(Eigen::Vector4s(capture->getSensorO()->getState())); + Quaternion<T> q_r_c = q_r_c_s.cast<T>(); + TransformType T_R_C = t_r_c * q_r_c; + + // hmg point in current camera frame C + Eigen::Map<const Eigen::Matrix<T, 4, 1> > landmark_hmg(_lmk_hmg); + Eigen::Matrix<T, 4, 1> landmark_hmg_c = T_R_C .inverse(Eigen::Affine) + * T_W_R .inverse(Eigen::Affine) + * landmark_hmg; + + // lmk direction vector //TODO: + Eigen::Matrix<T, 3, 1> v_dir = landmark_hmg_c.head(3); + + // camera parameters + Matrix<T, 4, 1> intrinsic = intrinsic_.cast<T>(); + Eigen::Matrix<T, Eigen::Dynamic, 1> distortion = distortion_.cast<T>(); + + // project point and exit + Eigen::Map<Eigen::Matrix<T, 2, 1> > expectation(_expectation); + expectation = pinhole::projectPoint(intrinsic, distortion, v_dir); +} + +template<typename T> +inline bool FactorPixelHP::operator ()(const T* const _frame_p, + const T* const _frame_o, + const T* const _sensor_p, + const T* const _sensor_o, + const T* const _lmk_hmg, + T* _residuals) const +{ + // expected + Eigen::Matrix<T, 2, 1> expected; + expectation(_frame_p, _frame_o, _sensor_p, _sensor_o, _lmk_hmg, expected.data()); + + // measured + Eigen::Matrix<T, 2, 1> measured = getMeasurement().cast<T>(); + + // residual + Eigen::Map<Eigen::Matrix<T, 2, 1> > residuals(_residuals); + residuals = getMeasurementSquareRootInformationUpper().cast<T>() * (expected - measured); + return true; +} + +inline FactorPixelHPPtr FactorPixelHP::create(const FeatureBasePtr& _ftr_ptr, + const LandmarkHPPtr& _lmk_ahp_ptr, + const ProcessorBasePtr& _processor_ptr, + bool _apply_loss_function, + FactorStatus _status) +{ + // construct factor + FactorPixelHPPtr fac_ahp = std::make_shared<FactorPixelHP>(_ftr_ptr, _lmk_ahp_ptr, _processor_ptr, _apply_loss_function, _status); + + return fac_ahp; +} + +} // namespace wolf + +#endif // FACTOR_AHP_H diff --git a/include/vision/landmark/landmark_HP.h b/include/vision/landmark/landmark_HP.h new file mode 100644 index 000000000..cea8c04bc --- /dev/null +++ b/include/vision/landmark/landmark_HP.h @@ -0,0 +1,72 @@ +#ifndef LANDMARK_AHP_H +#define LANDMARK_AHP_H + +//Wolf includes +#include "core/landmark/landmark_base.h" + +// yaml +#include <yaml-cpp/yaml.h> + +// Vision utils +#include <vision_utils/vision_utils.h> + +namespace wolf { + +WOLF_PTR_TYPEDEFS(LandmarkHP); + +/* Landmark - Homogeneous Point*/ +class LandmarkHP : public LandmarkBase +{ + protected: + SensorBasePtr sensor_; + cv::Mat cv_descriptor_; + + + public: + LandmarkHP(Eigen::Vector4s _position_homogeneous, SensorBasePtr _sensor_, cv::Mat _2D_descriptor); + + virtual ~LandmarkHP(); + + const cv::Mat& getCvDescriptor() const; + void setCvDescriptor(const cv::Mat& _descriptor); + + void setSensor (SensorBasePtr _anchor_sensor); + const SensorBasePtr getSensor() const; + + Eigen::Vector3s point() const; + + YAML::Node saveToYaml() const; + + /** \brief Creator for Factory<LandmarkBase, YAML::Node> + * Caution: This creator does not set the landmark's sensor. + * These need to be set afterwards. + */ + static LandmarkBasePtr create(const YAML::Node& _node); +}; + +inline void LandmarkHP::setSensor(SensorBasePtr _sensor) +{ + sensor_ = _sensor; +} + + +inline const SensorBasePtr LandmarkHP::getSensor() const +{ + return sensor_; +} + + +inline const cv::Mat& LandmarkHP::getCvDescriptor() const +{ + return cv_descriptor_; +} + + +inline void LandmarkHP::setCvDescriptor(const cv::Mat& _descriptor) +{ + cv_descriptor_ = _descriptor; +} + +} // namespace wolf + +#endif // LANDMARK_AHP_H diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index cf07d1b0d..11e9b371b 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -1,5 +1,5 @@ /* - * processor_tracker_feature_oriol.h + * processor_bundle_adjustment.h * * Created on: May 3, 2019 * Author: ovendrell @@ -11,12 +11,14 @@ //wolf includes #include "core/processor/processor_tracker_feature.h" #include "vision/capture/capture_image.h" +#include "vision/landmark/landmark_HP.h" //vision utils includes #include "vision_utils/vision_utils.h" #include "vision_utils/detectors.h" #include "vision_utils/descriptors.h" #include "vision_utils/matchers.h" +#include "../factor/factor_pixelHP.h" namespace wolf{ @@ -26,6 +28,10 @@ struct ProcessorParamsBundleAdjustment : public ProcessorParamsTrackerFeature { std::string yaml_file_params_vision_utils; + bool delete_ambiguities; + + Scalar pixel_noise_std; ///< std noise of the pixel + int min_track_length_for_factor; ///< Minimum track length of a matched feature to create a factor }; @@ -38,20 +44,25 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature vision_utils::DescriptorBasePtr des_ptr_; vision_utils::MatcherBasePtr mat_ptr_; - ProcessorParamsBundleAdjustmentPtr params_tracker_feature_oriol_; // Configuration parameters + ProcessorParamsBundleAdjustmentPtr params_bundle_adjustment_; // Configuration parameters CaptureImagePtr capture_image_last_; CaptureImagePtr capture_image_incoming_; Matrix2s pixel_cov_; + + //TODO: correct to add this? + std::map<size_t, LandmarkBasePtr> lmk_track_map_; //LandmarkTrackMap; + + public: /** \brief Class constructor */ - ProcessorBundleAdjustment(ProcessorParamsBundleAdjustmentPtr _params_tracker_feature_oriol); + ProcessorBundleAdjustment(ProcessorParamsBundleAdjustmentPtr _params_bundle_adjustment); /** \brief Class destructor */ - virtual ~ProcessorBundleAdjustment(); + //virtual ~ProcessorBundleAdjustment(); public: @@ -127,11 +138,28 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature */ virtual FactorBasePtr createFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) override; + virtual LandmarkBasePtr createLandmark(FeatureBasePtr _feature_ptr); + + /** \brief Establish factors between features in Captures \b last and \b origin + */ + virtual void establishFactors() override; + public: /// @brief Factory method static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr _sensor_ptr); + + private: + + cv::Mat image_debug_; + + public: + + /** + * \brief Return Image for debug purposes + */ + cv::Mat getImageDebug(); }; } //namespace wolf diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index c64df8aaa..000000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,714 +0,0 @@ -#Start WOLF build -MESSAGE("Starting WOLF CMakeLists ...") -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - -#CMAKE modules - -SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules") -MESSAGE(STATUS ${CMAKE_MODULE_PATH}) - -# Some wolf compilation options - -IF((CMAKE_BUILD_TYPE MATCHES DEBUG) OR (CMAKE_BUILD_TYPE MATCHES debug) OR (CMAKE_BUILD_TYPE MATCHES Debug)) - set(_WOLF_DEBUG true) -ENDIF() - -option(_WOLF_TRACE "Enable wolf tracing macro" ON) - -option(BUILD_EXAMPLES "Build examples" ON) -set(BUILD_TESTS true) - -# Does this has any other interest -# but for the examples ? -# yes, for the tests ! -IF(BUILD_EXAMPLES OR BUILD_TESTS) - set(_WOLF_ROOT_DIR ${CMAKE_SOURCE_DIR}) -ENDIF(BUILD_EXAMPLES OR BUILD_TESTS) - -#find dependencies. - -FIND_PACKAGE(Eigen3 3.2.92 REQUIRED) - -FIND_PACKAGE(Threads REQUIRED) - -FIND_PACKAGE(Ceres QUIET) #Ceres is not required -IF(Ceres_FOUND) - MESSAGE("Ceres Library FOUND: Ceres related sources will be built.") -ENDIF(Ceres_FOUND) - -FIND_PACKAGE(faramotics QUIET) #faramotics is not required -IF(faramotics_FOUND) - FIND_PACKAGE(GLUT REQUIRED) - FIND_PACKAGE(pose_state_time REQUIRED) - MESSAGE("Faramotics Library FOUND: Faramotics related sources will be built.") -ENDIF(faramotics_FOUND) - -FIND_PACKAGE(laser_scan_utils QUIET) #laser_scan_utils is not required -IF(laser_scan_utils_FOUND) - MESSAGE("laser_scan_utils Library FOUND: laser_scan_utils related sources will be built.") -ENDIF(laser_scan_utils_FOUND) - -FIND_PACKAGE(raw_gps_utils QUIET) #raw_gps_utils is not required -IF(raw_gps_utils_FOUND) - MESSAGE("raw_gps_utils Library FOUND: raw_gps_utils related sources will be built.") -ENDIF(raw_gps_utils_FOUND) - -# Vision Utils -FIND_PACKAGE(vision_utils QUIET) -IF (vision_utils_FOUND) - MESSAGE("vision_utils Library FOUND: vision related sources will be built.") - SET(PRINT_INFO_VU false) - FIND_PACKAGE(OpenCV QUIET) -ENDIF(vision_utils_FOUND) - -# Cereal -FIND_PACKAGE(cereal QUIET) -IF(cereal_FOUND) - MESSAGE("cereal Library FOUND: cereal related sources will be built.") -ENDIF(cereal_FOUND) - -# YAML with yaml-cpp -INCLUDE (${PROJECT_SOURCE_DIR}/cmake_modules/FindYamlCpp.cmake) -IF(YAMLCPP_FOUND) - MESSAGE("yaml-cpp Library FOUND: yaml-cpp related sources will be built.") -ELSEIF(YAMLCPP_FOUND) - MESSAGE("yaml-cpp Library NOT FOUND!") -ENDIF(YAMLCPP_FOUND) - -#GLOG -INCLUDE (${PROJECT_SOURCE_DIR}/cmake_modules/FindGlog.cmake) -IF(GLOG_FOUND) - MESSAGE("glog Library FOUND: glog related sources will be built.") - MESSAGE(STATUS ${GLOG_INCLUDE_DIR}) - MESSAGE(STATUS ${GLOG_LIBRARY}) -ELSEIF(GLOG_FOUND) - MESSAGE("glog Library NOT FOUND!") -ENDIF(GLOG_FOUND) - -# SuiteSparse doesn't have find*.cmake: -FIND_PATH( - Suitesparse_INCLUDE_DIRS - NAMES SuiteSparse_config.h - PATHS /usr/include/suitesparse /usr/local/include/suitesparse) -MESSAGE("Found suitesparse_INCLUDE_DIRS:" ${Suitesparse_INCLUDE_DIRS}) - -IF(Suitesparse_INCLUDE_DIRS) - SET(Suitesparse_FOUND TRUE) - MESSAGE("Suitesparse FOUND: wolf_solver will be built.") -ELSE (Suitesparse_INCLUDE_DIRS) - SET(Suitesparse_FOUND FALSE) - MESSAGE(FATAL_ERROR "Suitesparse NOT FOUND") -ENDIF (Suitesparse_INCLUDE_DIRS) - -# Define the directory where will be the configured config.h -SET(WOLF_CONFIG_DIR ${PROJECT_BINARY_DIR}/conf/internal) - -# Create the specified output directory if it does not exist. -IF(NOT EXISTS "${WOLF_CONFIG_DIR}") - message(STATUS "Creating config output directory: ${WOLF_CONFIG_DIR}") - file(MAKE_DIRECTORY "${WOLF_CONFIG_DIR}") -ENDIF() -IF(EXISTS "${WOLF_CONFIG_DIR}" AND NOT IS_DIRECTORY "${WOLF_CONFIG_DIR}") - message(FATAL_ERROR "Bug: Specified CONFIG_DIR: " - "${WOLF_CONFIG_DIR} exists, but is not a directory.") -ENDIF() -# Configure config.h -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/internal/config.h.in "${WOLF_CONFIG_DIR}/config.h") - -#TEMPORAL INCLUDE UNTIL WE FIGURE OUT WHAT TO DO WITH FILES in src/temp - -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(../dummyInclude) - -# Include config.h directory at first. -include_directories("${PROJECT_BINARY_DIR}/conf") - -INCLUDE_DIRECTORIES(.) - -# include spdlog (logging library) -FIND_PATH(SPDLOG_INCLUDE_DIR spdlog.h /usr/local/include/spdlog /usr/include/spdlog) -IF (SPDLOG_INCLUDE_DIR) - INCLUDE_DIRECTORIES(${SPDLOG_INCLUDE_DIR}) - MESSAGE(STATUS "Found spdlog: ${SPDLOG_INCLUDE_DIR}") -ELSE (SPDLOG_INCLUDE_DIR) - MESSAGE(FATAL_ERROR "Could not find spdlog") -ENDIF (SPDLOG_INCLUDE_DIR) - -INCLUDE_DIRECTORIES(${EIGEN_INCLUDE_DIRS}) - -IF(Ceres_FOUND) - INCLUDE_DIRECTORIES(${CERES_INCLUDE_DIRS}) -ENDIF(Ceres_FOUND) - -IF(faramotics_FOUND) - INCLUDE_DIRECTORIES(${faramotics_INCLUDE_DIRS}) -ENDIF(faramotics_FOUND) - -IF(laser_scan_utils_FOUND) - INCLUDE_DIRECTORIES(${laser_scan_utils_INCLUDE_DIRS}) -ENDIF(laser_scan_utils_FOUND) - -IF(raw_gps_utils_FOUND) - INCLUDE_DIRECTORIES(${raw_gps_utils_INCLUDE_DIRS}) -ENDIF(raw_gps_utils_FOUND) - -IF(vision_utils_FOUND) - INCLUDE_DIRECTORIES(${vision_utils_INCLUDE_DIR}) - INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) -ENDIF(vision_utils_FOUND) - -# cereal -IF(cereal_FOUND) - INCLUDE_DIRECTORIES(${cereal_INCLUDE_DIRS}) -ENDIF(cereal_FOUND) - -IF(Suitesparse_FOUND) - INCLUDE_DIRECTORIES(${Suitesparse_INCLUDE_DIRS}) -ENDIF(Suitesparse_FOUND) - -IF(YAMLCPP_FOUND) - INCLUDE_DIRECTORIES(${YAMLCPP_INCLUDE_DIR}) -ENDIF(YAMLCPP_FOUND) - -IF(GLOG_FOUND) -INCLUDE_DIRECTORIES(${GLOG_INCLUDE_DIR}) -ENDIF(GLOG_FOUND) - -#headers -SET(HDRS_BASE -capture/capture_motion.h - eigen_assert.h - eigen_predicates.h -landmark/landmark_match.h - make_unique.h - pinhole_tools.h -processor/processor_capture_holder.h -processor/processor_tracker_landmark.h - ) -SET(HDRS -capture/capture_motion.h -capture/capture_GPS_fix.h -capture/capture_IMU.h -capture/capture_odom_2D.h -capture/capture_odom_3D.h -factor/factor_block_absolute.h -factor/factor_container.h -factor/factor_corner_2D.h -factor/factor_AHP.h -factor/factor_epipolar.h -factor/factor_IMU.h -factor/factor_fix_bias.h -factor/factor_GPS_2D.h -factor/factor_GPS_pseudorange_3D.h -factor/factor_GPS_pseudorange_2D.h -factor/factor_odom_2D.h -factor/factor_odom_2D_analytic.h -factor/factor_odom_3D.h -factor/factor_point_2D.h -factor/factor_point_to_line_2D.h -factor/factor_pose_2D.h -factor/factor_pose_3D.h -factor/factor_quaternion_absolute.h -factor/factor_relative_2D_analytic.h - temp/diff_drive_tools.h - temp/diff_drive_tools.hpp -feature/feature_corner_2D.h -feature/feature_GPS_fix.h -feature/feature_GPS_pseudorange.h -feature/feature_IMU.h -feature/feature_odom_2D.h -feature/feature_polyline_2D.h - IMU_tools.h -landmark/landmark_corner_2D.h -landmark/landmark_container.h -landmark/landmark_line_2D.h -landmark/landmark_polyline_2D.h - local_parametrization_polyline_extreme.h -processor/processor_frame_nearest_neighbor_filter.h -processor/processor_IMU.h - test/processor_IMU_UnitTester.h -processor/processor_odom_2D.h -processor/processor_odom_3D.h -processor/processor_tracker_feature_dummy.h -processor/processor_tracker_landmark_dummy.h -sensor/sensor_camera.h -sensor/sensor_GPS.h -sensor/sensor_GPS_fix.h -sensor/sensor_IMU.h -sensor/sensor_odom_2D.h -sensor/sensor_odom_3D.h - ) - SET(HDRS_CAPTURE -capture/capture_GPS_fix.h -capture/capture_IMU.h -capture/capture_odom_2D.h -capture/capture_odom_3D.h -capture/capture_velocity.h -capture/capture_wheel_joint_position.h - ) - SET(HDRS_CONSTRAINT -factor/factor_autodiff_trifocal.h -factor/factor_autodiff_distance_3D.h -factor/factor_AHP.h -factor/factor_block_absolute.h -factor/factor_container.h -factor/factor_corner_2D.h -factor/factor_diff_drive.h -factor/factor_epipolar.h -factor/factor_IMU.h -factor/factor_fix_bias.h -factor/factor_GPS_2D.h -factor/factor_GPS_pseudorange_3D.h -factor/factor_GPS_pseudorange_2D.h -factor/factor_odom_2D.h -factor/factor_odom_2D_analytic.h -factor/factor_odom_3D.h -factor/factor_point_2D.h -factor/factor_point_to_line_2D.h -factor/factor_pose_2D.h -factor/factor_pose_3D.h -factor/factor_quaternion_absolute.h -factor/factor_relative_2D_analytic.h - ) - SET(HDRS_FEATURE -feature/feature_corner_2D.h -feature/feature_diff_drive.h -feature/feature_GPS_fix.h -feature/feature_GPS_pseudorange.h -feature/feature_IMU.h -feature/feature_odom_2D.h -feature/feature_polyline_2D.h - ) - SET(HDRS_LANDMARK -landmark/landmark_match.h -landmark/landmark_corner_2D.h -landmark/landmark_container.h -landmark/landmark_line_2D.h -landmark/landmark_polyline_2D.h - ) - SET(HDRS_PROCESSOR -processor/processor_capture_holder.h -processor/processor_diff_drive.h -processor/processor_frame_nearest_neighbor_filter.h -processor/processor_IMU.h -processor/processor_odom_2D.h -processor/processor_odom_3D.h -processor/processor_tracker_feature_dummy.h -processor/processor_tracker_landmark.h -processor/processor_tracker_landmark_dummy.h - ) - SET(HDRS_SENSOR -sensor/sensor_camera.h -sensor/sensor_diff_drive.h -sensor/sensor_GPS.h -sensor/sensor_GPS_fix.h -sensor/sensor_IMU.h -sensor/sensor_odom_2D.h -sensor/sensor_odom_3D.h - ) -# [Add generic derived header before this line] - -SET(HDRS_DTASSC - data_association/matrix.h - data_association/association_solver.h - data_association/association_node.h - data_association/association_tree.h - data_association/association_nnls.h - ) - -SET(HDRS_CORE -core/capture_base.h -core/capture_buffer.h -core/capture_pose.h -core/capture_void.h -core/factor_analytic.h -core/factor_autodiff.h -core/factor_base.h -core/factory.h -core/feature_base.h -core/feature_match.h -core/feature_pose.h -core/frame_base.h -core/hardware_base.h -core/landmark_base.h -core/local_parametrization_angle.h -core/local_parametrization_base.h -core/local_parametrization_homogeneous.h -core/local_parametrization_quaternion.h -core/logging.h -core/map_base.h -core/motion_buffer.h -core/node_base.h -core/problem.h -core/processor_base.h -core/factory.h -core/processor_loopclosure_base.h -core/processor_motion.h -core/processor_tracker_feature.h -core/processor_tracker.h -core/rotations.h -core/sensor_base.h -core/factory.h -core/singleton.h -core/state_angle.h -core/state_block.h -core/state_homogeneous_3D.h -core/state_quaternion.h -core/three_D_tools.h -core/time_stamp.h -core/track_matrix.h -core/trajectory_base.h -core/wolf.h - ) -SET(SRCS_CORE -core/capture_base.cpp -core/capture_pose.cpp -core/capture_void.cpp -core/factor_analytic.cpp -core/factor_base.cpp -core/feature_base.cpp -core/feature_pose.cpp -core/frame_base.cpp -core/hardware_base.cpp -core/landmark_base.cpp -core/local_parametrization_base.cpp -core/local_parametrization_homogeneous.cpp -core/local_parametrization_quaternion.cpp -core/map_base.cpp -core/motion_buffer.cpp -core/node_base.cpp -core/problem.cpp -core/processor_base.cpp -core/processor_loopclosure_base.cpp -core/processor_motion.cpp -core/processor_tracker.cpp -core/processor_tracker_feature.cpp -core/sensor_base.cpp -core/state_block.cpp -core/time_stamp.cpp -core/track_matrix.cpp -core/trajectory_base.cpp - ) -#sources -SET(SRCS_BASE -capture/capture_motion.cpp -processor/processor_capture_holder.cpp -processor/processor_tracker_landmark.cpp - ) - -SET(SRCS - local_parametrization_polyline_extreme.cpp - test/processor_IMU_UnitTester.cpp - ) - SET(SRCS_CAPTURE -capture/capture_GPS_fix.cpp -capture/capture_IMU.cpp -capture/capture_odom_2D.cpp -capture/capture_odom_3D.cpp -capture/capture_velocity.cpp -capture/capture_wheel_joint_position.cpp - ) - SET(SRCS_FEATURE -feature/feature_corner_2D.cpp -feature/feature_diff_drive.cpp -feature/feature_GPS_fix.cpp -feature/feature_GPS_pseudorange.cpp -feature/feature_IMU.cpp -feature/feature_odom_2D.cpp -feature/feature_polyline_2D.cpp - ) - SET(SRCS_LANDMARK -landmark/landmark_corner_2D.cpp -landmark/landmark_container.cpp -landmark/landmark_line_2D.cpp -landmark/landmark_polyline_2D.cpp - ) - SET(SRCS_PROCESSOR -processor/processor_frame_nearest_neighbor_filter.cpp -processor/processor_diff_drive.cpp -processor/processor_IMU.cpp -processor/processor_odom_2D.cpp -processor/processor_odom_3D.cpp -processor/processor_tracker_feature_dummy.cpp -processor/processor_tracker_landmark_dummy.cpp - ) - SET(SRCS_SENSOR -sensor/sensor_camera.cpp -sensor/sensor_diff_drive.cpp -sensor/sensor_GPS.cpp -sensor/sensor_GPS_fix.cpp -sensor/sensor_IMU.cpp -sensor/sensor_odom_2D.cpp -sensor/sensor_odom_3D.cpp - ) -SET(SRCS_DTASSC - data_association/association_solver.cpp - data_association/association_node.cpp - data_association/association_tree.cpp - data_association/association_nnls.cpp - ) - -# Add the solver sub-directory -add_subdirectory(solver) - -#optional HDRS and SRCS -IF (Ceres_FOUND) - SET(HDRS_WRAPPER - ceres_wrapper/sparse_utils.h - #ceres_wrapper/solver_manager.h - ceres_wrapper/ceres_manager.h - #ceres_wrapper/qr_manager.h - ceres_wrapper/cost_function_wrapper.h - ceres_wrapper/create_numeric_diff_cost_function.h - ceres_wrapper/local_parametrization_wrapper.h - ) - SET(SRCS_WRAPPER - #ceres_wrapper/solver_manager.cpp - ceres_wrapper/ceres_manager.cpp - #ceres_wrapper/qr_manager.cpp - ceres_wrapper/local_parametrization_wrapper.cpp - ) -ELSE(Ceres_FOUND) - SET(HDRS_WRAPPER) - SET(SRCS_WRAPPER) -ENDIF(Ceres_FOUND) - -IF (laser_scan_utils_FOUND) - SET(HDRS ${HDRS} -capture/capture_laser_2D.h -sensor/sensor_laser_2D.h -processor/processor_tracker_feature_corner.h -processor/processor_tracker_landmark_corner.h -processor/processor_tracker_landmark_polyline.h - ) - SET(SRCS ${SRCS} -capture/capture_laser_2D.cpp -sensor/sensor_laser_2D.cpp -processor/processor_tracker_feature_corner.cpp -processor/processor_tracker_landmark_corner.cpp -processor/processor_tracker_landmark_polyline.cpp - ) -ENDIF(laser_scan_utils_FOUND) - -IF (raw_gps_utils_FOUND) - SET(HDRS ${HDRS} -capture/capture_GPS.h -processor/processor_GPS.h - ) - SET(SRCS ${SRCS} -capture/capture_GPS.cpp -processor/processor_GPS.cpp - ) -ENDIF(raw_gps_utils_FOUND) - -# Vision -IF (vision_utils_FOUND) - SET(HDRS ${HDRS} -capture/capture_image.h -feature/feature_point_image.h -landmark/landmark_AHP.h -processor/processor_params_image.h -processor/processor_tracker_feature_image.h -processor/processor_tracker_landmark_image.h - ) - SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} -processor/processor_tracker_feature_trifocal.h - ) - SET(HDRS_LANDMARK ${HDRS_LANDMARK} -landmark/landmark_point_3D.h - ) - SET(SRCS ${SRCS} -capture/capture_image.cpp -feature/feature_point_image.cpp -landmark/landmark_AHP.cpp -processor/processor_tracker_feature_image.cpp -processor/processor_tracker_landmark_image.cpp - ) - SET(SRCS_LANDMARK ${SRCS_LANDMARK} -landmark/landmark_point_3D.cpp - ) - SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} -processor/processor_tracker_feature_trifocal.cpp - ) -ENDIF(vision_utils_FOUND) - -# Add the capture sub-directory -# ADD_SUBDIRECTORY(captures) - -# Add the factors sub-directory -# ADD_SUBDIRECTORY(factors) - -# Add the features sub-directory -# ADD_SUBDIRECTORY(features) - -# Add the landmarks sub-directory -# ADD_SUBDIRECTORY(landmarks) - -# Add the processors sub-directory -# ADD_SUBDIRECTORY(processors) - -# Add the sensors sub-directory -# ADD_SUBDIRECTORY(sensors) - -# Add the hello_wolf sub-directory -ADD_SUBDIRECTORY(hello_wolf) - -IF (cereal_FOUND) - ADD_SUBDIRECTORY(serialization/cereal) -ENDIF(cereal_FOUND) - -IF (Suitesparse_FOUND) - ADD_SUBDIRECTORY(solver_suitesparse) -ENDIF(Suitesparse_FOUND) - -# LEAVE YAML FILES ALWAYS IN THE LAST POSITION !! -IF(YAMLCPP_FOUND) - # headers - SET(HDRS ${HDRS} - yaml/yaml_conversion.h - ) - - # sources - SET(SRCS ${SRCS} - yaml/processor_odom_3D_yaml.cpp - yaml/processor_IMU_yaml.cpp - yaml/sensor_camera_yaml.cpp - yaml/sensor_odom_3D_yaml.cpp - yaml/sensor_IMU_yaml.cpp - ) - IF(laser_scan_utils_FOUND) - SET(SRCS ${SRCS} - yaml/sensor_laser_2D_yaml.cpp - ) - ENDIF(laser_scan_utils_FOUND) - IF(vision_utils_FOUND) - SET(SRCS ${SRCS} - yaml/processor_image_yaml.cpp - yaml/processor_tracker_feature_trifocal_yaml.cpp - ) - ENDIF(vision_utils_FOUND) -ENDIF(YAMLCPP_FOUND) - -# create the shared library -add_library(${PROJECT_NAME}_core SHARED - ${SRCS_CORE} - ${SRCS_BASE} - ) -ADD_LIBRARY(${PROJECT_NAME} - SHARED - ${SRCS_BASE} - ${SRCS} - ${SRCS_CAPTURE} - ${SRCS_CONSTRAINT} - ${SRCS_FEATURE} - ${SRCS_LANDMARK} - ${SRCS_PROCESSOR} - ${SRCS_SENSOR} - #${SRCS_DTASSC} - ${SRCS_SOLVER} - ${SRCS_WRAPPER} - ) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT}) - -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_NAME}_core) -#Link the created libraries -#============================================================= -IF (Ceres_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CERES_LIBRARIES}) -ENDIF(Ceres_FOUND) - -IF (laser_scan_utils_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${laser_scan_utils_LIBRARY}) -ENDIF (laser_scan_utils_FOUND) - -IF (raw_gps_utils_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${raw_gps_utils_LIBRARY}) -ENDIF (raw_gps_utils_FOUND) - -IF (OPENCV_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS}) - IF (vision_utils_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${vision_utils_LIBRARY}) - ENDIF (vision_utils_FOUND) -ENDIF (OPENCV_FOUND) - -IF (YAMLCPP_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${YAMLCPP_LIBRARY}) -ENDIF (YAMLCPP_FOUND) - -IF (GLOG_FOUND) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GLOG_LIBRARY}) -ENDIF (GLOG_FOUND) - -#install library -install(TARGETS ${PROJECT_NAME}_core DESTINATION lib/iri-algorithms EXPORT ${PROJECT_NAME}_core-targets) -install(EXPORT ${PROJECT_NAME}_core-targets DESTINATION lib/iri-algorithms) -#============================================================= -INSTALL(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib/iri-algorithms - ARCHIVE DESTINATION lib/iri-algorithms) - -install(EXPORT ${PROJECT_NAME}Targets DESTINATION lib/cmake/${PROJECT_NAME}) - -#install headers -INSTALL(FILES ${HDRS_BASE} - DESTINATION include/iri-algorithms/wolf) -INSTALL(FILES ${HDRS} - DESTINATION include/iri-algorithms/wolf) -INSTALL(FILES ${HDRS_CORE} - DESTINATION include/iri-algorithms/wolf/core) -#INSTALL(FILES ${HDRS_DTASSC} -# DESTINATION include/iri-algorithms/wolf/data_association) -INSTALL(FILES ${HDRS_CAPTURE} - DESTINATION include/iri-algorithms/wolf/capture) -INSTALL(FILES ${HDRS_CONSTRAINT} - DESTINATION include/iri-algorithms/wolf/factor) -INSTALL(FILES ${HDRS_FEATURE} - DESTINATION include/iri-algorithms/wolf/feature) -INSTALL(FILES ${HDRS_SENSOR} - DESTINATION include/iri-algorithms/wolf/sensor) -INSTALL(FILES ${HDRS_PROCESSOR} - DESTINATION include/iri-algorithms/wolf/processor) -INSTALL(FILES ${HDRS_LANDMARK} - DESTINATION include/iri-algorithms/wolf/landmark) -INSTALL(FILES ${HDRS_WRAPPER} - DESTINATION include/iri-algorithms/wolf/ceres_wrapper) -#INSTALL(FILES ${HDRS_SOLVER_SUITESPARSE} -# DESTINATION include/iri-algorithms/wolf/solver_suitesparse) -INSTALL(FILES ${HDRS_SOLVER} - DESTINATION include/iri-algorithms/wolf/solver) -INSTALL(FILES ${HDRS_SERIALIZATION} - DESTINATION include/iri-algorithms/wolf/serialization) -INSTALL(FILES "${CMAKE_SOURCE_DIR}/cmake_modules/Findwolf.cmake" - DESTINATION "lib/cmake/${PROJECT_NAME}") - -#install Find*.cmake -configure_file("${CMAKE_SOURCE_DIR}/cmake_modules/wolfConfig.cmake" - "${CMAKE_BINARY_DIR}/wolfConfig.cmake" @ONLY) - -INSTALL(FILES "${WOLF_CONFIG_DIR}/config.h" -DESTINATION include/iri-algorithms/wolf/internal) - -INSTALL(FILES "${CMAKE_BINARY_DIR}/wolfConfig.cmake" DESTINATION "lib/cmake/${PROJECT_NAME}") - -INSTALL(DIRECTORY ${SPDLOG_INCLUDE_DIRS} DESTINATION "include/iri-algorithms/") - -export(PACKAGE ${PROJECT_NAME}) - -############# -## Testing ## -############# -IF (GLOG_FOUND) - IF(BUILD_TESTS) - MESSAGE("Building tests.") - add_subdirectory(test) - ENDIF(BUILD_TESTS) -ENDIF (GLOG_FOUND) - -IF(BUILD_EXAMPLES) - #Build examples - MESSAGE("Building examples.") - ADD_SUBDIRECTORY(examples) -ENDIF(BUILD_EXAMPLES) - diff --git a/src/examples/processor_bundle_adjustment.yaml b/src/examples/processor_bundle_adjustment.yaml index dfe322d21..788373081 100644 --- a/src/examples/processor_bundle_adjustment.yaml +++ b/src/examples/processor_bundle_adjustment.yaml @@ -12,7 +12,7 @@ algorithm: grid horiz cells: 13 grid vert cells: 10 min response new features: 50 - min track length for constraint: 3 + min track length for factor: 3 noise: pixel noise std: 1 # pixels diff --git a/src/landmark/landmark_HP.cpp b/src/landmark/landmark_HP.cpp new file mode 100644 index 000000000..73cfc148d --- /dev/null +++ b/src/landmark/landmark_HP.cpp @@ -0,0 +1,74 @@ +#include "vision/landmark/landmark_HP.h" + +#include "core/state_block/state_homogeneous_3D.h" +#include "core/common/factory.h" +#include "core/yaml/yaml_conversion.h" + +namespace wolf { + +/* Landmark - Anchored Homogeneous Point*/ +LandmarkHP::LandmarkHP(Eigen::Vector4s _position_homogeneous, + SensorBasePtr _sensor, + cv::Mat _2D_descriptor) : + LandmarkBase("HP", std::make_shared<StateHomogeneous3D>(_position_homogeneous)), + sensor_(_sensor), + cv_descriptor_(_2D_descriptor.clone()) +{ +} + +LandmarkHP::~LandmarkHP() +{ + // +} + +YAML::Node LandmarkHP::saveToYaml() const +{ + // First base things + YAML::Node node = LandmarkBase::saveToYaml(); + + // Then add specific things + std::vector<int> v; + LandmarkHP::cv_descriptor_.copyTo(v); + node["descriptor"] = v; + return node; +} + +Eigen::Vector3s LandmarkHP::point() const +{ + using namespace Eigen; + + /* TODO: + Transform<Scalar,3,Affine> T_w_r + = Translation<Scalar,3>(getAnchorFrame()->getP()->getState()) + * Quaternions(getAnchorFrame()->getO()->getState().data()); + Transform<Scalar,3,Affine> T_r_c + = Translation<Scalar,3>(getAnchorSensor()->getP()->getState()) + * Quaternions(getAnchorSensor()->getO()->getState().data()); + */ + //Vector4s point_hmg_c = getP()->getState(); + //Vector4s point_hmg = T_w_r * T_r_c * point_hmg_c; + + Vector4s point_hmg = getP()->getState(); + + return point_hmg.head<3>()/point_hmg(3); +} + +LandmarkBasePtr LandmarkHP::create(const YAML::Node& _node) +{ + unsigned int id = _node["id"] .as< unsigned int >(); + Eigen::VectorXs pos_homog = _node["position"] .as< Eigen::VectorXs >(); + std::vector<int> v = _node["descriptor"] .as< std::vector<int> >(); + cv::Mat desc(v); + + LandmarkBasePtr lmk = std::make_shared<LandmarkHP>(pos_homog, nullptr, desc); + lmk->setId(id); + return lmk; +} + +// Register landmark creator +namespace +{ +const bool WOLF_UNUSED registered_lmk_ahp = LandmarkFactory::get().registerCreator("HP", LandmarkHP::create); +} + +} // namespace wolf diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index ddffdabe9..c39ee19e4 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -1,5 +1,5 @@ /* - * processor_tracker_feature_oriol.cpp + * processor_bundle_adjustment.cpp * * Created on: May 3, 2019 * Author: ovendrell @@ -17,27 +17,29 @@ namespace wolf{ -ProcessorBundleAdjustment::ProcessorBundleAdjustment(ProcessorParamsBundleAdjustmentPtr _params_tracker_feature_oriol) : - ProcessorTrackerFeature("TRACKER BUNDLE ADJUSTMENT", _params_tracker_feature_oriol), - params_tracker_feature_oriol_(_params_tracker_feature_oriol), +ProcessorBundleAdjustment::ProcessorBundleAdjustment(ProcessorParamsBundleAdjustmentPtr _params_bundle_adjustment) : + ProcessorTrackerFeature("TRACKER BUNDLE ADJUSTMENT", _params_bundle_adjustment), + params_bundle_adjustment_(_params_bundle_adjustment), capture_image_last_(nullptr), capture_image_incoming_(nullptr) { + pixel_cov_ = Eigen::Matrix2s::Identity() * params_bundle_adjustment_->pixel_noise_std * params_bundle_adjustment_->pixel_noise_std; + // Detector yaml file - std::string det_name = vision_utils::readYamlType(params_tracker_feature_oriol_->yaml_file_params_vision_utils, "detector"); + std::string det_name = vision_utils::readYamlType(params_bundle_adjustment_->yaml_file_params_vision_utils, "detector"); // Create Detector - det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_tracker_feature_oriol_->yaml_file_params_vision_utils); + det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_bundle_adjustment_->yaml_file_params_vision_utils); // Descriptor yaml file - std::string des_name = vision_utils::readYamlType(params_tracker_feature_oriol_->yaml_file_params_vision_utils, "descriptor"); + std::string des_name = vision_utils::readYamlType(params_bundle_adjustment_->yaml_file_params_vision_utils, "descriptor"); // Create Descriptor - des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_tracker_feature_oriol_->yaml_file_params_vision_utils); + des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_bundle_adjustment_->yaml_file_params_vision_utils); // Matcher yaml file - std::string mat_name = vision_utils::readYamlType(params_tracker_feature_oriol_->yaml_file_params_vision_utils, "matcher"); + std::string mat_name = vision_utils::readYamlType(params_bundle_adjustment_->yaml_file_params_vision_utils, "matcher"); // Create Matcher - mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_tracker_feature_oriol_->yaml_file_params_vision_utils); + mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_bundle_adjustment_->yaml_file_params_vision_utils); } @@ -65,18 +67,65 @@ void ProcessorBundleAdjustment::preProcess() capture_image_incoming_->matches_normalized_scores_ = mat_ptr_->robustMatch(capture_image_incoming_->keypoints_, capture_image_last_->keypoints_, capture_image_incoming_->descriptors_, capture_image_last_->descriptors_, des_ptr_->getSize(), capture_image_incoming_->matches_from_precedent_); - // Set capture map of match indices - for (auto match : capture_image_incoming_->matches_from_precedent_) + //TODO: Get only the best ones + if (params_bundle_adjustment_->delete_ambiguities) //filter ambiguities + { + std::map<int,int> ambiguities_map; + for (auto match : capture_image_incoming_->matches_from_precedent_) + if (ambiguities_map.count(match.trainIdx)) + ambiguities_map[match.trainIdx] = 0; + else + ambiguities_map[match.trainIdx] = 1; + // Set capture map of match indices + for (auto match : capture_image_incoming_->matches_from_precedent_) + { + if (!ambiguities_map.at(match.trainIdx)) + capture_image_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming + } + } + else { - capture_image_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming - //TODO: Nomes es queda l'ultim si hi ha ambiguitat? + // Set capture map of match indices + for (auto match : capture_image_incoming_->matches_from_precedent_) + capture_image_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming + } } } void ProcessorBundleAdjustment::postProcess() { + //TODO: visualization + + std::map<int,std::list<vision_utils::KeyPointEnhanced> > kp_enh_tracks; + + for (auto const & feat_base : last_ptr_->getFeatureList()) + { + FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); + unsigned int feat_id = feat->id(); + unsigned int track_id = feat->trackId(); + // tracks + std::list<vision_utils::KeyPointEnhanced> kp_enh_track; + for (auto feat_base : track_matrix_.trackAsVector(track_id)) + { + FeaturePointImagePtr feat_img = std::static_pointer_cast<FeaturePointImage>(feat_base); + vision_utils::KeyPointEnhanced kp_enh(feat_img->getKeypoint(), + feat_id, + track_id, + track_matrix_.trackSize(track_id), + feat_img->getMeasurementCovariance()); + kp_enh_track.push_back(kp_enh); + } + + kp_enh_tracks[feat_id] = kp_enh_track; + } + + // DEBUG + image_debug_ = vision_utils::buildImageProcessed((std::static_pointer_cast<CaptureImage>(last_ptr_))->getImage(), kp_enh_tracks); + + cv::imshow("DEBUG VIEW", image_debug_); + cv::waitKey(1); } @@ -84,11 +133,11 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& { for (auto feat_base: _features_last_in) { - FeaturePointImagePtr feat_last_ = std::static_pointer_cast<FeaturePointImage>(feat_base); + FeaturePointImagePtr feat_last = std::static_pointer_cast<FeaturePointImage>(feat_base); - if (capture_image_last_->map_index_to_next_.count(feat_last_->getIndexKeyPoint())) //If the track exists + if (capture_image_last_->map_index_to_next_.count(feat_last->getIndexKeyPoint())) //If the track exists { - int index_inc = capture_image_last_->map_index_to_next_.at(feat_last_->getIndexKeyPoint()); + int index_inc = capture_image_last_->map_index_to_next_.at(feat_last->getIndexKeyPoint()); if (capture_image_incoming_->matches_normalized_scores_.at(index_inc) > mat_ptr_->getParams()->min_norm_score ) { @@ -96,19 +145,19 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& cv::KeyPoint kp_inc = capture_image_incoming_->keypoints_.at(index_inc); //cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(feat_last_->getIndexKeyPoint()); - FeaturePointImagePtr feat_inc_ = std::make_shared<FeaturePointImage>(kp_inc, index_inc, + FeaturePointImagePtr feat_inc = std::make_shared<FeaturePointImage>(kp_inc, index_inc, capture_image_incoming_->descriptors_.row(index_inc), pixel_cov_); - _features_incoming_out.push_back(feat_inc_); + _features_incoming_out.push_back(feat_inc); - //TODO: Check ambiguities?? Aqui no + auto feature_match_ptr = std::make_shared<FeatureMatch>(); + feature_match_ptr->feature_ptr_= feat_last; + feature_match_ptr->normalized_score_ = capture_image_incoming_->matches_normalized_scores_.at(index_inc); + _feature_correspondences[feat_inc] = feature_match_ptr; - _feature_correspondences[feat_inc_] = std::make_shared<FeatureMatch>(feat_last_, - capture_image_incoming_->matches_normalized_scores_.at(index_inc)); } } - } return _feature_correspondences.size(); @@ -131,18 +180,16 @@ bool ProcessorBundleAdjustment::is_tracked(int& _kp_idx) unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_features, FeatureBasePtrList& _features_last_out) { - /*TODO: Implement - * Detect features again : NO fa falta - * Filter to get only the new features compared to the ones we had tracked before - * \param _features_last_out is new_last_features que s'ha d'omplir - * tenir en compte que es fa trackfeatures amb el resultat i no s'han de perdre els tracks ja obtinguts (i si hi ha indexs duplicats?) - */ + //TODO: efficient implementation? typedef std::map<int,int>::iterator iter; for (iter it = capture_image_last_->map_index_to_next_.begin(); it!=capture_image_last_->map_index_to_next_.end(); ++it) { - if(!is_tracked(it->second)) + if (_features_last_out.size() >= _max_new_features) + break; + + else if(!is_tracked(it->second)) { //add to _features_last_out int idx_last = it->first; @@ -151,6 +198,7 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe capture_image_last_->descriptors_.row(idx_last), pixel_cov_); _features_last_out.push_back(feat_last_); + } } @@ -158,25 +206,132 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe } -bool correctFeatureDrift(const FeatureBasePtr _origin_feature, const FeatureBasePtr _last_feature, FeatureBasePtr _incoming_feature) +bool ProcessorBundleAdjustment::correctFeatureDrift(const FeatureBasePtr _origin_feature, const FeatureBasePtr _last_feature, FeatureBasePtr _incoming_feature) { //TODO: Implement return false; } -bool voteForKeyFrame() +bool ProcessorBundleAdjustment::voteForKeyFrame() { - //TODO: Implement - return false; + // // A. crossing voting threshold with ascending number of features + bool vote_up = false; + // // 1. vote if we did not have enough features before + // vote_up = vote_up && (previousNumberOfTracks() < params_bundle_adjustment_->min_features_for_keyframe); + // // 2. vote if we have enough features now + // vote_up = vote_up && (incoming_ptr_->getFeatureList().size() >= params_bundle_adjustment_->min_features_for_keyframe); + + // B. crossing voting threshold with descending number of features + bool vote_down = true; + // 1. vote if we had enough features before + // vote_down = vote_down && (last_ptr_->getFeatureList().size() >= params_bundle_adjustment_->min_features_for_keyframe); + // 2. vote if we have not enough features now + vote_down = vote_down && (incoming_ptr_->getFeatureList().size() < params_bundle_adjustment_->min_features_for_keyframe); + + // // C. Time-based policies + bool vote_time = false; + //// vote_time = vote_time || (incoming_ptr_->getTimeStamp()-origin_ptr_->getTimeStamp() > 1.0); + // + // if (vote_up) + // WOLF_TRACE("VOTE UP"); + // if (vote_down) + // WOLF_TRACE("VOTE DOWN"); + // if (vote_time) + // WOLF_TRACE("VOTE TIME"); + + return vote_up || vote_down || vote_time; } -FactorBasePtr createFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) + +FactorBasePtr ProcessorBundleAdjustment::createFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) { - //TODO: Implement - FactorBasePtr a; - return a; + /* This function is no creating any factor. + * We create factors with establishFactors() + */ + return FactorBasePtr(); +} + +LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _feature_ptr) +{ + + FeaturePointImagePtr feat_point_image_ptr = std::static_pointer_cast<FeaturePointImage>( _feature_ptr); + //FrameBasePtr anchor_frame = getLast()->getFrame(); + + Eigen::Vector2s point2D; + point2D[0] = feat_point_image_ptr->getKeypoint().pt.x; + point2D[1] = feat_point_image_ptr->getKeypoint().pt.y; + + //Scalar distance = params_bundle_adjustment_->distance; // arbitrary value + Eigen::Vector4s vec_homogeneous; + + point2D = pinhole::depixellizePoint(getSensor()->getIntrinsic()->getState(),point2D); + point2D = pinhole::undistortPoint((std::static_pointer_cast<SensorCamera>(getSensor()))->getCorrectionVector(),point2D); + + Eigen::Vector3s point3D; + point3D.head<2>() = point2D; + point3D(2) = 1; + + point3D.normalize(); + + vec_homogeneous = {point3D(0),point3D(1),point3D(2),1/1};//distance}; + + LandmarkHPPtr lmk_hp_ptr = std::make_shared<LandmarkHP>(vec_homogeneous, getSensor(), feat_point_image_ptr->getDescriptor()); + _feature_ptr->setLandmarkId(lmk_hp_ptr->id()); + return lmk_hp_ptr; } +void ProcessorBundleAdjustment::establishFactors() +{ + + TrackMatches matches_origin_inc = track_matrix_.matches(origin_ptr_, incoming_ptr_); + + for (auto const & pair_trkid_pair : matches_origin_inc) + { + size_t trkid = pair_trkid_pair.first; + FeatureBasePtr feature_origin = pair_trkid_pair.second.first; + FeatureBasePtr feature_inc = pair_trkid_pair.second.second; + + //TODO: don't use map[track_id] = landmarkptr. + if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr + { + //createLandmark + LandmarkBasePtr lmk = createLandmark(feature_origin); + LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + //add Landmark to map: map[track_id] = landmarkptr + lmk_track_map_[trkid] = lmk; + + //create factors + FactorPixelHPPtr fac_ptr_origin = std::make_shared<FactorPixelHP>(feature_origin, lmk_hp, shared_from_this()); + if (fac_ptr_origin != nullptr) // factor links + { + feature_origin->addFactor(fac_ptr_origin); + lmk->addConstrainedBy(fac_ptr_origin); + } + FactorPixelHPPtr fac_ptr_inc = std::make_shared<FactorPixelHP>(feature_inc, lmk_hp, shared_from_this()); + if (fac_ptr_inc != nullptr) // factor links + { + feature_inc->addFactor(fac_ptr_inc); + lmk->addConstrainedBy(fac_ptr_inc); + } + } + else + { + LandmarkBasePtr lmk = lmk_track_map_[trkid]; + LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + + //Create factor + FactorPixelHPPtr fac_ptr_inc = std::make_shared<FactorPixelHP>(feature_inc, lmk_hp, shared_from_this()); + if (fac_ptr_inc != nullptr) // factor links + { + feature_inc->addFactor(fac_ptr_inc); + lmk->addConstrainedBy(fac_ptr_inc); + } + } + + } +} + + ProcessorBasePtr ProcessorBundleAdjustment::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, diff --git a/src/yaml/processor_bundle_adjustment_yaml.cpp b/src/yaml/processor_bundle_adjustment_yaml.cpp index 5006e127e..ac6740fc5 100644 --- a/src/yaml/processor_bundle_adjustment_yaml.cpp +++ b/src/yaml/processor_bundle_adjustment_yaml.cpp @@ -1,10 +1,3 @@ -/* - * processor_tracker_feature_trifocal_yaml.cpp - * - * Created on: Apr 12, 2018 - * Author: asantamaria - */ - // wolf yaml #include "core/yaml/yaml_conversion.h" @@ -46,19 +39,20 @@ static ProcessorParamsBasePtr createProcessorParamsBundleAdjustment(const std::s YAML::Node algorithm = config ["algorithm"]; params->time_tolerance = algorithm["time tolerance"] .as<Scalar>(); params->voting_active = algorithm["voting active"] .as<bool>(); + params->delete_ambiguities = algorithm["delete ambiguities"] .as<bool>(); params->min_features_for_keyframe = algorithm["minimum features for keyframe"] .as<unsigned int>(); params->max_new_features = algorithm["maximum new features"] .as<unsigned int>(); /* params->n_cells_h = algorithm["grid horiz cells"] .as<int>(); params->n_cells_v = algorithm["grid vert cells"] .as<int>(); params->min_response_new_feature = algorithm["min response new features"] .as<int>(); - params->min_track_length_for_constraint = algorithm["min track length for constraint"].as<int>(); */ + params->min_track_length_for_factor = algorithm["min track length for factor"].as<int>(); + YAML::Node noise = config["noise"]; - /* params->pixel_noise_std = noise ["pixel noise std"].as<Scalar>(); - */ + return params; } else @@ -70,7 +64,7 @@ static ProcessorParamsBasePtr createProcessorParamsBundleAdjustment(const std::s } // Register in the SensorFactory -const bool WOLF_UNUSED registered_prc_oriol = ProcessorParamsFactory::get().registerCreator("TRACKER BUNDLE ADJUSTMENT", createProcessorParamsBundleAdjustment); +const bool WOLF_UNUSED registered_prc_bundle_adjustment = ProcessorParamsFactory::get().registerCreator("TRACKER BUNDLE ADJUSTMENT", createProcessorParamsBundleAdjustment); } // namespace [unnamed] diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8c13de3f3..4868d66d2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,4 +18,8 @@ target_link_libraries(gtest_sensor_camera ${PROJECT_NAME} ${wolf_LIBRARY} ${Open # ProcessorFeatureTrifocal test wolf_add_gtest(gtest_processor_tracker_feature_trifocal gtest_processor_tracker_feature_trifocal.cpp) -target_link_libraries(gtest_processor_tracker_feature_trifocal ${PROJECT_NAME} ${wolf_LIBRARY} ${OpenCV_LIBS} ${vision_utils_LIBRARY}) \ No newline at end of file +target_link_libraries(gtest_processor_tracker_feature_trifocal ${PROJECT_NAME} ${wolf_LIBRARY} ${OpenCV_LIBS} ${vision_utils_LIBRARY}) + +# ProcessorBundleAdjustment test +wolf_add_gtest(gtest_processor_bundle_adjustment gtest_processor_bundle_adjustment.cpp) +target_link_libraries(gtest_processor_bundle_adjustment ${PROJECT_NAME} ${wolf_LIBRARY} ${OpenCV_LIBS} ${vision_utils_LIBRARY}) \ No newline at end of file diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp new file mode 100644 index 000000000..de12f3966 --- /dev/null +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -0,0 +1,80 @@ + +#include "utils_gtest.h" + +#include "vision/sensor/sensor_camera.h" +#include "core/sensor/sensor_factory.h" + +using namespace wolf; + +// Use the following in case you want to initialize tests with predefines variables or methods. +//class ProcessorBundleAdjustment_class : public testing::Test{ +// public: +// virtual void SetUp() +// { +// } +//}; + +TEST(ProcessorBundleAdjustment, installCamera) +{ + Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; + IntrinsicsCameraPtr params = std::make_shared<IntrinsicsCamera>(); + params->width = 640; + params->height = 480; + params->pinhole_model_raw << 321, 241, 321, 321; + params->pinhole_model_rectified << 320, 240, 320, 320; + params->distortion = Eigen::Vector3s( 0, 0, 0 ); + + // Wolf problem + ProblemPtr problem = Problem::create("PO 3D"); + + // Install camera + auto sen = problem->installSensor("CAMERA", "camera", extrinsics, params); + + ASSERT_NE(sen, nullptr); + + SensorCameraPtr cam = std::static_pointer_cast<SensorCamera>(sen); + + ASSERT_NE(cam, nullptr); + ASSERT_EQ(cam->getImgWidth(), 640); +} + +/*#include "vision/processor/processor_bundle_adjustment.h" +#include "vision/capture/capture_image.h" + +#include "vision_utils.h" + +TEST(ProcessorBundleAdjustment, installProcessor) +{ + std::string wolf_root = _WOLF_ROOT_DIR; + + // Wolf problem + ProblemPtr problem = Problem::create("PO 3D"); + + // Install camera + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->width = 640; + intr->height = 480; + auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); + + // Install processor +// ProcessorParamsBundleAdjustmentPtr params = make_shared<ProcessorParamsBundleAdjustment>(); +// params->delete_ambiguities = true; +// params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; +// params->pixel_noise_std = 1.0; +// params->min_track_length_for_factor = 3; +// params->voting_active = true; +// params->max_new_features = 5; +// auto proc = problem->installProcessor("BUNDLE ADJUSTMENT", "processor", sens_cam, params); +// +// std::cout << "sensor & processor created and added to wolf problem" << std::endl; +// +// ASSERT_EQ(proc->getProblem(), problem); +// ASSERT_TRUE(problem->check()); +}*/ + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + diff --git a/test/gtest_sensor_camera.cpp b/test/gtest_sensor_camera.cpp index 7c27882d3..ea70cb8c0 100644 --- a/test/gtest_sensor_camera.cpp +++ b/test/gtest_sensor_camera.cpp @@ -8,11 +8,35 @@ #include "utils_gtest.h" -#include "src/sensor/sensor_camera.cpp" +#include "vision/sensor/sensor_camera.h" #include "core/sensor/sensor_factory.h" using namespace wolf; +TEST(SensorCamera, install) +{ + Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; + IntrinsicsCameraPtr params = std::make_shared<IntrinsicsCamera>(); + params->width = 640; + params->height = 480; + params->pinhole_model_raw << 321, 241, 321, 321; + params->pinhole_model_rectified << 320, 240, 320, 320; + params->distortion = Eigen::Vector3s( 0, 0, 0 ); + + // Wolf problem + ProblemPtr problem = Problem::create("PO 3D"); + + // Install camera + auto sen = problem->installSensor("CAMERA", "camera", extrinsics, params); + + ASSERT_NE(sen, nullptr); + + SensorCameraPtr cam = std::static_pointer_cast<SensorCamera>(sen); + + ASSERT_NE(cam, nullptr); + ASSERT_EQ(cam->getImgWidth(), 640); +} + TEST(SensorCamera, Img_size) { Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; -- GitLab From e3774f053c203fa4b90d40820e4ca48a59cde0a2 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Tue, 14 May 2019 09:37:53 +0200 Subject: [PATCH 03/58] wip --- test/gtest_processor_bundle_adjustment.cpp | 169 ++++++++++++++++----- test/gtest_sensor_camera.cpp | 48 +++--- 2 files changed, 151 insertions(+), 66 deletions(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 6fc7578c7..af538ada1 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -1,11 +1,54 @@ #include "utils_gtest.h" +#include "vision_utils.h" #include "vision/sensor/sensor_camera.h" #include "core/sensor/sensor_factory.h" +#include "vision/processor/processor_bundle_adjustment.h" +#include "vision/capture/capture_image.h" + using namespace wolf; +class Dummy : public ProcessorBundleAdjustment +{ + public: + + Dummy(ProcessorParamsBundleAdjustmentPtr& _params_bundle_adjustment):ProcessorBundleAdjustment(_params_bundle_adjustment) + { + } + + void setLast(CaptureImagePtr& _last_ptr) + { + last_ptr_ = _last_ptr; + capture_image_last_ = _last_ptr; + } + void setInc(CaptureImagePtr& _incoming_ptr) + { + incoming_ptr_ = _incoming_ptr; + capture_image_incoming_ = _incoming_ptr; + } + + CaptureBasePtr getLast() + { + return last_ptr_; + } + CaptureBasePtr getInc() + { + return capture_image_incoming_; + } + + void fillCaptureImage(CaptureImagePtr& im) + { + // Detect KeyPoints + im->keypoints_ = det_ptr_->detect(im->getImage()); + // Compute Descriptors + im->descriptors_ = des_ptr_->getDescriptor(im->getImage(), im->keypoints_); + + } +}; + + // Use the following in case you want to initialize tests with predefines variables or methods. //class ProcessorBundleAdjustment_class : public testing::Test{ // public: @@ -14,63 +57,105 @@ using namespace wolf; // } //}; -TEST(ProcessorBundleAdjustment, installCamera) +TEST(ProcessorBundleAdjustment, installProcessor) { - Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; - IntrinsicsCameraPtr params = std::make_shared<IntrinsicsCamera>(); - params->width = 640; - params->height = 480; - params->pinhole_model_raw << 321, 241, 321, 321; - params->pinhole_model_rectified << 320, 240, 320, 320; - params->distortion = Eigen::Vector3s( 0, 0, 0 ); + std::string wolf_root = _WOLF_ROOT_DIR; + std::cout << wolf_root << std::endl; // Wolf problem - ProblemPtr problem = Problem::create("PO", 3); + ProblemPtr problem = Problem::create("PO", 3); - // Install camera - auto sen = problem->installSensor("CAMERA", "camera", extrinsics, params); + // Install camera + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->width = 640; + intr->height = 480; + auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); - ASSERT_NE(sen, nullptr); + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = problem->installProcessor("BUNDLE ADJUSTMENT", "processor", sens_cam, params); + + std::cout << "sensor & processor created and added to wolf problem" << std::endl; + + ASSERT_EQ(proc->getProblem(), problem); + ASSERT_TRUE(problem->check()); +} - SensorCameraPtr cam = std::static_pointer_cast<SensorCamera>(sen); +TEST(ProcessorBundleAdjustment, preProcess) +{ + std::string wolf_root = _WOLF_ROOT_DIR; - ASSERT_NE(cam, nullptr); - ASSERT_EQ(cam->getImgWidth(), 640); -} + // Create processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = std::make_shared<ProcessorBundleAdjustment>(params); -/*#include "vision/processor/processor_bundle_adjustment.h" -#include "vision/capture/capture_image.h" + // Fill incoming_ptr with an image + Dummy init = Dummy(params); + const Scalar time = 0.0; + TimeStamp ts(time); + CaptureImagePtr im = std::make_shared<CaptureImage>(ts, nullptr, cv::imread(wolf_root + "/src/examples/Test_gazebo_x-20cm_y-20cm.jpg")); + init.setInc(im); + proc->preProcess(); -#include "vision_utils.h" + ASSERT_NE(init.getLast(), nullptr); -TEST(ProcessorBundleAdjustment, installProcessor) + + // Test detectNewFeatures + FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); + unsigned int num = proc->detectNewFeatures(params->max_new_features, feat_list); + + ASSERT_EQ(num, params->max_new_features); +} + +TEST(ProcessorBundleAdjustment, detectNewFeatures) { std::string wolf_root = _WOLF_ROOT_DIR; - // Wolf problem - ProblemPtr problem = Problem::create("PO", 3); + // Create processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = std::make_shared<ProcessorBundleAdjustment>(params); + + // Fill last_ptr with an image + Dummy init = Dummy(params); + const Scalar time = 0.0; + TimeStamp ts(time); + CaptureImagePtr im = std::make_shared<CaptureImage>(ts, nullptr, cv::imread(wolf_root + "/src/examples/Test_gazebo_x-20cm_y-20cm.jpg")); + init.setLast(im); + std::cout << "Set last_ptr_" << std::endl; //TODO: Seg fault + init.fillCaptureImage(im); + + CaptureImagePtr cap = std::static_pointer_cast<CaptureImage>(init.getInc()); + ASSERT_NE(cap->keypoints_.size(), 0); + + + // Test detectNewFeatures + FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); + unsigned int num = proc->detectNewFeatures(params->max_new_features, feat_list); + + ASSERT_EQ(num, params->max_new_features); +} + + - // Install camera - IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML - intr->width = 640; - intr->height = 480; - auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); - // Install processor -// ProcessorParamsBundleAdjustmentPtr params = make_shared<ProcessorParamsBundleAdjustment>(); -// params->delete_ambiguities = true; -// params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; -// params->pixel_noise_std = 1.0; -// params->min_track_length_for_factor = 3; -// params->voting_active = true; -// params->max_new_features = 5; -// auto proc = problem->installProcessor("BUNDLE ADJUSTMENT", "processor", sens_cam, params); -// -// std::cout << "sensor & processor created and added to wolf problem" << std::endl; -// -// ASSERT_EQ(proc->getProblem(), problem); -// ASSERT_TRUE(problem->check()); -}*/ int main(int argc, char **argv) { diff --git a/test/gtest_sensor_camera.cpp b/test/gtest_sensor_camera.cpp index c8fefadf6..a3810afc0 100644 --- a/test/gtest_sensor_camera.cpp +++ b/test/gtest_sensor_camera.cpp @@ -13,30 +13,6 @@ using namespace wolf; -TEST(SensorCamera, install) -{ - Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; - IntrinsicsCameraPtr params = std::make_shared<IntrinsicsCamera>(); - params->width = 640; - params->height = 480; - params->pinhole_model_raw << 321, 241, 321, 321; - params->pinhole_model_rectified << 320, 240, 320, 320; - params->distortion = Eigen::Vector3s( 0, 0, 0 ); - - // Wolf problem - ProblemPtr problem = Problem::create("PO", 3); - - // Install camera - auto sen = problem->installSensor("CAMERA", "camera", extrinsics, params); - - ASSERT_NE(sen, nullptr); - - SensorCameraPtr cam = std::static_pointer_cast<SensorCamera>(sen); - - ASSERT_NE(cam, nullptr); - ASSERT_EQ(cam->getImgWidth(), 640); -} - TEST(SensorCamera, Img_size) { Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; @@ -139,6 +115,30 @@ TEST(SensorCamera, create) ASSERT_EQ(cam->getImgWidth(), 640); } +TEST(SensorCamera, install) +{ + Eigen::VectorXs extrinsics(7); extrinsics << 0,0,0, 0,0,0,1; + IntrinsicsCameraPtr params = std::make_shared<IntrinsicsCamera>(); + params->width = 640; + params->height = 480; + params->pinhole_model_raw << 321, 241, 321, 321; + params->pinhole_model_rectified << 320, 240, 320, 320; + params->distortion = Eigen::Vector3s( 0, 0, 0 ); + + // Wolf problem + ProblemPtr problem = Problem::create("PO 3D",3); + + // Install camera + auto sen = problem->installSensor("CAMERA", "camera", extrinsics, params); + + ASSERT_NE(sen, nullptr); + + SensorCameraPtr cam = std::static_pointer_cast<SensorCamera>(sen); + + ASSERT_NE(cam, nullptr); + ASSERT_EQ(cam->getImgWidth(), 640); +} + int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); -- GitLab From f0ab3f7aa4fab849110e7d3bd0a4c2655090cef4 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Tue, 14 May 2019 11:58:09 +0200 Subject: [PATCH 04/58] wip gtest --- src/processor/processor_bundle_adjustment.cpp | 8 +- test/gtest_processor_bundle_adjustment.cpp | 118 +++++++++--------- 2 files changed, 62 insertions(+), 64 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index c39ee19e4..16215b6d4 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -72,10 +72,10 @@ void ProcessorBundleAdjustment::preProcess() { std::map<int,int> ambiguities_map; for (auto match : capture_image_incoming_->matches_from_precedent_) - if (ambiguities_map.count(match.trainIdx)) - ambiguities_map[match.trainIdx] = 0; - else - ambiguities_map[match.trainIdx] = 1; + if (ambiguities_map.count(match.trainIdx)) //if ambiguity + ambiguities_map[match.trainIdx] = 1; //ambiguity true + else //if not ambiguity + ambiguities_map[match.trainIdx] = 0; //ambiguity false // Set capture map of match indices for (auto match : capture_image_incoming_->matches_from_precedent_) { diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index af538ada1..126c76d39 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -10,45 +10,40 @@ using namespace wolf; -class Dummy : public ProcessorBundleAdjustment +std::string wolf_root = "/home/ovendrell/dev/vision"; + +class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment { public: - Dummy(ProcessorParamsBundleAdjustmentPtr& _params_bundle_adjustment):ProcessorBundleAdjustment(_params_bundle_adjustment) - { - } + ProcessorBundleAdjustmentDummy(ProcessorParamsBundleAdjustmentPtr& _params_bundle_adjustment):ProcessorBundleAdjustment(_params_bundle_adjustment){} - void setLast(CaptureImagePtr& _last_ptr) + void setLast(CaptureImagePtr _last_ptr) { last_ptr_ = _last_ptr; capture_image_last_ = _last_ptr; } - void setInc(CaptureImagePtr& _incoming_ptr) + void setInc(CaptureImagePtr _incoming_ptr) { incoming_ptr_ = _incoming_ptr; capture_image_incoming_ = _incoming_ptr; } - CaptureBasePtr getLast() - { - return last_ptr_; - } - CaptureBasePtr getInc() - { - return capture_image_incoming_; - } - - void fillCaptureImage(CaptureImagePtr& im) + CaptureImagePtr createCaptureImage(std::string _path, bool detectAndDescript = false) { - // Detect KeyPoints - im->keypoints_ = det_ptr_->detect(im->getImage()); - // Compute Descriptors - im->descriptors_ = des_ptr_->getDescriptor(im->getImage(), im->keypoints_); - + const Scalar time = 0.0; + TimeStamp ts(time); + CaptureImagePtr im = std::make_shared<CaptureImage>(ts, nullptr, cv::imread(_path)); + if (detectAndDescript){ + // Detect KeyPoints + im->keypoints_ = det_ptr_->detect(im->getImage()); + // Compute Descriptors + im->descriptors_ = des_ptr_->getDescriptor(im->getImage(), im->keypoints_); + } + return im; } }; - // Use the following in case you want to initialize tests with predefines variables or methods. //class ProcessorBundleAdjustment_class : public testing::Test{ // public: @@ -59,8 +54,8 @@ class Dummy : public ProcessorBundleAdjustment TEST(ProcessorBundleAdjustment, installProcessor) { - std::string wolf_root = _WOLF_ROOT_DIR; - std::cout << wolf_root << std::endl; +// std::string wolf_root = _WOLF_ROOT_DIR; +// std::cout << wolf_root << std::endl; // Wolf problem ProblemPtr problem = Problem::create("PO", 3); @@ -79,7 +74,7 @@ TEST(ProcessorBundleAdjustment, installProcessor) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; - auto proc = problem->installProcessor("BUNDLE ADJUSTMENT", "processor", sens_cam, params); + auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); std::cout << "sensor & processor created and added to wolf problem" << std::endl; @@ -89,7 +84,7 @@ TEST(ProcessorBundleAdjustment, installProcessor) TEST(ProcessorBundleAdjustment, preProcess) { - std::string wolf_root = _WOLF_ROOT_DIR; +// std::string wolf_root = _WOLF_ROOT_DIR; // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); @@ -99,29 +94,26 @@ TEST(ProcessorBundleAdjustment, preProcess) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; - auto proc = std::make_shared<ProcessorBundleAdjustment>(params); - - // Fill incoming_ptr with an image - Dummy init = Dummy(params); - const Scalar time = 0.0; - TimeStamp ts(time); - CaptureImagePtr im = std::make_shared<CaptureImage>(ts, nullptr, cv::imread(wolf_root + "/src/examples/Test_gazebo_x-20cm_y-20cm.jpg")); - init.setInc(im); - proc->preProcess(); - - ASSERT_NE(init.getLast(), nullptr); - - // Test detectNewFeatures - FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - unsigned int num = proc->detectNewFeatures(params->max_new_features, feat_list); - - ASSERT_EQ(num, params->max_new_features); + auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); + + // Put an image on incoming_ptr_ + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg"); + proc_dummy->setInc(image_inc_ptr); + // Put an image on last_ptr_ + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg", true); + proc_dummy->setLast(image_last_ptr); + // Test dpreProcess + proc_dummy->preProcess(); + CaptureImagePtr inc = std::static_pointer_cast<CaptureImage>(proc_dummy->getIncoming()); + CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); + ASSERT_EQ(inc->keypoints_.size(), last->keypoints_.size()); + ASSERT_NE(inc->keypoints_.size(), 0); } TEST(ProcessorBundleAdjustment, detectNewFeatures) { - std::string wolf_root = _WOLF_ROOT_DIR; +// std::string wolf_root = _WOLF_ROOT_DIR; // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); @@ -131,30 +123,36 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; - auto proc = std::make_shared<ProcessorBundleAdjustment>(params); - - // Fill last_ptr with an image - Dummy init = Dummy(params); - const Scalar time = 0.0; - TimeStamp ts(time); - CaptureImagePtr im = std::make_shared<CaptureImage>(ts, nullptr, cv::imread(wolf_root + "/src/examples/Test_gazebo_x-20cm_y-20cm.jpg")); - init.setLast(im); - std::cout << "Set last_ptr_" << std::endl; //TODO: Seg fault - init.fillCaptureImage(im); + auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); - CaptureImagePtr cap = std::static_pointer_cast<CaptureImage>(init.getInc()); - ASSERT_NE(cap->keypoints_.size(), 0); + FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); + // Put an image on last_ptr_ + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg", true); + ASSERT_NE(image_last_ptr->keypoints_.size(), 0); + proc_dummy->setLast(image_last_ptr); // Test detectNewFeatures - FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - unsigned int num = proc->detectNewFeatures(params->max_new_features, feat_list); + unsigned int num = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + ASSERT_EQ(num, 0); - ASSERT_EQ(num, params->max_new_features); -} + // Put an image on incoming_ptr_ + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg"); + proc_dummy->setInc(image_inc_ptr); + // Test detectNewFeatures + unsigned int num2 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + ASSERT_EQ(num2, 0); + // preProcess Incoming to fill last_ptr_ map_index_to_next_ + proc_dummy->preProcess(); + CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); + ASSERT_NE(last->map_index_to_next_.size(),0); + // Test detectNewFeatures + unsigned int num3 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + ASSERT_EQ(num3, params->max_new_features); +} int main(int argc, char **argv) -- GitLab From 7869a7137d50b4ca7345e71b4db2b1fde5f4b380 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Tue, 14 May 2019 12:57:36 +0200 Subject: [PATCH 05/58] WIP --- src/processor/processor_bundle_adjustment.cpp | 4 +- test/gtest_processor_bundle_adjustment.cpp | 136 +++++++++++++++++- 2 files changed, 131 insertions(+), 9 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 16215b6d4..c2d82494b 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -45,7 +45,7 @@ ProcessorBundleAdjustment::ProcessorBundleAdjustment(ProcessorParamsBundleAdjust void ProcessorBundleAdjustment::configure(SensorBasePtr _sensor) { - //TODO: Implement + //TODO: Implement if needed } void ProcessorBundleAdjustment::preProcess() @@ -95,7 +95,7 @@ void ProcessorBundleAdjustment::preProcess() void ProcessorBundleAdjustment::postProcess() { - //TODO: visualization + //TODO: check visualization std::map<int,std::list<vision_utils::KeyPointEnhanced> > kp_enh_tracks; diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 126c76d39..09766bf6f 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -6,11 +6,13 @@ #include "core/sensor/sensor_factory.h" #include "vision/processor/processor_bundle_adjustment.h" #include "vision/capture/capture_image.h" +#include "vision/internal/config.h" using namespace wolf; std::string wolf_root = "/home/ovendrell/dev/vision"; +//std::string wolf_root = _WOLF_VISION_ROOT_DIR; class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment { @@ -69,7 +71,7 @@ TEST(ProcessorBundleAdjustment, installProcessor) // Install processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -89,7 +91,7 @@ TEST(ProcessorBundleAdjustment, preProcess) // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -98,10 +100,10 @@ TEST(ProcessorBundleAdjustment, preProcess) auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); proc_dummy->setInc(image_inc_ptr); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); proc_dummy->setLast(image_last_ptr); // Test dpreProcess proc_dummy->preProcess(); @@ -118,7 +120,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/src/examples/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -128,7 +130,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); ASSERT_NE(image_last_ptr->keypoints_.size(), 0); proc_dummy->setLast(image_last_ptr); @@ -137,7 +139,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) ASSERT_EQ(num, 0); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/src/examples/Test_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); proc_dummy->setInc(image_inc_ptr); // Test detectNewFeatures @@ -154,6 +156,126 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) ASSERT_EQ(num3, params->max_new_features); } +TEST(ProcessorBundleAdjustment, trackFeatures) +{ +// std::string wolf_root = _WOLF_ROOT_DIR; + + // Create processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); + + //fill feat_last list + FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); + proc_dummy->setLast(image_last_ptr); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); + proc_dummy->setInc(image_inc_ptr); + proc_dummy->preProcess(); + CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); + proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + //Test trackFeatures + FeatureBasePtrList feat_list_out = std::list<FeatureBasePtr>(); + FeatureMatchMap feat_correspondance = FeatureMatchMap(); + proc_dummy->trackFeatures(feat_list, feat_list_out, feat_correspondance); + ASSERT_EQ(feat_list.size(), feat_list_out.size()); +} + +TEST(ProcessorBundleAdjustment, postProcess) +{ +// std::string wolf_root = _WOLF_ROOT_DIR; + + // Create processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); + + //fill feat_last list + FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); + proc_dummy->setLast(image_last_ptr); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); + proc_dummy->setInc(image_inc_ptr); + proc_dummy->preProcess(); + CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); + proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + //Test trackFeatures + FeatureBasePtrList feat_list_out = std::list<FeatureBasePtr>(); + FeatureMatchMap feat_correspondance = FeatureMatchMap(); + proc_dummy->trackFeatures(feat_list, feat_list_out, feat_correspondance); + + proc_dummy->postProcess(); + +} +/* +TEST(ProcessorBundleAdjustment,fullTest) +{ + // std::string wolf_root = _WOLF_ROOT_DIR; + // std::cout << wolf_root << std::endl; + + // Wolf problem + ProblemPtr problem = Problem::create("PO", 3); + + // Install camera + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->width = 640; + intr->height = 480; + auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); + + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); + + // initialize + Scalar dt = 0.01 + TimeStamp t(0.0); + Vector7s x; x << 0,0,0, 0,0,0,1; + Matrix6s P = Matrix6s::Identity() * 0.000001; + problem->setPrior(x, P, t, dt/2); // KF1 + + // Track + cv::Mat image(intr->height, intr->width, CV_8UC3); // OpenCV cv::Mat(rows, cols) + image *= 0; // TODO see if we want to use a real image + SensorCameraPtr sens_trk_cam = std::static_pointer_cast<SensorCamera>(sens_cam); + CaptureImagePtr capt_trk = make_shared<CaptureImage>(t, sens_trk_cam, image); + proc->process(capt_trk); + + problem->print(2,0,1,0); + + for (size_t ii=0; ii<8; ii++ ) + { + // Move + t = t+dt; + WOLF_INFO("----------------------- ts: ", t , " --------------------------"); + + // Track + capt_trk = make_shared<CaptureImage>(t, sens_trk_cam, image); + proc_trk->process(capt_trk); + + problem->print(2,0,1,0); + + // Only odom creating KFs + ASSERT_TRUE( problem->getLastKeyFrame()->getType().compare("PO 3D")==0 ); + } +} +}*/ + int main(int argc, char **argv) { -- GitLab From 93cf66e8ded58be23a4b42934d2bec212adfe3dc Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Tue, 14 May 2019 13:04:21 +0200 Subject: [PATCH 06/58] WIP --- test/gtest_processor_bundle_adjustment.cpp | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 09766bf6f..fc24298c7 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -47,7 +47,7 @@ class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment }; // Use the following in case you want to initialize tests with predefines variables or methods. -//class ProcessorBundleAdjustment_class : public testing::Test{ +//class ProcessorBundleAdjustment_class : public testing::demo{ // public: // virtual void SetUp() // { @@ -100,12 +100,12 @@ TEST(ProcessorBundleAdjustment, preProcess) auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); proc_dummy->setInc(image_inc_ptr); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); proc_dummy->setLast(image_last_ptr); - // Test dpreProcess + // demo dpreProcess proc_dummy->preProcess(); CaptureImagePtr inc = std::static_pointer_cast<CaptureImage>(proc_dummy->getIncoming()); CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); @@ -130,19 +130,19 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); ASSERT_NE(image_last_ptr->keypoints_.size(), 0); proc_dummy->setLast(image_last_ptr); - // Test detectNewFeatures + // demo detectNewFeatures unsigned int num = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); ASSERT_EQ(num, 0); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); proc_dummy->setInc(image_inc_ptr); - // Test detectNewFeatures + // demo detectNewFeatures unsigned int num2 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); ASSERT_EQ(num2, 0); @@ -151,7 +151,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); ASSERT_NE(last->map_index_to_next_.size(),0); - // Test detectNewFeatures + // demo detectNewFeatures unsigned int num3 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); ASSERT_EQ(num3, params->max_new_features); } @@ -172,14 +172,14 @@ TEST(ProcessorBundleAdjustment, trackFeatures) //fill feat_last list FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); proc_dummy->setLast(image_last_ptr); - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); proc_dummy->setInc(image_inc_ptr); proc_dummy->preProcess(); CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); proc_dummy->detectNewFeatures(params->max_new_features, feat_list); - //Test trackFeatures + //demo trackFeatures FeatureBasePtrList feat_list_out = std::list<FeatureBasePtr>(); FeatureMatchMap feat_correspondance = FeatureMatchMap(); proc_dummy->trackFeatures(feat_list, feat_list_out, feat_correspondance); @@ -202,14 +202,14 @@ TEST(ProcessorBundleAdjustment, postProcess) //fill feat_last list FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); proc_dummy->setLast(image_last_ptr); - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/Test_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); proc_dummy->setInc(image_inc_ptr); proc_dummy->preProcess(); CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); proc_dummy->detectNewFeatures(params->max_new_features, feat_list); - //Test trackFeatures + //demo trackFeatures FeatureBasePtrList feat_list_out = std::list<FeatureBasePtr>(); FeatureMatchMap feat_correspondance = FeatureMatchMap(); proc_dummy->trackFeatures(feat_list, feat_list_out, feat_correspondance); @@ -218,7 +218,7 @@ TEST(ProcessorBundleAdjustment, postProcess) } /* -TEST(ProcessorBundleAdjustment,fullTest) +TEST(ProcessorBundleAdjustment,fulldemo) { // std::string wolf_root = _WOLF_ROOT_DIR; // std::cout << wolf_root << std::endl; -- GitLab From fbd986435cc3fd1702b6ea2637451de3acca691b Mon Sep 17 00:00:00 2001 From: Joaquim Casals <jcasals@iri.upc.edu> Date: Tue, 14 May 2019 14:19:30 +0200 Subject: [PATCH 07/58] Added config file for vision plugin --- internal/config.h.in | 4 ++-- test/gtest_processor_bundle_adjustment.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/config.h.in b/internal/config.h.in index 9f12d5e4a..b9008e196 100644 --- a/internal/config.h.in +++ b/internal/config.h.in @@ -24,8 +24,8 @@ // which will be added to the include path for compilation, // and installed with the public wolf headers. -#ifndef WOLF_INTERNAL_CONFIG_H_ -#define WOLF_INTERNAL_CONFIG_H_ +#ifndef WOLF_INTERNAL_${UPPERNAME}_CONFIG_H_ +#define WOLF_INTERNAL_${UPPERNAME}_CONFIG_H_ #cmakedefine _WOLF_DEBUG diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index fc24298c7..f1906e0e4 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -11,8 +11,8 @@ using namespace wolf; -std::string wolf_root = "/home/ovendrell/dev/vision"; -//std::string wolf_root = _WOLF_VISION_ROOT_DIR; +// std::string wolf_root = "/home/ovendrell/dev/vision"; +std::string wolf_root = _WOLF_VISION_ROOT_DIR; class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment { -- GitLab From 2f11f97d9f70fa6dce3971e15728137954bfd5fc Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Thu, 16 May 2019 13:34:17 +0200 Subject: [PATCH 08/58] wip --- src/processor/processor_bundle_adjustment.cpp | 81 ++++-- test/gtest_processor_bundle_adjustment.cpp | 272 +++++++++++------- 2 files changed, 228 insertions(+), 125 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index c2d82494b..e2daf4031 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -70,17 +70,17 @@ void ProcessorBundleAdjustment::preProcess() //TODO: Get only the best ones if (params_bundle_adjustment_->delete_ambiguities) //filter ambiguities { - std::map<int,int> ambiguities_map; + std::map<int,bool> ambiguities_map; for (auto match : capture_image_incoming_->matches_from_precedent_) if (ambiguities_map.count(match.trainIdx)) //if ambiguity - ambiguities_map[match.trainIdx] = 1; //ambiguity true + ambiguities_map[match.trainIdx] = true; //ambiguity true else //if not ambiguity - ambiguities_map[match.trainIdx] = 0; //ambiguity false + ambiguities_map[match.trainIdx] = false; //ambiguity false // Set capture map of match indices for (auto match : capture_image_incoming_->matches_from_precedent_) { if (!ambiguities_map.at(match.trainIdx)) - capture_image_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming + capture_image_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming } } else @@ -135,11 +135,11 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& { FeaturePointImagePtr feat_last = std::static_pointer_cast<FeaturePointImage>(feat_base); - if (capture_image_last_->map_index_to_next_.count(feat_last->getIndexKeyPoint())) //If the track exists + if (capture_image_last_->map_index_to_next_.count(feat_last->getIndexKeyPoint())) //If the track to incoming exists { int index_inc = capture_image_last_->map_index_to_next_.at(feat_last->getIndexKeyPoint()); - if (capture_image_incoming_->matches_normalized_scores_.at(index_inc) > mat_ptr_->getParams()->min_norm_score ) + if (true)//capture_image_incoming_->matches_normalized_scores_.at(index_inc) > mat_ptr_->getParams()->min_norm_score ) { // Get kp incoming and keypoint last cv::KeyPoint kp_inc = capture_image_incoming_->keypoints_.at(index_inc); @@ -153,13 +153,12 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& auto feature_match_ptr = std::make_shared<FeatureMatch>(); feature_match_ptr->feature_ptr_= feat_last; - feature_match_ptr->normalized_score_ = capture_image_incoming_->matches_normalized_scores_.at(index_inc); + feature_match_ptr->normalized_score_ = 1.0;//capture_image_incoming_->matches_normalized_scores_.at(index_inc); _feature_correspondences[feat_inc] = feature_match_ptr; - } } } - +// std::cout << "RUNNING trackFeatures()\n"; return _feature_correspondences.size(); } @@ -201,6 +200,9 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe } } + std::cout << "RUNNING detectNewFeatures()\n"; + + return _features_last_out.size(); } @@ -209,7 +211,11 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe bool ProcessorBundleAdjustment::correctFeatureDrift(const FeatureBasePtr _origin_feature, const FeatureBasePtr _last_feature, FeatureBasePtr _incoming_feature) { //TODO: Implement - return false; +//// assert(_origin_feature!=nullptr); +// assert( _last_feature!=nullptr); +// assert(_incoming_feature!=nullptr); +// std::cout << "RUNNING correctFeatureDrift()\n"; + return true; } bool ProcessorBundleAdjustment::voteForKeyFrame() @@ -253,7 +259,6 @@ FactorBasePtr ProcessorBundleAdjustment::createFactor(FeatureBasePtr _feature_pt LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _feature_ptr) { - FeaturePointImagePtr feat_point_image_ptr = std::static_pointer_cast<FeaturePointImage>( _feature_ptr); //FrameBasePtr anchor_frame = getLast()->getFrame(); @@ -262,6 +267,7 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur point2D[1] = feat_point_image_ptr->getKeypoint().pt.y; //Scalar distance = params_bundle_adjustment_->distance; // arbitrary value + Scalar distance = 1; Eigen::Vector4s vec_homogeneous; point2D = pinhole::depixellizePoint(getSensor()->getIntrinsic()->getState(),point2D); @@ -273,9 +279,22 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur point3D.normalize(); - vec_homogeneous = {point3D(0),point3D(1),point3D(2),1/1};//distance}; + vec_homogeneous = {point3D(0),point3D(1),point3D(2),1/distance}; - LandmarkHPPtr lmk_hp_ptr = std::make_shared<LandmarkHP>(vec_homogeneous, getSensor(), feat_point_image_ptr->getDescriptor()); + + //TODO: lmk from camera to world coordinate frame. + + Transform<Scalar,3,Affine> T_w_r + = Translation<Scalar,3>(_feature_ptr->getFrame()->getP()->getState()) + * Quaternions(_feature_ptr->getFrame()->getO()->getState().data()); + Transform<Scalar,3,Affine> T_r_c + = Translation<Scalar,3>(_feature_ptr->getCapture()->getSensorP()->getState()) + * Quaternions(_feature_ptr->getCapture()->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 4, 1> vec_homogeneous_w = T_w_r + * T_r_c + * vec_homogeneous; + + LandmarkHPPtr lmk_hp_ptr = std::make_shared<LandmarkHP>(vec_homogeneous_w, getSensor(), feat_point_image_ptr->getDescriptor()); _feature_ptr->setLandmarkId(lmk_hp_ptr->id()); return lmk_hp_ptr; } @@ -283,35 +302,47 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur void ProcessorBundleAdjustment::establishFactors() { - TrackMatches matches_origin_inc = track_matrix_.matches(origin_ptr_, incoming_ptr_); + TrackMatches matches_origin_inc = track_matrix_.matches(origin_ptr_, last_ptr_); for (auto const & pair_trkid_pair : matches_origin_inc) { size_t trkid = pair_trkid_pair.first; FeatureBasePtr feature_origin = pair_trkid_pair.second.first; - FeatureBasePtr feature_inc = pair_trkid_pair.second.second; + FeatureBasePtr feature_last = pair_trkid_pair.second.second; + + assert(feature_origin!=nullptr && "null feature origin"); + assert(feature_last!=nullptr && "null feature last"); + assert(feature_origin->getCapture()!=nullptr); + assert(feature_last->getCapture()!=nullptr); + assert(feature_last->getCapture()->getFrame()!=nullptr && feature_last->getCapture()->getFrame()->isKey()); + assert(feature_origin->getCapture()->getFrame()!=nullptr && feature_origin->getCapture()->getFrame()->isKey()); - //TODO: don't use map[track_id] = landmarkptr. if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr { //createLandmark LandmarkBasePtr lmk = createLandmark(feature_origin); + assert(lmk!=nullptr); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + getProblem()->addLandmark(lmk_hp); //add Landmark to map: map[track_id] = landmarkptr lmk_track_map_[trkid] = lmk; //create factors +// assert(feature_origin->getCapture()->getSensor() != nullptr); +// assert(feature_origin->getCapture()->getSensorP() != nullptr); +// assert(feature_origin->getCapture()->getSensorO() != nullptr); +// assert(lmk->getP() != nullptr); FactorPixelHPPtr fac_ptr_origin = std::make_shared<FactorPixelHP>(feature_origin, lmk_hp, shared_from_this()); if (fac_ptr_origin != nullptr) // factor links { feature_origin->addFactor(fac_ptr_origin); lmk->addConstrainedBy(fac_ptr_origin); } - FactorPixelHPPtr fac_ptr_inc = std::make_shared<FactorPixelHP>(feature_inc, lmk_hp, shared_from_this()); - if (fac_ptr_inc != nullptr) // factor links + FactorPixelHPPtr fac_ptr_last = std::make_shared<FactorPixelHP>(feature_last, lmk_hp, shared_from_this()); + if (fac_ptr_last != nullptr) // factor links { - feature_inc->addFactor(fac_ptr_inc); - lmk->addConstrainedBy(fac_ptr_inc); + feature_last->addFactor(fac_ptr_last); + lmk->addConstrainedBy(fac_ptr_last); } } else @@ -320,19 +351,17 @@ void ProcessorBundleAdjustment::establishFactors() LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); //Create factor - FactorPixelHPPtr fac_ptr_inc = std::make_shared<FactorPixelHP>(feature_inc, lmk_hp, shared_from_this()); - if (fac_ptr_inc != nullptr) // factor links + FactorPixelHPPtr fac_ptr_last = std::make_shared<FactorPixelHP>(feature_last, lmk_hp, shared_from_this()); + if (fac_ptr_last != nullptr) // factor links { - feature_inc->addFactor(fac_ptr_inc); - lmk->addConstrainedBy(fac_ptr_inc); + feature_last->addFactor(fac_ptr_last); + lmk->addConstrainedBy(fac_ptr_last); } } } } - - ProcessorBasePtr ProcessorBundleAdjustment::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr _sensor_ptr) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index fc24298c7..c87bc3d91 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -8,11 +8,16 @@ #include "vision/capture/capture_image.h" #include "vision/internal/config.h" +// Vision utils includes +#include <vision_utils.h> +#include <sensors.h> +#include <common_class/buffer.h> +#include <common_class/frame.h> using namespace wolf; -std::string wolf_root = "/home/ovendrell/dev/vision"; -//std::string wolf_root = _WOLF_VISION_ROOT_DIR; +//std::string wolf_root = "/home/ovendrell/dev/vision"; +std::string wolf_root = _WOLF_VISION_ROOT_DIR; class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment { @@ -31,11 +36,40 @@ class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment capture_image_incoming_ = _incoming_ptr; } - CaptureImagePtr createCaptureImage(std::string _path, bool detectAndDescript = false) + std::map<size_t, LandmarkBasePtr> getLandmarkMap() + { + return lmk_track_map_; + } + + unsigned int getProcessKnown() + { + return this->processKnown(); + } + + unsigned int getProcessNew(const int& _max_new_features) + { + return this->processNew(_max_new_features); + } + + TrackMatrix getTrackMatrix() + { + return track_matrix_; + } + + FeatureBasePtrList getKnownFeaturesIncoming() + { + return known_features_incoming_; + } + FeatureMatchMap getMatchesLastFromIncoming() + { + return matches_last_from_incoming_; + } + + CaptureImagePtr createCaptureImage(std::string _path, SensorCameraPtr _sensor, bool detectAndDescript = false) { const Scalar time = 0.0; TimeStamp ts(time); - CaptureImagePtr im = std::make_shared<CaptureImage>(ts, nullptr, cv::imread(_path)); + CaptureImagePtr im = std::make_shared<CaptureImage>(ts, _sensor, cv::imread(_path)); if (detectAndDescript){ // Detect KeyPoints im->keypoints_ = det_ptr_->detect(im->getImage()); @@ -56,9 +90,6 @@ class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment TEST(ProcessorBundleAdjustment, installProcessor) { -// std::string wolf_root = _WOLF_ROOT_DIR; -// std::cout << wolf_root << std::endl; - // Wolf problem ProblemPtr problem = Problem::create("PO", 3); @@ -86,8 +117,6 @@ TEST(ProcessorBundleAdjustment, installProcessor) TEST(ProcessorBundleAdjustment, preProcess) { -// std::string wolf_root = _WOLF_ROOT_DIR; - // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; @@ -100,10 +129,10 @@ TEST(ProcessorBundleAdjustment, preProcess) auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); proc_dummy->setInc(image_inc_ptr); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); proc_dummy->setLast(image_last_ptr); // demo dpreProcess proc_dummy->preProcess(); @@ -115,8 +144,6 @@ TEST(ProcessorBundleAdjustment, preProcess) TEST(ProcessorBundleAdjustment, detectNewFeatures) { -// std::string wolf_root = _WOLF_ROOT_DIR; - // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; @@ -130,7 +157,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); ASSERT_NE(image_last_ptr->keypoints_.size(), 0); proc_dummy->setLast(image_last_ptr); @@ -139,7 +166,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) ASSERT_EQ(num, 0); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); proc_dummy->setInc(image_inc_ptr); // demo detectNewFeatures @@ -158,8 +185,6 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) TEST(ProcessorBundleAdjustment, trackFeatures) { -// std::string wolf_root = _WOLF_ROOT_DIR; - // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; @@ -172,9 +197,9 @@ TEST(ProcessorBundleAdjustment, trackFeatures) //fill feat_last list FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); proc_dummy->setLast(image_last_ptr); - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); proc_dummy->setInc(image_inc_ptr); proc_dummy->preProcess(); CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); @@ -186,95 +211,144 @@ TEST(ProcessorBundleAdjustment, trackFeatures) ASSERT_EQ(feat_list.size(), feat_list_out.size()); } -TEST(ProcessorBundleAdjustment, postProcess) + +TEST(ProcessorBundleAdjustment, establishFactors) { -// std::string wolf_root = _WOLF_ROOT_DIR; - - // Create processor - ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); - params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; - params->pixel_noise_std = 1.0; - params->min_track_length_for_factor = 3; - params->voting_active = true; - params->max_new_features = 5; - auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); - - //fill feat_last list - FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", true); - proc_dummy->setLast(image_last_ptr); - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg"); - proc_dummy->setInc(image_inc_ptr); - proc_dummy->preProcess(); - CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); - proc_dummy->detectNewFeatures(params->max_new_features, feat_list); - //demo trackFeatures - FeatureBasePtrList feat_list_out = std::list<FeatureBasePtr>(); - FeatureMatchMap feat_correspondance = FeatureMatchMap(); - proc_dummy->trackFeatures(feat_list, feat_list_out, feat_correspondance); - - proc_dummy->postProcess(); + std::cout << "EMPTY Test\n"; +} +TEST(ProcessorBundleAdjustment, createLandmark) +{ + std::cout << "EMPTY Test\n"; } -/* -TEST(ProcessorBundleAdjustment,fulldemo) + + +TEST(ProcessorBundleAdjustment, process) { - // std::string wolf_root = _WOLF_ROOT_DIR; - // std::cout << wolf_root << std::endl; - - // Wolf problem - ProblemPtr problem = Problem::create("PO", 3); - - // Install camera - IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML - intr->width = 640; - intr->height = 480; - auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); - - // Install processor - ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); - params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; - params->pixel_noise_std = 1.0; - params->min_track_length_for_factor = 3; - params->voting_active = true; - params->max_new_features = 5; - auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); - - // initialize - Scalar dt = 0.01 - TimeStamp t(0.0); - Vector7s x; x << 0,0,0, 0,0,0,1; - Matrix6s P = Matrix6s::Identity() * 0.000001; - problem->setPrior(x, P, t, dt/2); // KF1 - - // Track - cv::Mat image(intr->height, intr->width, CV_8UC3); // OpenCV cv::Mat(rows, cols) - image *= 0; // TODO see if we want to use a real image - SensorCameraPtr sens_trk_cam = std::static_pointer_cast<SensorCamera>(sens_cam); - CaptureImagePtr capt_trk = make_shared<CaptureImage>(t, sens_trk_cam, image); - proc->process(capt_trk); - - problem->print(2,0,1,0); - - for (size_t ii=0; ii<8; ii++ ) - { - // Move - t = t+dt; - WOLF_INFO("----------------------- ts: ", t , " --------------------------"); + // Wolf problem + ProblemPtr problem = Problem::create("PO", 3); - // Track - capt_trk = make_shared<CaptureImage>(t, sens_trk_cam, image); - proc_trk->process(capt_trk); + // Install camera + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->width = 640; + intr->height = 480; + SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); - problem->print(2,0,1,0); + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); + auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); + + //1ST TIME + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + proc_dummy->process(image_inc_ptr); + ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), 0); + ASSERT_EQ(problem->getMap()->getLandmarkList().size(), 0); + + //2ND TIME + CaptureImagePtr image_inc_ptr2 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); +// proc_dummy->setInc(image_inc_ptr2); +// proc_dummy->preProcess(); +// proc_dummy->getProcessKnown(); +// proc_dummy->getProcessNew(params->max_new_features); +// proc_dummy->establishFactors(); + proc_dummy->process(image_inc_ptr2); + ASSERT_EQ(problem->getMap()->getLandmarkList().size(), params->max_new_features); + ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); + + //3RD TIME -- RUNNING + CaptureImagePtr image_inc_ptr3 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + assert(proc_dummy->getOrigin()!=nullptr); + assert(proc_dummy->getLast()!= nullptr && proc_dummy->getLast()!=proc_dummy->getOrigin()); + proc_dummy->process(image_inc_ptr3); + ASSERT_EQ(problem->getMap()->getLandmarkList().size(), params->max_new_features); + ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); + + //4TH TIME -- RUNNING + CaptureImagePtr image_inc_ptr4 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + proc_dummy->process(image_inc_ptr4); + ASSERT_EQ(image_inc_ptr4->getFeatureList().size(), params->max_new_features); +} + +TEST(ProcessorBundleAdjustment, processVideo) +{ + // Wolf problem + ProblemPtr problem = Problem::create("PO", 3); + + // Install camera + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->width = 640; + intr->height = 480; + SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); + + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = false; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 400; + params->min_features_for_keyframe = 0; + auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); + auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); + + //==================================vision_utils ============================================ + vision_utils::SensorCameraPtr sen_ptr = std::make_shared<vision_utils::SensorCamera>(); + sen_ptr->open("/home/ovendrell/eclipse-workspace/ddm_triad/data/video/VID4b.mp4"); + //"/home/ovendrell/dev/vision_utils/src/test/data/test_usb_cam.mp4"); + + unsigned int buffer_size = 10; + vision_utils::Buffer<vision_utils::FramePtr> frame_buff(buffer_size); + frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), 0) ); + + unsigned int img_width = frame_buff.back()->getImage().cols; + unsigned int img_height = frame_buff.back()->getImage().rows; + std::cout << "Image size: " << img_width << "x" << img_height << std::endl; + //==================================vision_utils ============================================ + + SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); + camera->setImgWidth(img_width); + camera->setImgHeight(img_height); + ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); + + TimeStamp t = 0; + // main loop + Scalar dt = 0.04; + for(int frame_count = 0; frame_count<150; ++frame_count) + { + t += dt; + std::cout << "Avis 0" << std::endl; + // Image --------------------------------------------- + frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), frame_count) ); + std::cout << "Avis 1" << std::endl; + CaptureImagePtr image = std::make_shared<CaptureImage>(t, camera, frame_buff.back()->getImage()); + std::cout << "Avis 2" << std::endl; + /* process */ + camera->process(image); + std::cout << "FEATURES:" << image->getFeatureList().size() << std::endl; + std::cout << "MATCHES:" << image->matches_from_precedent_.size() << std::endl; - // Only odom creating KFs - ASSERT_TRUE( problem->getLastKeyFrame()->getType().compare("PO 3D")==0 ); } } -}*/ + + +TEST(ProcessorBundleAdjustment, processKnown) +{ + std::cout << "EMPTY Test\n"; +} + +TEST(ProcessorBundleAdjustment, processNew) +{ + std::cout << "EMPTY Test\n"; +} + int main(int argc, char **argv) -- GitLab From 0a597a1a2ce2b8a212ae4d285875a703509f6124 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Wed, 22 May 2019 11:47:50 +0200 Subject: [PATCH 09/58] WIP --- include/vision/factor/factor_pixelHP.h | 35 +- src/landmark/landmark_HP.cpp | 2 +- src/processor/processor_bundle_adjustment.cpp | 68 ++-- src/sensor/sensor_camera.cpp | 2 +- test/CMakeLists.txt | 4 + test/gtest_factor_autodiff_trifocal.cpp | 6 +- test/gtest_factor_pixelHP.cpp | 340 ++++++++++++++++++ test/gtest_processor_bundle_adjustment.cpp | 76 +++- 8 files changed, 469 insertions(+), 64 deletions(-) create mode 100644 test/gtest_factor_pixelHP.cpp diff --git a/include/vision/factor/factor_pixelHP.h b/include/vision/factor/factor_pixelHP.h index 070ee1062..6e688febe 100644 --- a/include/vision/factor/factor_pixelHP.h +++ b/include/vision/factor/factor_pixelHP.h @@ -77,8 +77,9 @@ inline FactorPixelHP::FactorPixelHP(const FeatureBasePtr& _ftr_ptr, _ftr_ptr->getCapture()->getSensorP(), _ftr_ptr->getCapture()->getSensorO(), _landmark_ptr->getP()), - intrinsic_(_ftr_ptr->getCapture()->getSensor()->getIntrinsic()->getState()) //TODO: what to do with intrinsic? + intrinsic_(_ftr_ptr->getCapture()->getSensor()->getIntrinsic()->getState()) //TODO: intrinsic { +// std::cout << "FactorPixelHP::Constructor\n"; // obtain some intrinsics from provided sensor distortion_ = (std::static_pointer_cast<SensorCamera>(_ftr_ptr->getCapture()->getSensor()))->getDistortionVector(); } @@ -119,22 +120,33 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, Map<const Matrix<T, 3, 1> > p_w_r(_frame_p); Translation<T, 3> t_w_r(p_w_r); Map<const Quaternion<T> > q_w_r(_frame_o); - TransformType T_W_R = t_w_r * q_w_r; + TransformType T_w_r = t_w_r * q_w_r; // current robot to current camera transform - CaptureBasePtr capture = this->getFeature()->getCapture(); - Translation<T, 3> t_r_c (capture->getSensorP()->getState().cast<T>()); - Quaternions q_r_c_s(Eigen::Vector4s(capture->getSensorO()->getState())); - Quaternion<T> q_r_c = q_r_c_s.cast<T>(); - TransformType T_R_C = t_r_c * q_r_c; + Map<const Matrix<T, 3, 1> > p_r_c(_sensor_p); + Translation<T, 3> t_r_c(p_r_c); + Map<const Quaternion<T> > q_r_c(_sensor_o); + TransformType T_r_c = t_r_c * q_r_c; + +// CaptureBasePtr capture = this->getFeature()->getCapture(); +// Translation<T, 3> t_r_c (capture->getSensorP()->getState().cast<T>()); +// Quaternions q_r_c_s(Eigen::Vector4s(capture->getSensorO()->getState())); +// Quaternion<T> q_r_c = q_r_c_s.cast<T>(); +// TransformType T_R_C = t_r_c * q_r_c; // hmg point in current camera frame C Eigen::Map<const Eigen::Matrix<T, 4, 1> > landmark_hmg(_lmk_hmg); - Eigen::Matrix<T, 4, 1> landmark_hmg_c = T_R_C .inverse(Eigen::Affine) - * T_W_R .inverse(Eigen::Affine) + Eigen::Matrix<T, 4, 1> landmark_hmg_c = T_r_c .inverse(Eigen::Affine) + * T_w_r .inverse(Eigen::Affine) * landmark_hmg; - // lmk direction vector //TODO: + //std::cout << "p_w_r = \n\t" << _frame_p[0] << "\n\t" << _frame_p[1] << "\n\t" << _frame_p[2] << "\n"; +// std::cout << "q_w_r = \n\t" << _frame_o[0] << "\n\t" << _frame_o[1] << "\n\t" << _frame_o[2] << "\n\t" << _frame_o[3] << "\n"; +// std::cout << "p_r_c = \n\t" << _sensor_p[0] << "\n\t" << _sensor_p[1] << "\n\t" << _sensor_p[2] << "\n"; +// std::cout << "q_r_c = \n\t" << _sensor_o[0] << "\n\t" << _sensor_o[1] << "\n\t" << _sensor_o[2] << "\n\t" << _sensor_o[3] << "\n"; + std::cout << "landmark_hmg_c = \n\t" << landmark_hmg_c(0) << "\n\t" << landmark_hmg_c(1) << "\n\t" << landmark_hmg_c(2) << "\n\t" << landmark_hmg_c(3) << "\n"; + + // lmk direction vector Eigen::Matrix<T, 3, 1> v_dir = landmark_hmg_c.head(3); // camera parameters @@ -144,6 +156,9 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, // project point and exit Eigen::Map<Eigen::Matrix<T, 2, 1> > expectation(_expectation); expectation = pinhole::projectPoint(intrinsic, distortion, v_dir); + + std::cout << "expectation = \n\t" << expectation(0) << "\n\t" << expectation(1) << "\n"; + } template<typename T> diff --git a/src/landmark/landmark_HP.cpp b/src/landmark/landmark_HP.cpp index 73cfc148d..dc3f3043c 100644 --- a/src/landmark/landmark_HP.cpp +++ b/src/landmark/landmark_HP.cpp @@ -37,7 +37,7 @@ Eigen::Vector3s LandmarkHP::point() const { using namespace Eigen; - /* TODO: + /* TODO: done when creating the landmark Transform<Scalar,3,Affine> T_w_r = Translation<Scalar,3>(getAnchorFrame()->getP()->getState()) * Quaternions(getAnchorFrame()->getO()->getState().data()); diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index e2daf4031..88adbc708 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -95,8 +95,6 @@ void ProcessorBundleAdjustment::preProcess() void ProcessorBundleAdjustment::postProcess() { - //TODO: check visualization - std::map<int,std::list<vision_utils::KeyPointEnhanced> > kp_enh_tracks; for (auto const & feat_base : last_ptr_->getFeatureList()) @@ -158,7 +156,6 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& } } } -// std::cout << "RUNNING trackFeatures()\n"; return _feature_correspondences.size(); } @@ -200,9 +197,6 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe } } - std::cout << "RUNNING detectNewFeatures()\n"; - - return _features_last_out.size(); } @@ -210,11 +204,7 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe bool ProcessorBundleAdjustment::correctFeatureDrift(const FeatureBasePtr _origin_feature, const FeatureBasePtr _last_feature, FeatureBasePtr _incoming_feature) { - //TODO: Implement -//// assert(_origin_feature!=nullptr); -// assert( _last_feature!=nullptr); -// assert(_incoming_feature!=nullptr); -// std::cout << "RUNNING correctFeatureDrift()\n"; + //TODO: Implement if needed return true; } @@ -260,30 +250,19 @@ FactorBasePtr ProcessorBundleAdjustment::createFactor(FeatureBasePtr _feature_pt LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _feature_ptr) { FeaturePointImagePtr feat_point_image_ptr = std::static_pointer_cast<FeaturePointImage>( _feature_ptr); - //FrameBasePtr anchor_frame = getLast()->getFrame(); + Eigen::Vector2s point2D = _feature_ptr->getMeasurement(); + + Eigen::Vector3s point3D; + point3D = pinhole::backprojectPoint(getSensor()->getIntrinsic()->getState(),(std::static_pointer_cast<SensorCamera>(getSensor()))->getCorrectionVector(), point2D); + point3D.normalize(); - Eigen::Vector2s point2D; - point2D[0] = feat_point_image_ptr->getKeypoint().pt.x; - point2D[1] = feat_point_image_ptr->getKeypoint().pt.y; //Scalar distance = params_bundle_adjustment_->distance; // arbitrary value Scalar distance = 1; Eigen::Vector4s vec_homogeneous; - - point2D = pinhole::depixellizePoint(getSensor()->getIntrinsic()->getState(),point2D); - point2D = pinhole::undistortPoint((std::static_pointer_cast<SensorCamera>(getSensor()))->getCorrectionVector(),point2D); - - Eigen::Vector3s point3D; - point3D.head<2>() = point2D; - point3D(2) = 1; - - point3D.normalize(); - vec_homogeneous = {point3D(0),point3D(1),point3D(2),1/distance}; - //TODO: lmk from camera to world coordinate frame. - Transform<Scalar,3,Affine> T_w_r = Translation<Scalar,3>(_feature_ptr->getFrame()->getP()->getState()) * Quaternions(_feature_ptr->getFrame()->getO()->getState().data()); @@ -294,6 +273,13 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur * T_r_c * vec_homogeneous; + + std::cout << "Point2D: " << point2D.transpose() << std::endl; + std::cout << "Point3D: " << point3D.transpose() << std::endl; + std::cout << "Hmg_c: " << vec_homogeneous.transpose() << std::endl; + std::cout << "Hmg_w: " << vec_homogeneous_w.transpose() << std::endl; + //vec_homogeneous_w = vec_homogeneous; + LandmarkHPPtr lmk_hp_ptr = std::make_shared<LandmarkHP>(vec_homogeneous_w, getSensor(), feat_point_image_ptr->getDescriptor()); _feature_ptr->setLandmarkId(lmk_hp_ptr->id()); return lmk_hp_ptr; @@ -310,12 +296,12 @@ void ProcessorBundleAdjustment::establishFactors() FeatureBasePtr feature_origin = pair_trkid_pair.second.first; FeatureBasePtr feature_last = pair_trkid_pair.second.second; - assert(feature_origin!=nullptr && "null feature origin"); - assert(feature_last!=nullptr && "null feature last"); - assert(feature_origin->getCapture()!=nullptr); - assert(feature_last->getCapture()!=nullptr); - assert(feature_last->getCapture()->getFrame()!=nullptr && feature_last->getCapture()->getFrame()->isKey()); - assert(feature_origin->getCapture()->getFrame()!=nullptr && feature_origin->getCapture()->getFrame()->isKey()); +// assert(feature_origin!=nullptr && "null feature origin"); +// assert(feature_last!=nullptr && "null feature last"); +// assert(feature_origin->getCapture()!=nullptr); +// assert(feature_last->getCapture()!=nullptr); +// assert(feature_last->getCapture()->getFrame()!=nullptr && feature_last->getCapture()->getFrame()->isKey()); +// assert(feature_origin->getCapture()->getFrame()!=nullptr && feature_origin->getCapture()->getFrame()->isKey()); if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr { @@ -335,14 +321,16 @@ void ProcessorBundleAdjustment::establishFactors() FactorPixelHPPtr fac_ptr_origin = std::make_shared<FactorPixelHP>(feature_origin, lmk_hp, shared_from_this()); if (fac_ptr_origin != nullptr) // factor links { - feature_origin->addFactor(fac_ptr_origin); - lmk->addConstrainedBy(fac_ptr_origin); + feature_origin->addFactor(fac_ptr_origin); + fac_ptr_origin->link(feature_origin); + lmk->addConstrainedBy(fac_ptr_origin); } FactorPixelHPPtr fac_ptr_last = std::make_shared<FactorPixelHP>(feature_last, lmk_hp, shared_from_this()); if (fac_ptr_last != nullptr) // factor links { - feature_last->addFactor(fac_ptr_last); - lmk->addConstrainedBy(fac_ptr_last); + feature_last->addFactor(fac_ptr_last); + fac_ptr_last->link(feature_last); + lmk->addConstrainedBy(fac_ptr_last); } } else @@ -354,11 +342,11 @@ void ProcessorBundleAdjustment::establishFactors() FactorPixelHPPtr fac_ptr_last = std::make_shared<FactorPixelHP>(feature_last, lmk_hp, shared_from_this()); if (fac_ptr_last != nullptr) // factor links { - feature_last->addFactor(fac_ptr_last); - lmk->addConstrainedBy(fac_ptr_last); + feature_last->addFactor(fac_ptr_last); + fac_ptr_last->link(feature_last); + lmk->addConstrainedBy(fac_ptr_last); } } - } } diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp index 1d36cde10..9d5b9fcc5 100644 --- a/src/sensor/sensor_camera.cpp +++ b/src/sensor/sensor_camera.cpp @@ -12,7 +12,7 @@ SensorCamera::SensorCamera(const Eigen::VectorXs& _extrinsics, const IntrinsicsC img_width_(_intrinsics.width), // img_height_(_intrinsics.height), // distortion_(_intrinsics.distortion), // - correction_(distortion_.size() + 1), // make correction vector slightly larger in size than the distortion vector + correction_(distortion_.size()==0 ? 0 : distortion_.size() + 1), // make correction vector slightly larger in size than the distortion vector pinhole_model_raw_(_intrinsics.pinhole_model_raw), // pinhole_model_rectified_(_intrinsics.pinhole_model_rectified), // using_raw_(true) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index da0968019..e7e76d38a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -24,3 +24,7 @@ target_link_libraries(gtest_processor_tracker_feature_trifocal ${PLUGIN_NAME} ${ # ProcessorBundleAdjustment test wolf_add_gtest(gtest_processor_bundle_adjustment gtest_processor_bundle_adjustment.cpp) target_link_libraries(gtest_processor_bundle_adjustment ${PLUGIN_NAME} ${wolf_LIBRARY} ${OpenCV_LIBS} ${vision_utils_LIBRARY}) + +# FactorPixelHP test +wolf_add_gtest(gtest_factor_pixelHP gtest_factor_pixelHP.cpp) +target_link_libraries(gtest_factor_pixelHP ${PLUGIN_NAME} ${wolf_LIBRARY} ${OpenCV_LIBS} ${vision_utils_LIBRARY}) \ No newline at end of file diff --git a/test/gtest_factor_autodiff_trifocal.cpp b/test/gtest_factor_autodiff_trifocal.cpp index 5312a2905..cad71af23 100644 --- a/test/gtest_factor_autodiff_trifocal.cpp +++ b/test/gtest_factor_autodiff_trifocal.cpp @@ -3,9 +3,9 @@ #include "core/utils/logging.h" #include "core/ceres_wrapper/ceres_manager.h" -#include "core/processor/processor_tracker_feature_trifocal.h" -#include "core/capture/capture_image.h" -#include "core/factor/factor_autodiff_trifocal.h" +#include "vision/processor/processor_tracker_feature_trifocal.h" +#include "vision/capture/capture_image.h" +#include "vision/factor/factor_autodiff_trifocal.h" using namespace Eigen; using namespace wolf; diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp new file mode 100644 index 000000000..beb8be0ac --- /dev/null +++ b/test/gtest_factor_pixelHP.cpp @@ -0,0 +1,340 @@ +/* + * gtest_factor_pixelHP.cpp + * + * Created on: May 16, 2019 + * Author: ovendrell + */ +#include "core/factor/factor_block_absolute.h" +#include "core/factor/factor_quaternion_absolute.h" + +#include "utils_gtest.h" +#include "vision/factor/factor_pixelHP.h" +#include "vision/landmark/landmark_HP.h" +#include "vision/capture/capture_image.h" +#include "core/ceres_wrapper/ceres_manager.h" +#include "vision/processor/processor_bundle_adjustment.h" +#include "vision/internal/config.h" +#include "core/math/pinhole_tools.h" + +#include "core/ceres_wrapper/ceres_manager.h" + +using namespace wolf; +using namespace Eigen; + +std::string wolf_root = _WOLF_VISION_ROOT_DIR; + + +class FactorPixelHPTest : public testing::Test{ + public: + Vector3s pos1, pos2, pos3, pos_cam, point; + Vector3s euler1, euler2, euler3, euler_cam; + Quaternions quat1, quat2, quat3, quat_cam; + Vector4s vquat1, vquat2, vquat3, vquat_cam; // quaternions as vectors + Vector7s pose1, pose2, pose3, pose_cam; + Vector4s lmkHP1; + + ProblemPtr problem; + CeresManagerPtr ceres_manager; + + SensorCameraPtr camera; + ProcessorBundleAdjustmentPtr proc_bundle_adjustment; + + SensorBasePtr S; + FrameBasePtr F1, F2, F3; + CaptureImagePtr I1, I2, I3; + FeaturePointImagePtr f1, f2, f3; + + LandmarkHPPtr L1; + + FactorPixelHPPtr c1; + FactorPixelHPPtr c2; + FactorPixelHPPtr c3; + + Scalar pixel_noise_std; + + virtual ~FactorPixelHPTest() + { + std::cout << "destructor\n"; + } + + virtual void SetUp() override + { + // configuration + /* + * We have three robot poses, in three frames, with cameras C1, C2, C3 + * looking towards the origin of coordinates: + * + * Z + * | + * ________ C3 + * / | / + * --------- /| C2 + * | / | + * |____________/_ | ___ Y + * / | / + * / | / + * --------- C1 |/ + * | / | + * --------- + * / + * X + * + * Each robot pose is at one axis, facing the origin: + * F1: pos = (1,0,0), ori = (0,0,pi) + * F2: pos = (0,1,0), ori = (0,0,-pi/2) + * F3: pos = (0,0,1), ori = (0,pi/2,pi) + * + * The robot has a camera looking forward + * S: pos = (0,0,0), ori = (-pi/1, 0, -pi/1) + * + * There is a point at the origin + * P: pos = (0,0,0) + * + * The camera is canonical + * K = Id. + * + * Therefore, P projects exactly at the origin on each camera, + * creating three features: + * f1: p1 = (0,0) + * f2: p2 = (0,0) + * f3: p3 = (0,0) + * + * We form a Wolf tree with three frames, three captures, + * three features, one landmark and 3 factors: + * + * Frame F1, Capture C1, feature f1, factor c1 + * Frame F2, Capture C2, feature f2, factor c2 + * Frame F3, Capture C3, feature f3, factor c3 + * Landmark L1 + * + * The three frame poses F1, F2, F3, the camera pose S in the robot frame + * and the Landmark position are variables subject to optimization + * + * We perform a number of tests based on this configuration. + */ + + // all frames look to the origin + pos1 << 2, 1, 1; + pos2 << 1, 2, 1; + pos3 << 1, 1, 2; + euler1 << 0, 0 , M_PI ; + euler2 << 0, 0 , -M_PI_2 ; + euler3 << 0, M_PI_2, M_PI ; + quat1 = e2q(euler1); + quat2 = e2q(euler2); + quat3 = e2q(euler3); + vquat1 = quat1.coeffs(); + vquat2 = quat2.coeffs(); + vquat3 = quat3.coeffs(); + pose1 << pos1, vquat1; + pose2 << pos2, vquat2; + pose3 << pos3, vquat3; + lmkHP1 << 1, 1, 1, 1/sqrt(3); + + // camera at the robot origin looking forward + pos_cam << 0, 0, 0; + euler_cam << 0,0,0;//-M_PI_2, 0, -M_PI_2; + quat_cam = e2q(euler_cam); + vquat_cam = quat_cam.coeffs(); + pose_cam << pos_cam, vquat_cam; + + // Build problem + problem = Problem::create("PO", 3); + ceres::Solver::Options options; + ceres_manager = std::make_shared<CeresManager>(problem, options); + + // Install sensor and processor + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); + intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); + intr->width = 640; + intr->height = 480; + S = problem->installSensor("CAMERA", "camera", pose_cam, intr); + camera = std::static_pointer_cast<SensorCamera>(S); + +// ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); +// params->delete_ambiguities = true; +// params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; +// params->pixel_noise_std = 1.0; +// params->min_track_length_for_factor = 3; +// params->voting_active = true; +// params->max_new_features = 5; +// +// ProcessorBasePtr proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", camera, params); +// proc_bundle_adjustment = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); + + // Add three viewpoints with frame, capture and feature + pixel_noise_std = 1.0; //params->pixel_noise_std; + Vector2s pix(0,0); + Matrix2s pix_cov(Matrix2s::Identity() * pow(pixel_noise_std, 2)); + + // Point + cv::Point2f p = cv::Point2f(intr->width /2, intr->height/2); + cv::KeyPoint kp = cv::KeyPoint(p, 32.0f); + cv::Mat des = cv::Mat::zeros(1,8, CV_8UC1); + + F1 = problem->emplaceFrame(KEY, pose1, 1.0); + I1 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F1, 1.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1))); + f1 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp, 0, des, pix_cov)); // pixel at origin + + F2 = problem->emplaceFrame(KEY, pose2, 2.0); + I2 = std::static_pointer_cast<CaptureImage>((CaptureBase::emplace<CaptureImage>(F2, 2.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1)))); + f2 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp, 0, des, pix_cov)); // pixel at origin + + F3 = problem->emplaceFrame(KEY, pose3, 3.0); + I3 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F3, 3.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1))); + f3 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp, 0, des, pix_cov)); // pixel at origin + + //create Landmark -- with f1, f2 or f3 + //LandmarkBasePtr lmk = proc_bundle_adjustment->createLandmark(f1); + L1 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP1, camera, des)); +// problem->addLandmark(L1); +// lmk->link(problem->getMap()); + + // factors + c1 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f1, f1, L1, nullptr /*proc*/)); + c2 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f2, f2, L1, nullptr /*proc*/)); + c3 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f3, f3, L1, nullptr /*proc*/)); + } +}; + +TEST(ProcessorFactorPixelHP, test) +{ + //Build problem + ProblemPtr problem_ptr = Problem::create("PO", 3); + CeresManagerPtr ceres_mgr = std::make_shared<CeresManager>(problem_ptr); + + // Install sensor + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); + intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); + intr->width = 640; + intr->height = 480; + auto sens_cam = problem_ptr->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); + SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = problem_ptr->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); + ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); + + // Frame + FrameBasePtr frm0 = problem_ptr->emplaceFrame(KEY, problem_ptr->zeroState(), TimeStamp(0)); + + // Capture + auto cap0 = std::static_pointer_cast<CaptureImage>(CaptureImage::emplace<CaptureImage>(frm0, TimeStamp(0), camera, cv::Mat::zeros(480,640, 1))); + + // Feature + cv::Point2f p = cv::Point2f(240, 320); + cv::KeyPoint kp = cv::KeyPoint(p, 32.0f); + cv::Mat des = cv::Mat::zeros(1,8, CV_8U); + + FeaturePointImagePtr fea0 = std::make_shared<FeaturePointImage>(kp, 0, des, Eigen::Matrix2s::Identity()* pow(1, 2)); + fea0->setCapture(cap0); + cap0->addFeature(fea0); + fea0->link(cap0); + + // Landmark + LandmarkBasePtr lmk = proc_bundle_adj->createLandmark(fea0); + LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + problem_ptr->addLandmark(lmk_hp); + lmk->link(problem_ptr->getMap()); + + // Factor + auto fac0 = FactorBase::emplace<FactorPixelHP>(fea0, fea0, lmk_hp, proc); + auto fac_ptr = std::static_pointer_cast<FactorPixelHP>(fac0); + + ASSERT_TRUE(problem_ptr->check(0)); + + //ASSERT the expectation of the landmark should be equal to the measurement + Eigen::VectorXs expect = fac_ptr->expectation(); +// std::cout << expect << std::endl; + ASSERT_FLOAT_EQ(expect(0,0),fea0->getMeasurement()(0,0)); + ASSERT_FLOAT_EQ(expect(1,0),fea0->getMeasurement()(1,0)); +} + +TEST_F(FactorPixelHPTest, testSolveLandmark) +{ + ASSERT_TRUE(problem->check(0)); + + S->fix(); + F1->fix(); + F2->fix(); + F3->fix(); + L1->unfix(); + + auto orig = L1->getState(); + std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); + + std::cout << report << std::endl; + + std::cout << orig.transpose() << std::endl; + std::cout << L1->getState().transpose() << std::endl; + + ASSERT_MATRIX_APPROX(L1->getState(), orig, 1e-6); + +} + +TEST_F(FactorPixelHPTest, testSolveLandmarkAltered) +{ + ASSERT_TRUE(problem->check(0)); + + S->fix(); + F1->fix(); + F2->fix(); + F3->fix(); + L1->unfix(); + + auto orig = L1->getState(); + L1->getP()->setState(L1->getState() + Vector4s::Random()); + std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); + + std::cout << report << std::endl; + + std::cout << orig.transpose() << std::endl; + std::cout << L1->getState().transpose() << std::endl; + + ASSERT_MATRIX_APPROX(L1->getState(), orig, 1e-6); + +} + +TEST_F(FactorPixelHPTest, testSolveFramePosition) +{ + ASSERT_TRUE(problem->check(0)); + + S->fix(); + F2->fix(); + F3->fix(); + L1->fix(); + + auto orig = F1->getP()->getState(); + + //change state + Vector3s position; + position << 1,0.2,0; + auto ori = F1->getO()->getState(); + Vector7s state; + F1->setState(state); + + F1->getO()->fix(); + F1->getP()->unfix(); + + std::string brief_report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::BRIEF); + + std::cout << orig.transpose() << std::endl; + std::cout << F1->getP()->getState().transpose() << std::endl; + + ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); + +} + + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index c87bc3d91..027597f13 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -5,6 +5,8 @@ #include "vision/sensor/sensor_camera.h" #include "core/sensor/sensor_factory.h" #include "vision/processor/processor_bundle_adjustment.h" +#include "vision/factor/factor_pixelHP.h" +#include "vision/landmark/landmark_HP.h" #include "vision/capture/capture_image.h" #include "vision/internal/config.h" @@ -16,7 +18,6 @@ using namespace wolf; -//std::string wolf_root = "/home/ovendrell/dev/vision"; std::string wolf_root = _WOLF_VISION_ROOT_DIR; class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment @@ -219,7 +220,48 @@ TEST(ProcessorBundleAdjustment, establishFactors) TEST(ProcessorBundleAdjustment, createLandmark) { - std::cout << "EMPTY Test\n"; + //Build problem + ProblemPtr problem_ptr = Problem::create("PO", 3); + + // Install sensor + IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); + intr->width = 640; + intr->height = 480; + auto sens_cam = problem_ptr->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); + SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 5; + auto proc = problem_ptr->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); + ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); + + //Frame + FrameBasePtr frm0 = problem_ptr->emplaceFrame(KEY, problem_ptr->zeroState(), TimeStamp(0)); + + // Capture, feature and factor + auto cap0 = std::static_pointer_cast<CaptureImage>(CaptureImage::emplace<CaptureImage>(frm0, TimeStamp(0), camera, cv::Mat::zeros(480,640, 1))); + + cv::Point2f p = cv::Point2f(240, 320); + cv::KeyPoint kp = cv::KeyPoint(p, 32.0f); + cv::Mat des = cv::Mat::zeros(1,8, CV_8U); + + FeaturePointImagePtr fea0 = std::make_shared<FeaturePointImage>(kp, 0, des, Eigen::Matrix2s::Identity()* pow(1, 2)); + fea0->setCapture(cap0); + cap0->addFeature(fea0); + fea0->link(cap0); + + ASSERT_TRUE(problem_ptr->check(1)); + + LandmarkBasePtr lmk = proc_bundle_adj->createLandmark(fea0); + LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + problem_ptr->addLandmark(lmk_hp); + + ASSERT_EQ(problem_ptr->getMap()->getLandmarkList().size(), 1); } @@ -230,6 +272,7 @@ TEST(ProcessorBundleAdjustment, process) // Install camera IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); //TODO: important, must be initialized intr->width = 640; intr->height = 480; SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); @@ -274,6 +317,7 @@ TEST(ProcessorBundleAdjustment, process) CaptureImagePtr image_inc_ptr4 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); proc_dummy->process(image_inc_ptr4); ASSERT_EQ(image_inc_ptr4->getFeatureList().size(), params->max_new_features); + } TEST(ProcessorBundleAdjustment, processVideo) @@ -283,6 +327,7 @@ TEST(ProcessorBundleAdjustment, processVideo) // Install camera IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); intr->width = 640; intr->height = 480; SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); @@ -295,13 +340,13 @@ TEST(ProcessorBundleAdjustment, processVideo) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 400; - params->min_features_for_keyframe = 0; + params->min_features_for_keyframe = 50; auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); //==================================vision_utils ============================================ vision_utils::SensorCameraPtr sen_ptr = std::make_shared<vision_utils::SensorCamera>(); - sen_ptr->open("/home/ovendrell/eclipse-workspace/ddm_triad/data/video/VID4b.mp4"); + sen_ptr->open("/home/ovendrell/eclipse-workspace/ddm_triad/data/video/VID4b.mp4"); //TODO: this should be a demo //"/home/ovendrell/dev/vision_utils/src/test/data/test_usb_cam.mp4"); unsigned int buffer_size = 10; @@ -324,16 +369,29 @@ TEST(ProcessorBundleAdjustment, processVideo) for(int frame_count = 0; frame_count<150; ++frame_count) { t += dt; - std::cout << "Avis 0" << std::endl; // Image --------------------------------------------- frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), frame_count) ); - std::cout << "Avis 1" << std::endl; CaptureImagePtr image = std::make_shared<CaptureImage>(t, camera, frame_buff.back()->getImage()); - std::cout << "Avis 2" << std::endl; /* process */ camera->process(image); - std::cout << "FEATURES:" << image->getFeatureList().size() << std::endl; - std::cout << "MATCHES:" << image->matches_from_precedent_.size() << std::endl; +// std::cout << "FEATURES:" << image->getFeatureList().size() << std::endl; +// std::cout << "MATCHES:" << image->matches_from_precedent_.size() << std::endl; + + //Debug lines +// if (frame_count > 4 && frame_count < 10) +// { +// FactorBasePtrList fac_list; +// assert(image->getFeatureList().size()!=0); +// image->getFactorList(fac_list); +// assert(fac_list.size()!=0); +// typedef std::list<FactorBasePtr>::iterator iter; +// for (iter it =fac_list.begin(); it != fac_list.end(); ++it) +// { +// auto fac = std::static_pointer_cast<FactorPixelHP>(*it); +// Eigen::VectorXs exp = fac->expectation(); +// std::cout << exp << std::endl; +// } +// } } } -- GitLab From eaa25aff31100092ac46d11190deed45916b3825 Mon Sep 17 00:00:00 2001 From: Joaquim Casals <jcasals@iri.upc.edu> Date: Wed, 22 May 2019 12:58:25 +0200 Subject: [PATCH 10/58] CMake hotfix --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5589b3c89..ebc11caaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,7 +149,7 @@ include_directories("${PROJECT_BINARY_DIR}/conf") #INCLUDES SECTION # ============EXAMPLE================== INCLUDE_DIRECTORIES(${EIGEN_INCLUDE_DIRS}) -INCLUDE_DIRECTORIES(${wolf_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${wolf_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${vision_utils_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) include_directories(BEFORE "include") -- GitLab From e6e18301b1108f7a8077c8e5d175b1026c20e4b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 13:24:13 +0200 Subject: [PATCH 11/58] Link against YAML lib --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ebc11caaa..657b8444d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -279,6 +279,8 @@ ADD_LIBRARY(${PLUGIN_NAME} TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${CMAKE_THREAD_LIBS_INIT}) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${wolf_LIBRARY}) +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${YAMLCPP_LIBRARY}) + TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${OpenCV_LIBS}) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${vision_utils_LIBRARY}) -- GitLab From f5d346ed264b1129d57fd19ff5ffa1213c4f2975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 13:24:33 +0200 Subject: [PATCH 12/58] Use the correct quotes / brackets in includes --- include/vision/capture/capture_image.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/vision/capture/capture_image.h b/include/vision/capture/capture_image.h index 08a934052..8b3ff0b0d 100644 --- a/include/vision/capture/capture_image.h +++ b/include/vision/capture/capture_image.h @@ -2,13 +2,13 @@ #define CAPTURE_IMAGE_H //Wolf includes -#include "core/capture/capture_base.h" +#include <core/capture/capture_base.h> #include "vision/feature/feature_point_image.h" #include "vision/sensor/sensor_camera.h" // Vision Utils includes -#include "vision_utils/vision_utils.h" -#include "vision_utils/common_class/frame.h" +#include <vision_utils/vision_utils.h> +#include <vision_utils/common_class/frame.h> namespace wolf { -- GitLab From cb86e7f3b6ddb9cc212cd60076813ea67099fcd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 13:24:47 +0200 Subject: [PATCH 13/58] Add override keyword --- include/vision/processor/processor_bundle_adjustment.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index 11e9b371b..8c55cdb5b 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -79,7 +79,7 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature * - initializing counters, flags, or any derived variables * - initializing algorithms needed for processing the derived data */ - virtual void preProcess(); + virtual void preProcess() override; /** Post-process * @@ -91,7 +91,7 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature * - resetting and/or clearing variables and/or algorithms at the end of processing * - drawing / printing / logging the results of the processing */ - virtual void postProcess(); + virtual void postProcess() override; /** \brief Track provided features from \b last to \b incoming * \param _features_last_in input list of features in \b last to track -- GitLab From 084cd988b71e9406c5d7224603a2628b5b92ee26 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Wed, 22 May 2019 13:27:58 +0200 Subject: [PATCH 14/58] WIP --- include/vision/factor/factor_pixelHP.h | 11 +++-- src/processor/processor_bundle_adjustment.cpp | 4 +- test/gtest_factor_pixelHP.cpp | 46 ++++++++++++------- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/include/vision/factor/factor_pixelHP.h b/include/vision/factor/factor_pixelHP.h index 6e688febe..b2d90b40f 100644 --- a/include/vision/factor/factor_pixelHP.h +++ b/include/vision/factor/factor_pixelHP.h @@ -114,7 +114,7 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, using namespace Eigen; // All involved transforms typedef - typedef Eigen::Transform<T, 3, Eigen::Affine> TransformType; + typedef Eigen::Transform<T, 3, Eigen::Isometry> TransformType; // world to current robot transform Map<const Matrix<T, 3, 1> > p_w_r(_frame_p); @@ -136,8 +136,8 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, // hmg point in current camera frame C Eigen::Map<const Eigen::Matrix<T, 4, 1> > landmark_hmg(_lmk_hmg); - Eigen::Matrix<T, 4, 1> landmark_hmg_c = T_r_c .inverse(Eigen::Affine) - * T_w_r .inverse(Eigen::Affine) + Eigen::Matrix<T, 4, 1> landmark_hmg_c = T_r_c .inverse(Eigen::Isometry) + * T_w_r .inverse(Eigen::Isometry) * landmark_hmg; //std::cout << "p_w_r = \n\t" << _frame_p[0] << "\n\t" << _frame_p[1] << "\n\t" << _frame_p[2] << "\n"; @@ -149,13 +149,16 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, // lmk direction vector Eigen::Matrix<T, 3, 1> v_dir = landmark_hmg_c.head(3); + // lmk inverse distance + T rho = landmark_hmg_c(3); + // camera parameters Matrix<T, 4, 1> intrinsic = intrinsic_.cast<T>(); Eigen::Matrix<T, Eigen::Dynamic, 1> distortion = distortion_.cast<T>(); // project point and exit Eigen::Map<Eigen::Matrix<T, 2, 1> > expectation(_expectation); - expectation = pinhole::projectPoint(intrinsic, distortion, v_dir); + expectation = pinhole::projectPoint(intrinsic, distortion, v_dir/rho); std::cout << "expectation = \n\t" << expectation(0) << "\n\t" << expectation(1) << "\n"; diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 88adbc708..264959f90 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -263,10 +263,10 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur vec_homogeneous = {point3D(0),point3D(1),point3D(2),1/distance}; //TODO: lmk from camera to world coordinate frame. - Transform<Scalar,3,Affine> T_w_r + Transform<Scalar,3,Isometry> T_w_r = Translation<Scalar,3>(_feature_ptr->getFrame()->getP()->getState()) * Quaternions(_feature_ptr->getFrame()->getO()->getState().data()); - Transform<Scalar,3,Affine> T_r_c + Transform<Scalar,3,Isometry> T_r_c = Translation<Scalar,3>(_feature_ptr->getCapture()->getSensorP()->getState()) * Quaternions(_feature_ptr->getCapture()->getSensorO()->getState().data()); Eigen::Matrix<Scalar, 4, 1> vec_homogeneous_w = T_w_r diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index beb8be0ac..4202cbf61 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -31,7 +31,7 @@ class FactorPixelHPTest : public testing::Test{ Quaternions quat1, quat2, quat3, quat_cam; Vector4s vquat1, vquat2, vquat3, vquat_cam; // quaternions as vectors Vector7s pose1, pose2, pose3, pose_cam; - Vector4s lmkHP1; + Vector4s lmkHP1, lmkHP2, lmkHP3, lmkHP4; ProblemPtr problem; CeresManagerPtr ceres_manager; @@ -45,6 +45,9 @@ class FactorPixelHPTest : public testing::Test{ FeaturePointImagePtr f1, f2, f3; LandmarkHPPtr L1; + LandmarkHPPtr L2; + LandmarkHPPtr L3; + LandmarkHPPtr L4; FactorPixelHPPtr c1; FactorPixelHPPtr c2; @@ -114,9 +117,9 @@ class FactorPixelHPTest : public testing::Test{ */ // all frames look to the origin - pos1 << 2, 1, 1; - pos2 << 1, 2, 1; - pos3 << 1, 1, 2; + pos1 << 1, 0, 0; + pos2 << 0, 1, 0; + pos3 << 0, 0, 1; euler1 << 0, 0 , M_PI ; euler2 << 0, 0 , -M_PI_2 ; euler3 << 0, M_PI_2, M_PI ; @@ -129,11 +132,16 @@ class FactorPixelHPTest : public testing::Test{ pose1 << pos1, vquat1; pose2 << pos2, vquat2; pose3 << pos3, vquat3; - lmkHP1 << 1, 1, 1, 1/sqrt(3); + + //landmarks + lmkHP1 << 0, 0, 0, 1; + lmkHP2 << 0, 0, 0, 1; + lmkHP3 << 0, 0, 0, 1; + lmkHP4 << 0, 0, 0, 1; // camera at the robot origin looking forward pos_cam << 0, 0, 0; - euler_cam << 0,0,0;//-M_PI_2, 0, -M_PI_2; + euler_cam << -M_PI_2, 0, -M_PI_2; quat_cam = e2q(euler_cam); vquat_cam = quat_cam.coeffs(); pose_cam << pos_cam, vquat_cam; @@ -145,7 +153,7 @@ class FactorPixelHPTest : public testing::Test{ // Install sensor and processor IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); - intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); + intr->pinhole_model_raw = Eigen::Vector4s(320,240,320,320); intr->width = 640; intr->height = 480; S = problem->installSensor("CAMERA", "camera", pose_cam, intr); @@ -197,7 +205,7 @@ class FactorPixelHPTest : public testing::Test{ } }; -TEST(ProcessorFactorPixelHP, test) +TEST(ProcessorFactorPixelHP, testZeroResidual) { //Build problem ProblemPtr problem_ptr = Problem::create("PO", 3); @@ -266,15 +274,15 @@ TEST_F(FactorPixelHPTest, testSolveLandmark) F3->fix(); L1->unfix(); - auto orig = L1->getState(); + auto orig = L1->point(); std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); std::cout << report << std::endl; std::cout << orig.transpose() << std::endl; - std::cout << L1->getState().transpose() << std::endl; + std::cout << L1->point().transpose() << std::endl; - ASSERT_MATRIX_APPROX(L1->getState(), orig, 1e-6); + ASSERT_MATRIX_APPROX(L1->point(), orig, 1e-6); } @@ -288,16 +296,16 @@ TEST_F(FactorPixelHPTest, testSolveLandmarkAltered) F3->fix(); L1->unfix(); - auto orig = L1->getState(); + auto orig = L1->point(); L1->getP()->setState(L1->getState() + Vector4s::Random()); std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); std::cout << report << std::endl; std::cout << orig.transpose() << std::endl; - std::cout << L1->getState().transpose() << std::endl; + std::cout << L1->point().transpose() << std::endl; - ASSERT_MATRIX_APPROX(L1->getState(), orig, 1e-6); + ASSERT_MATRIX_APPROX(L1->point(), orig, 1e-6); } @@ -322,12 +330,18 @@ TEST_F(FactorPixelHPTest, testSolveFramePosition) F1->getO()->fix(); F1->getP()->unfix(); - std::string brief_report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::BRIEF); + std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); + + std::cout << report << std::endl; std::cout << orig.transpose() << std::endl; std::cout << F1->getP()->getState().transpose() << std::endl; - ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); + //ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); + + Eigen::VectorXs expect = c1->expectation(); + ASSERT_FLOAT_EQ(expect(0,0),f1->getMeasurement()(0,0)); + ASSERT_FLOAT_EQ(expect(1,0),f1->getMeasurement()(1,0)); } -- GitLab From 545105e4c96cb272d18e41c191f289bfc28155cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 14:42:00 +0200 Subject: [PATCH 15/58] Remove debug couts --- include/vision/factor/factor_pixelHP.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/vision/factor/factor_pixelHP.h b/include/vision/factor/factor_pixelHP.h index b2d90b40f..73279f4b7 100644 --- a/include/vision/factor/factor_pixelHP.h +++ b/include/vision/factor/factor_pixelHP.h @@ -144,7 +144,7 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, // std::cout << "q_w_r = \n\t" << _frame_o[0] << "\n\t" << _frame_o[1] << "\n\t" << _frame_o[2] << "\n\t" << _frame_o[3] << "\n"; // std::cout << "p_r_c = \n\t" << _sensor_p[0] << "\n\t" << _sensor_p[1] << "\n\t" << _sensor_p[2] << "\n"; // std::cout << "q_r_c = \n\t" << _sensor_o[0] << "\n\t" << _sensor_o[1] << "\n\t" << _sensor_o[2] << "\n\t" << _sensor_o[3] << "\n"; - std::cout << "landmark_hmg_c = \n\t" << landmark_hmg_c(0) << "\n\t" << landmark_hmg_c(1) << "\n\t" << landmark_hmg_c(2) << "\n\t" << landmark_hmg_c(3) << "\n"; +// std::cout << "landmark_hmg_c = \n\t" << landmark_hmg_c(0) << "\n\t" << landmark_hmg_c(1) << "\n\t" << landmark_hmg_c(2) << "\n\t" << landmark_hmg_c(3) << "\n"; // lmk direction vector Eigen::Matrix<T, 3, 1> v_dir = landmark_hmg_c.head(3); @@ -160,7 +160,7 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, Eigen::Map<Eigen::Matrix<T, 2, 1> > expectation(_expectation); expectation = pinhole::projectPoint(intrinsic, distortion, v_dir/rho); - std::cout << "expectation = \n\t" << expectation(0) << "\n\t" << expectation(1) << "\n"; +// std::cout << "expectation = \n\t" << expectation(0) << "\n\t" << expectation(1) << "\n"; } -- GitLab From 89699b85514341ae6f3208cfa8e31b5a118625cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 14:42:17 +0200 Subject: [PATCH 16/58] Fix test of frame to only 2DoF -> PASS. --- test/gtest_factor_pixelHP.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index 4202cbf61..24bafc6e6 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -322,9 +322,10 @@ TEST_F(FactorPixelHPTest, testSolveFramePosition) //change state Vector3s position; - position << 1,0.2,0; + position << 2.0, 2.0, 2.0; auto ori = F1->getO()->getState(); Vector7s state; + state << position, ori; F1->setState(state); F1->getO()->fix(); @@ -337,7 +338,11 @@ TEST_F(FactorPixelHPTest, testSolveFramePosition) std::cout << orig.transpose() << std::endl; std::cout << F1->getP()->getState().transpose() << std::endl; - //ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); + // This test is no good because it checks 3 DoF and only 2DoF are observable. + //ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); + // We use the following alternative: + // Frame must be in the X axis, so Y=0 and Z=0 + ASSERT_MATRIX_APPROX(F1->getP()->getState().tail(2), orig.tail(2), 1e-6); Eigen::VectorXs expect = c1->expectation(); ASSERT_FLOAT_EQ(expect(0,0),f1->getMeasurement()(0,0)); -- GitLab From cf1a39f7df36432ba41f11fed00a80de7c94d310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 19:50:51 +0200 Subject: [PATCH 17/58] Arrange includes --- src/landmark/landmark_HP.cpp | 2 +- test/gtest_factor_pixelHP.cpp | 11 +++++------ test/gtest_processor_bundle_adjustment.cpp | 21 +++++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/landmark/landmark_HP.cpp b/src/landmark/landmark_HP.cpp index dc3f3043c..a9bf53f4d 100644 --- a/src/landmark/landmark_HP.cpp +++ b/src/landmark/landmark_HP.cpp @@ -6,7 +6,7 @@ namespace wolf { -/* Landmark - Anchored Homogeneous Point*/ +/* Landmark - Homogeneous Point*/ LandmarkHP::LandmarkHP(Eigen::Vector4s _position_homogeneous, SensorBasePtr _sensor, cv::Mat _2D_descriptor) : diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index 24bafc6e6..b3a4b824c 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -4,19 +4,18 @@ * Created on: May 16, 2019 * Author: ovendrell */ -#include "core/factor/factor_block_absolute.h" -#include "core/factor/factor_quaternion_absolute.h" - #include "utils_gtest.h" #include "vision/factor/factor_pixelHP.h" #include "vision/landmark/landmark_HP.h" #include "vision/capture/capture_image.h" -#include "core/ceres_wrapper/ceres_manager.h" #include "vision/processor/processor_bundle_adjustment.h" #include "vision/internal/config.h" -#include "core/math/pinhole_tools.h" -#include "core/ceres_wrapper/ceres_manager.h" +#include <core/factor/factor_block_absolute.h> +#include <core/factor/factor_quaternion_absolute.h> +#include <core/ceres_wrapper/ceres_manager.h> +#include <core/math/pinhole_tools.h> +#include <core/ceres_wrapper/ceres_manager.h> using namespace wolf; using namespace Eigen; diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 027597f13..10b7da713 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -1,20 +1,21 @@ -#include "utils_gtest.h" -#include "vision_utils.h" - +// this plugin includes #include "vision/sensor/sensor_camera.h" -#include "core/sensor/sensor_factory.h" #include "vision/processor/processor_bundle_adjustment.h" #include "vision/factor/factor_pixelHP.h" #include "vision/landmark/landmark_HP.h" #include "vision/capture/capture_image.h" #include "vision/internal/config.h" +#include "utils_gtest.h" + +// wolf includes +#include <core/sensor/sensor_factory.h> // Vision utils includes -#include <vision_utils.h> -#include <sensors.h> -#include <common_class/buffer.h> -#include <common_class/frame.h> +#include <vision_utils/vision_utils.h> +#include <vision_utils/sensors.h> +#include <vision_utils/common_class/buffer.h> +#include <vision_utils/common_class/frame.h> using namespace wolf; @@ -113,7 +114,7 @@ TEST(ProcessorBundleAdjustment, installProcessor) std::cout << "sensor & processor created and added to wolf problem" << std::endl; ASSERT_EQ(proc->getProblem(), problem); - ASSERT_TRUE(problem->check()); + ASSERT_TRUE(problem->check(0)); } TEST(ProcessorBundleAdjustment, preProcess) @@ -255,7 +256,7 @@ TEST(ProcessorBundleAdjustment, createLandmark) cap0->addFeature(fea0); fea0->link(cap0); - ASSERT_TRUE(problem_ptr->check(1)); + ASSERT_TRUE(problem_ptr->check(0)); LandmarkBasePtr lmk = proc_bundle_adj->createLandmark(fea0); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); -- GitLab From da1b7c8575b90626d2813330c239029294425b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 19:54:10 +0200 Subject: [PATCH 18/58] Do not compile processor_tracker_feature_image --- CMakeLists.txt | 4 ++-- include/vision/processor/processor_tracker_feature_image.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 657b8444d..0c24864ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,7 +187,7 @@ SET(HDRS_PROCESSOR include/vision/processor/processor_tracker_feature_trifocal.h include/vision/processor/processor_params_image.h include/vision/processor/processor_tracker_landmark_image.h -include/vision/processor/processor_tracker_feature_image.h +#include/vision/processor/processor_tracker_feature_image.h include/vision/processor/processor_bundle_adjustment.h ) SET(HDRS_SENSOR @@ -220,7 +220,7 @@ src/landmark/landmark_point_3D.cpp ) SET(SRCS_PROCESSOR src/processor/processor_tracker_feature_trifocal.cpp -src/processor/processor_tracker_feature_image.cpp +#src/processor/processor_tracker_feature_image.cpp src/processor/processor_tracker_landmark_image.cpp src/processor/processor_bundle_adjustment.cpp ) diff --git a/include/vision/processor/processor_tracker_feature_image.h b/include/vision/processor/processor_tracker_feature_image.h index 04c68b619..f65deb9bc 100644 --- a/include/vision/processor/processor_tracker_feature_image.h +++ b/include/vision/processor/processor_tracker_feature_image.h @@ -8,7 +8,7 @@ #include "core/state_block/state_block.h" #include "core/state_block/state_quaternion.h" #include "core/processor/processor_tracker_feature.h" -#include "core/factor/factor_epipolar.h" +#include "core/factor/factor_feature_dummy.h" #include "vision/processor/processor_params_image.h" // vision_utils -- GitLab From 512e66b5a34e9093bf10eaa4ec84c5e6c23e0738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 22 May 2019 21:21:03 +0200 Subject: [PATCH 19/58] Rationalize cmakelists.txt a bit --- CMakeLists.txt | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c24864ba..00c9648d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,10 @@ FIND_PACKAGE(Threads REQUIRED) FIND_PACKAGE(wolf REQUIRED) FIND_PACKAGE(vision_utils REQUIRED) -MESSAGE("vision_utils Library FOUND: vision related sources will be built.") +IF (vision_utils_FOUND) + MESSAGE("vision_utils Library FOUND: vision related sources will be built.") +ENDIF(vision_utils_FOUND) + SET(PRINT_INFO_VU false) FIND_PACKAGE(OpenCV REQUIRED) @@ -276,26 +279,24 @@ ADD_LIBRARY(${PLUGIN_NAME} ${SRCS_WRAPPER} ${SRCS_YAML} ) -TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${CMAKE_THREAD_LIBS_INIT}) -TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${wolf_LIBRARY}) - -TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${YAMLCPP_LIBRARY}) - -TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${OpenCV_LIBS}) -TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${vision_utils_LIBRARY}) #Link the created libraries #===============EXAMPLE========================= # IF (Ceres_FOUND) # TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${CERES_LIBRARIES}) # ENDIF(Ceres_FOUND) +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${CMAKE_THREAD_LIBS_INIT}) +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${wolf_LIBRARY}) +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${YAMLCPP_LIBRARY}) +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${OpenCV_LIBS}) +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${vision_utils_LIBRARY}) +IF (GLOG_FOUND) + TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${GLOG_LIBRARY}) +ENDIF (GLOG_FOUND) #Build tests #===============EXAMPLE========================= -IF (GLOG_FOUND) - TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${GLOG_LIBRARY}) -ENDIF (GLOG_FOUND) IF (GLOG_FOUND) IF(BUILD_TESTS) MESSAGE("Building tests.") -- GitLab From 6ce4fb4b95327505af43b5ef35a34f42dbbe150d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Thu, 23 May 2019 00:25:36 +0200 Subject: [PATCH 20/58] Add dylib to lib extensions --- cmake_modules/wolfvisionConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_modules/wolfvisionConfig.cmake b/cmake_modules/wolfvisionConfig.cmake index ba2464a95..64eb5b3f0 100644 --- a/cmake_modules/wolfvisionConfig.cmake +++ b/cmake_modules/wolfvisionConfig.cmake @@ -11,7 +11,7 @@ ENDIF(wolfvision_INCLUDE_DIR) FIND_LIBRARY( wolfvision_LIBRARY - NAMES libwolfvision.so + NAMES libwolfvision.so libwolfvision.dylib PATHS /usr/local/lib/iri-algorithms) IF(wolfvision_LIBRARY) MESSAGE("Found vision lib: ${wolfvision_LIBRARY}") -- GitLab From 0c52145f6b6c804118e3451f4d303b12c7dd17bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Thu, 23 May 2019 00:26:16 +0200 Subject: [PATCH 21/58] Comment out suitesparse stuff --- CMakeLists.txt | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00c9648d2..b78024e7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,19 +118,19 @@ ELSEIF(YAMLCPP_FOUND) MESSAGE("yaml-cpp Library NOT FOUND!") ENDIF(YAMLCPP_FOUND) -FIND_PATH( - Suitesparse_INCLUDE_DIRS - NAMES SuiteSparse_config.h - PATHS /usr/include/suitesparse /usr/local/include/suitesparse) -MESSAGE("Found suitesparse_INCLUDE_DIRS:" ${Suitesparse_INCLUDE_DIRS}) - -IF(Suitesparse_INCLUDE_DIRS) - SET(Suitesparse_FOUND TRUE) - MESSAGE("Suitesparse FOUND: wolf_solver will be built.") -ELSE (Suitesparse_INCLUDE_DIRS) - SET(Suitesparse_FOUND FALSE) - MESSAGE(FATAL_ERROR "Suitesparse NOT FOUND") -ENDIF (Suitesparse_INCLUDE_DIRS) +#FIND_PATH( +# Suitesparse_INCLUDE_DIRS +# NAMES SuiteSparse_config.h +# PATHS /usr/include/suitesparse /usr/local/include/suitesparse) +#MESSAGE("Found suitesparse_INCLUDE_DIRS:" ${Suitesparse_INCLUDE_DIRS}) +# +#IF(Suitesparse_INCLUDE_DIRS) +# SET(Suitesparse_FOUND TRUE) +# MESSAGE("Suitesparse FOUND: wolf_solver will be built.") +#ELSE (Suitesparse_INCLUDE_DIRS) +# SET(Suitesparse_FOUND FALSE) +# MESSAGE(FATAL_ERROR "Suitesparse NOT FOUND") +#ENDIF (Suitesparse_INCLUDE_DIRS) # Define the directory where will be the configured config.h SET(WOLF_CONFIG_DIR ${PROJECT_BINARY_DIR}/conf/${PROJECT_NAME}/internal) @@ -336,8 +336,8 @@ INSTALL(FILES ${HDRS_LANDMARK} DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/landmark) INSTALL(FILES ${HDRS_WRAPPER} DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/ceres_wrapper) -INSTALL(FILES ${HDRS_SOLVER_SUITESPARSE} - DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/solver_suitesparse) +#INSTALL(FILES ${HDRS_SOLVER_SUITESPARSE} +# DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/solver_suitesparse) INSTALL(FILES ${HDRS_SOLVER} DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/solver) INSTALL(FILES ${HDRS_SERIALIZATION} -- GitLab From 83f75cf97fed0481666e6f139586078e9e7b99b6 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Thu, 23 May 2019 13:16:55 +0200 Subject: [PATCH 22/58] add test to gtest factor_pixelHP --- include/vision/factor/factor_pixelHP.h | 6 -- src/processor/processor_bundle_adjustment.cpp | 8 +- src/sensor/sensor_camera.cpp | 2 +- test/gtest_factor_pixelHP.cpp | 98 +++++++++++++++++-- test/gtest_processor_bundle_adjustment.cpp | 78 +-------------- 5 files changed, 98 insertions(+), 94 deletions(-) diff --git a/include/vision/factor/factor_pixelHP.h b/include/vision/factor/factor_pixelHP.h index 73279f4b7..c1515f9b1 100644 --- a/include/vision/factor/factor_pixelHP.h +++ b/include/vision/factor/factor_pixelHP.h @@ -128,12 +128,6 @@ inline void FactorPixelHP::expectation(const T* const _frame_p, Map<const Quaternion<T> > q_r_c(_sensor_o); TransformType T_r_c = t_r_c * q_r_c; -// CaptureBasePtr capture = this->getFeature()->getCapture(); -// Translation<T, 3> t_r_c (capture->getSensorP()->getState().cast<T>()); -// Quaternions q_r_c_s(Eigen::Vector4s(capture->getSensorO()->getState())); -// Quaternion<T> q_r_c = q_r_c_s.cast<T>(); -// TransformType T_R_C = t_r_c * q_r_c; - // hmg point in current camera frame C Eigen::Map<const Eigen::Matrix<T, 4, 1> > landmark_hmg(_lmk_hmg); Eigen::Matrix<T, 4, 1> landmark_hmg_c = T_r_c .inverse(Eigen::Isometry) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 264959f90..0c4b8a0c4 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -274,10 +274,10 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur * vec_homogeneous; - std::cout << "Point2D: " << point2D.transpose() << std::endl; - std::cout << "Point3D: " << point3D.transpose() << std::endl; - std::cout << "Hmg_c: " << vec_homogeneous.transpose() << std::endl; - std::cout << "Hmg_w: " << vec_homogeneous_w.transpose() << std::endl; +// std::cout << "Point2D: " << point2D.transpose() << std::endl; +// std::cout << "Point3D: " << point3D.transpose() << std::endl; +// std::cout << "Hmg_c: " << vec_homogeneous.transpose() << std::endl; +// std::cout << "Hmg_w: " << vec_homogeneous_w.transpose() << std::endl; //vec_homogeneous_w = vec_homogeneous; LandmarkHPPtr lmk_hp_ptr = std::make_shared<LandmarkHP>(vec_homogeneous_w, getSensor(), feat_point_image_ptr->getDescriptor()); diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp index 9d5b9fcc5..00bb895fa 100644 --- a/src/sensor/sensor_camera.cpp +++ b/src/sensor/sensor_camera.cpp @@ -12,7 +12,7 @@ SensorCamera::SensorCamera(const Eigen::VectorXs& _extrinsics, const IntrinsicsC img_width_(_intrinsics.width), // img_height_(_intrinsics.height), // distortion_(_intrinsics.distortion), // - correction_(distortion_.size()==0 ? 0 : distortion_.size() + 1), // make correction vector slightly larger in size than the distortion vector + correction_(distortion_.size()==0 ? 0 : distortion_.size()), // make correction vector slightly larger in size than the distortion vector pinhole_model_raw_(_intrinsics.pinhole_model_raw), // pinhole_model_rectified_(_intrinsics.pinhole_model_rectified), // using_raw_(true) diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index b3a4b824c..b3f517911 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -42,13 +42,14 @@ class FactorPixelHPTest : public testing::Test{ FrameBasePtr F1, F2, F3; CaptureImagePtr I1, I2, I3; FeaturePointImagePtr f1, f2, f3; + FeaturePointImagePtr f12, f13, f14; - LandmarkHPPtr L1; + LandmarkHPPtr L1; //only one landmark L1 is initialized LandmarkHPPtr L2; LandmarkHPPtr L3; LandmarkHPPtr L4; - FactorPixelHPPtr c1; + FactorPixelHPPtr c1, c12, c13, c14; FactorPixelHPPtr c2; FactorPixelHPPtr c3; @@ -134,9 +135,6 @@ class FactorPixelHPTest : public testing::Test{ //landmarks lmkHP1 << 0, 0, 0, 1; - lmkHP2 << 0, 0, 0, 1; - lmkHP3 << 0, 0, 0, 1; - lmkHP4 << 0, 0, 0, 1; // camera at the robot origin looking forward pos_cam << 0, 0, 0; @@ -308,7 +306,7 @@ TEST_F(FactorPixelHPTest, testSolveLandmarkAltered) } -TEST_F(FactorPixelHPTest, testSolveFramePosition) +TEST_F(FactorPixelHPTest, testSolveFramePosition2ObservableDoF) { ASSERT_TRUE(problem->check(0)); @@ -349,6 +347,94 @@ TEST_F(FactorPixelHPTest, testSolveFramePosition) } +TEST_F(FactorPixelHPTest, testSolveFramePosition) +{ + //landmark homogeneous coordinates in world reference + lmkHP2 << 0.5, 0.5, 0.5, 1; + lmkHP3 << -0.5, 0.75, 0.5, 1; + lmkHP4 << 0.5, 0, -0.5, 1; + + //landmarks to camera coordinates + Transform<Scalar,3,Isometry> T_w_r + = Translation<Scalar,3>(F1->getP()->getState()) + * Quaternions(F1->getO()->getState().data()); + Transform<Scalar,3,Isometry> T_r_c + = Translation<Scalar,3>(I1->getSensorP()->getState()) + * Quaternions(I1->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 4, 1> lmkHP2_c = T_r_c.inverse() * T_w_r.inverse() * lmkHP2; + Eigen::Matrix<Scalar, 4, 1> lmkHP3_c = T_r_c.inverse() * T_w_r.inverse() * lmkHP3; + Eigen::Matrix<Scalar, 4, 1> lmkHP4_c = T_r_c.inverse() * T_w_r.inverse() * lmkHP4; + + //landmark point in camera coord + Vector3s lmk_point_2_c = lmkHP2_c.head<3>()/lmkHP2_c(3); + Vector3s lmk_point_3_c = lmkHP3_c.head<3>()/lmkHP3_c(3); + Vector3s lmk_point_4_c = lmkHP4_c.head<3>()/lmkHP4_c(3); + + //points projected to image plane + Vector2s point2 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_2_c); + Vector2s point3 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_3_c); + Vector2s point4 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_4_c); + cv::KeyPoint kp2 = cv::KeyPoint(cv::Point2f(point2(0),point2(1)), 32.0f); + cv::KeyPoint kp3 = cv::KeyPoint(cv::Point2f(point3(0),point3(1)), 32.0f); + cv::KeyPoint kp4 = cv::KeyPoint(cv::Point2f(point4(0),point4(1)), 32.0f); + cv::Mat des = cv::Mat::zeros(1,8, CV_8UC1); + pixel_noise_std = 1.0; //params->pixel_noise_std; + Vector2s pix(0,0); + Matrix2s pix_cov(Matrix2s::Identity() * pow(pixel_noise_std, 2)); + + //create features + f12 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp2, 0, des, pix_cov)); + f13 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp3, 0, des, pix_cov)); + f14 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp4, 0, des, pix_cov)); + + //create landmarks + L2 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP2, camera, des)); + L3 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP3, camera, des)); + L4 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP4, camera, des)); + + //create factors + c12 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f12, f12, L2, nullptr /*proc*/)); + c13 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f13, f13, L3, nullptr /*proc*/)); + c14 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f14, f14, L4, nullptr /*proc*/)); + + ASSERT_TRUE(problem->check()); + + S->fix(); + F2->fix(); + F3->fix(); + L1->fix(); + L2->fix(); + L3->fix(); + L4->fix(); + + auto orig = F1->getP()->getState(); + + //change state + Vector3s position; + position << Vector3s::Random()*100;//2.0, 2.0, 2.0; + auto ori = F1->getO()->getState(); + Vector7s state; + state << position, ori; + F1->setState(state); + + F1->getO()->fix(); + F1->getP()->unfix(); + + std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); + + std::cout << report << std::endl; + + std::cout << orig.transpose() << std::endl; + std::cout << F1->getP()->getState().transpose() << std::endl; + + // This test checks 3 DoF (3DoF are observable). + ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); + + Eigen::VectorXs expect = c1->expectation(); + ASSERT_FLOAT_EQ(expect(0,0),f1->getMeasurement()(0,0)); + ASSERT_FLOAT_EQ(expect(1,0),f1->getMeasurement()(1,0)); +} + int main(int argc, char **argv) { diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 10b7da713..02e296bda 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -273,7 +273,7 @@ TEST(ProcessorBundleAdjustment, process) // Install camera IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML - intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); //TODO: important, must be initialized + intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); //TODO: initialize intr->width = 640; intr->height = 480; SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); @@ -321,82 +321,6 @@ TEST(ProcessorBundleAdjustment, process) } -TEST(ProcessorBundleAdjustment, processVideo) -{ - // Wolf problem - ProblemPtr problem = Problem::create("PO", 3); - - // Install camera - IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML - intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); - intr->width = 640; - intr->height = 480; - SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); - - // Install processor - ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); - params->delete_ambiguities = false; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; - params->pixel_noise_std = 1.0; - params->min_track_length_for_factor = 3; - params->voting_active = true; - params->max_new_features = 400; - params->min_features_for_keyframe = 50; - auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); - auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); - - //==================================vision_utils ============================================ - vision_utils::SensorCameraPtr sen_ptr = std::make_shared<vision_utils::SensorCamera>(); - sen_ptr->open("/home/ovendrell/eclipse-workspace/ddm_triad/data/video/VID4b.mp4"); //TODO: this should be a demo - //"/home/ovendrell/dev/vision_utils/src/test/data/test_usb_cam.mp4"); - - unsigned int buffer_size = 10; - vision_utils::Buffer<vision_utils::FramePtr> frame_buff(buffer_size); - frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), 0) ); - - unsigned int img_width = frame_buff.back()->getImage().cols; - unsigned int img_height = frame_buff.back()->getImage().rows; - std::cout << "Image size: " << img_width << "x" << img_height << std::endl; - //==================================vision_utils ============================================ - - SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); - camera->setImgWidth(img_width); - camera->setImgHeight(img_height); - ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); - - TimeStamp t = 0; - // main loop - Scalar dt = 0.04; - for(int frame_count = 0; frame_count<150; ++frame_count) - { - t += dt; - // Image --------------------------------------------- - frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), frame_count) ); - CaptureImagePtr image = std::make_shared<CaptureImage>(t, camera, frame_buff.back()->getImage()); - /* process */ - camera->process(image); -// std::cout << "FEATURES:" << image->getFeatureList().size() << std::endl; -// std::cout << "MATCHES:" << image->matches_from_precedent_.size() << std::endl; - - //Debug lines -// if (frame_count > 4 && frame_count < 10) -// { -// FactorBasePtrList fac_list; -// assert(image->getFeatureList().size()!=0); -// image->getFactorList(fac_list); -// assert(fac_list.size()!=0); -// typedef std::list<FactorBasePtr>::iterator iter; -// for (iter it =fac_list.begin(); it != fac_list.end(); ++it) -// { -// auto fac = std::static_pointer_cast<FactorPixelHP>(*it); -// Eigen::VectorXs exp = fac->expectation(); -// std::cout << exp << std::endl; -// } -// } - - } -} - TEST(ProcessorBundleAdjustment, processKnown) { -- GitLab From 2d153257121e51f0fb71211145e98cf1e0bd4a86 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Thu, 23 May 2019 13:30:50 +0200 Subject: [PATCH 23/58] yaml bundle adjustment update --- ...cessor_bundle_adjustment_vision_utils.yaml | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/demos/processor_bundle_adjustment_vision_utils.yaml b/demos/processor_bundle_adjustment_vision_utils.yaml index 7621cd8ad..305f609b2 100644 --- a/demos/processor_bundle_adjustment_vision_utils.yaml +++ b/demos/processor_bundle_adjustment_vision_utils.yaml @@ -2,30 +2,32 @@ sensor: type: "USB_CAM" detector: - type: "GFTT" - maxCorners: 1000 - qualityLevel: 0.01 - minDistance: 1.0 - blockSize: 3 - k: 0.04 + type: "ORB" + nfeatures: 400 + scale factor: 1.0 + nlevels: 1 + edge threshold: 31 # 16 + first level: 0 + WTA_K: 2 # See: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#a180ae17d3300cf2c619aa240d9b607e5 + score type: 1 #enum { kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1 }; + patch size: 31 # 31 descriptor: type: "ORB" - nfeatures: 1000 - scale factor: 1.2 + nfeatures: 400 + scale factor: 1.0 nlevels: 1 - edge threshold: 8 # 16 + edge threshold: 31 # 16 first level: 0 WTA_K: 2 # See: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#a180ae17d3300cf2c619aa240d9b607e5 score type: 1 #enum { kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1 }; - patch size: 15 # 31 - + patch size: 31 # 31 + matcher: - type: "BRUTEFORCE_HAMMING" # BRUTEFORCE, BRUTEFORCE_HAMMING, BRUTEFORCE_HAMMING_2, BRUTEFORCE_L1, FLANNBASED - match type: 2 # Match type. MATCH = 1, KNNMATCH = 2, RADIUSMATCH = 3 - min normalized score: 0.9 + type: "FLANNBASED" # BRUTEFORCE, BRUTEFORCE_HAMMING, BRUTEFORCE_HAMMING_2, BRUTEFORCE_L1, FLANNBASED + match type: 1 # Match type. MATCH = 1, KNNMATCH = 2, RADIUSMATCH = 3 filtering: - ransac epipolar distance: 1 # Distance to epipolar [pixels] - ransac confidence prob: 0.98 # Confidence probability - max match euclidean dist: 50 # Max euclidean distance to consider a match as inlier + ransac epipolar distance: 3 # Distance to epipolar [pixels] + ransac confidence prob: 0.97 # Confidence probability + max match euclidean dist: 20 # Max euclidean distance to consider a match as inlier \ No newline at end of file -- GitLab From f5d469b13b9f14200f9c2700f52b06e991557e4f Mon Sep 17 00:00:00 2001 From: Joaquim Casals <jcasals@iri.upc.edu> Date: Thu, 23 May 2019 14:32:31 +0200 Subject: [PATCH 24/58] Fixes after merging from devel --- CMakeLists.txt | 19 ++++++++++--------- .../processor_tracker_feature_image.cpp | 4 ++-- test/gtest_factor_pixelHP.cpp | 2 +- test/gtest_processor_bundle_adjustment.cpp | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5589b3c89..d00762c84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,18 +103,18 @@ MESSAGE("vision_utils Library FOUND: vision related sources will be built.") SET(PRINT_INFO_VU false) FIND_PACKAGE(OpenCV REQUIRED) -FIND_PACKAGE(Ceres QUIET) #Ceres is not required -IF(Ceres_FOUND) - MESSAGE("Ceres Library FOUND: Ceres related sources will be built.") -ENDIF(Ceres_FOUND) - -INCLUDE (${PROJECT_SOURCE_DIR}/cmake_modules/FindYamlCpp.cmake) +FIND_PACKAGE(YamlCpp REQUIRED) IF(YAMLCPP_FOUND) MESSAGE("yaml-cpp Library FOUND: yaml-cpp related sources will be built.") ELSEIF(YAMLCPP_FOUND) MESSAGE("yaml-cpp Library NOT FOUND!") ENDIF(YAMLCPP_FOUND) +FIND_PACKAGE(Ceres QUIET) #Ceres is not required +IF(Ceres_FOUND) + MESSAGE("Ceres Library FOUND: Ceres related sources will be built.") +ENDIF(Ceres_FOUND) + FIND_PATH( Suitesparse_INCLUDE_DIRS NAMES SuiteSparse_config.h @@ -149,10 +149,11 @@ include_directories("${PROJECT_BINARY_DIR}/conf") #INCLUDES SECTION # ============EXAMPLE================== INCLUDE_DIRECTORIES(${EIGEN_INCLUDE_DIRS}) -INCLUDE_DIRECTORIES(${wolf_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${wolf_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${vision_utils_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) -include_directories(BEFORE "include") +INCLUDE_DIRECTORIES(BEFORE "include") +INCLUDE_DIRECTORIES(${YAMLCPP_INCLUDE_DIR}) IF(Ceres_FOUND) INCLUDE_DIRECTORIES(${CERES_INCLUDE_DIRS}) ENDIF(Ceres_FOUND) @@ -278,7 +279,7 @@ ADD_LIBRARY(${PLUGIN_NAME} ) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${CMAKE_THREAD_LIBS_INIT}) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${wolf_LIBRARY}) - +TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${YAMLCPP_LIBRARY}) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${OpenCV_LIBS}) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${vision_utils_LIBRARY}) diff --git a/src/processor/processor_tracker_feature_image.cpp b/src/processor/processor_tracker_feature_image.cpp index ecc8a249b..ab7c59b19 100644 --- a/src/processor/processor_tracker_feature_image.cpp +++ b/src/processor/processor_tracker_feature_image.cpp @@ -250,11 +250,11 @@ Scalar ProcessorTrackerFeatureImage::match(cv::Mat _target_descriptor, cv::Mat _ FactorBasePtr ProcessorTrackerFeatureImage::createFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) { - FactorEpipolarPtr const_epipolar_ptr = std::make_shared<FactorEpipolar>(_feature_ptr, _feature_other_ptr, + FactorFeatureDummyPtr const_dummy_ptr = std::make_shared<FactorFeatureDummy>(_feature_ptr, _feature_other_ptr, shared_from_this()); // _feature_ptr->addFactor(const_epipolar_ptr); // _feature_other_ptr->addConstrainedBy(const_epipolar_ptr); - return const_epipolar_ptr; + return const_dummy_ptr; } unsigned int ProcessorTrackerFeatureImage::detect(cv::Mat _image, cv::Rect& _roi, std::vector<cv::KeyPoint>& _new_keypoints, diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index b3f517911..b05ba9f7c 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -4,12 +4,12 @@ * Created on: May 16, 2019 * Author: ovendrell */ -#include "utils_gtest.h" #include "vision/factor/factor_pixelHP.h" #include "vision/landmark/landmark_HP.h" #include "vision/capture/capture_image.h" #include "vision/processor/processor_bundle_adjustment.h" #include "vision/internal/config.h" +#include <core/utils/utils_gtest.h> #include <core/factor/factor_block_absolute.h> #include <core/factor/factor_quaternion_absolute.h> diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 02e296bda..77a7bcfcc 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -6,7 +6,7 @@ #include "vision/landmark/landmark_HP.h" #include "vision/capture/capture_image.h" #include "vision/internal/config.h" -#include "utils_gtest.h" +#include <core/utils/utils_gtest.h> // wolf includes #include <core/sensor/sensor_factory.h> -- GitLab From 63aa5e78c4211135d644220bf99d8ef532973dc7 Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Thu, 23 May 2019 17:27:24 +0200 Subject: [PATCH 25/58] Fix pinhole_tools.h include and organize includes --- include/vision/factor/factor_AHP.h | 6 +++--- include/vision/factor/factor_pixelHP.h | 6 +++--- .../processor_tracker_landmark_image.cpp | 15 ++++++++------- src/sensor/sensor_camera.cpp | 3 ++- test/gtest_factor_pixelHP.cpp | 4 ++-- test/gtest_pinhole.cpp | 3 ++- test/gtest_processor_bundle_adjustment.cpp | 3 ++- test/gtest_processor_tracker_feature_trifocal.cpp | 14 +++++++------- 8 files changed, 29 insertions(+), 25 deletions(-) diff --git a/include/vision/factor/factor_AHP.h b/include/vision/factor/factor_AHP.h index c0f080367..3ef1b6c8b 100644 --- a/include/vision/factor/factor_AHP.h +++ b/include/vision/factor/factor_AHP.h @@ -2,11 +2,11 @@ #define FACTOR_AHP_H //Wolf includes -#include "core/factor/factor_autodiff.h" #include "vision/landmark/landmark_AHP.h" #include "vision/sensor/sensor_camera.h" -//#include "core/feature/feature_point_image.h" -#include "core/math/pinhole_tools.h" +#include "vision/math/pinhole_tools.h" + +#include "core/factor/factor_autodiff.h" #include <iomanip> //setprecision diff --git a/include/vision/factor/factor_pixelHP.h b/include/vision/factor/factor_pixelHP.h index c1515f9b1..6ade3a3b1 100644 --- a/include/vision/factor/factor_pixelHP.h +++ b/include/vision/factor/factor_pixelHP.h @@ -2,11 +2,11 @@ #define FACTOR_AHP_H //Wolf includes -#include "core/factor/factor_autodiff.h" #include "vision/landmark/landmark_HP.h" #include "vision/sensor/sensor_camera.h" -//#include "core/feature/feature_point_image.h" -#include "core/math/pinhole_tools.h" +#include "vision/math/pinhole_tools.h" + +#include "core/factor/factor_autodiff.h" #include <iomanip> //setprecision diff --git a/src/processor/processor_tracker_landmark_image.cpp b/src/processor/processor_tracker_landmark_image.cpp index 0636048dd..b9ae15084 100644 --- a/src/processor/processor_tracker_landmark_image.cpp +++ b/src/processor/processor_tracker_landmark_image.cpp @@ -2,22 +2,23 @@ #include "vision/capture/capture_image.h" #include "vision/factor/factor_AHP.h" -#include "core/feature/feature_base.h" #include "vision/feature/feature_point_image.h" +#include "vision/math/pinhole_tools.h" +#include "vision/sensor/sensor_camera.h" + +#include "core/feature/feature_base.h" #include "core/frame/frame_base.h" #include "core/utils/logging.h" #include "core/map/map_base.h" -#include "core/math/pinhole_tools.h" #include "core/problem/problem.h" -#include "vision/sensor/sensor_camera.h" #include "core/state_block/state_block.h" #include "core/common/time_stamp.h" // vision_utils -#include <detectors.h> -#include <descriptors.h> -#include <matchers.h> -#include <algorithms.h> +#include <vision_utils/detectors.h> +#include <vision_utils/descriptors.h> +#include <vision_utils/matchers.h> +#include <vision_utils/algorithms.h> #include <Eigen/Geometry> #include <iomanip> //setprecision diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp index 00bb895fa..39386d4d2 100644 --- a/src/sensor/sensor_camera.cpp +++ b/src/sensor/sensor_camera.cpp @@ -1,6 +1,7 @@ + #include "vision/sensor/sensor_camera.h" +#include "vision/math/pinhole_tools.h" -#include "core/math/pinhole_tools.h" #include "core/state_block/state_block.h" #include "core/state_block/state_quaternion.h" diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index b05ba9f7c..59647ad9f 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -9,12 +9,12 @@ #include "vision/capture/capture_image.h" #include "vision/processor/processor_bundle_adjustment.h" #include "vision/internal/config.h" -#include <core/utils/utils_gtest.h> +#include "vision/math/pinhole_tools.h" +#include <core/utils/utils_gtest.h> #include <core/factor/factor_block_absolute.h> #include <core/factor/factor_quaternion_absolute.h> #include <core/ceres_wrapper/ceres_manager.h> -#include <core/math/pinhole_tools.h> #include <core/ceres_wrapper/ceres_manager.h> using namespace wolf; diff --git a/test/gtest_pinhole.cpp b/test/gtest_pinhole.cpp index bcc76f5fa..9e71295ac 100644 --- a/test/gtest_pinhole.cpp +++ b/test/gtest_pinhole.cpp @@ -5,7 +5,8 @@ * Author: jsola */ -#include "core/math/pinhole_tools.h" +#include "vision/math/pinhole_tools.h" + #include <core/utils/utils_gtest.h> using namespace Eigen; diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 77a7bcfcc..c14d73d41 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -6,9 +6,10 @@ #include "vision/landmark/landmark_HP.h" #include "vision/capture/capture_image.h" #include "vision/internal/config.h" -#include <core/utils/utils_gtest.h> + // wolf includes +#include <core/utils/utils_gtest.h> #include <core/sensor/sensor_factory.h> // Vision utils includes diff --git a/test/gtest_processor_tracker_feature_trifocal.cpp b/test/gtest_processor_tracker_feature_trifocal.cpp index babf3e544..3cc902a0c 100644 --- a/test/gtest_processor_tracker_feature_trifocal.cpp +++ b/test/gtest_processor_tracker_feature_trifocal.cpp @@ -1,16 +1,16 @@ -#include <core/utils/utils_gtest.h> - -#include "core/common/wolf.h" -#include "core/utils/logging.h" - -#include "vision_utils.h" #include "vision/processor/processor_tracker_feature_trifocal.h" -#include "core/processor/processor_odom_3D.h" #include "vision/capture/capture_image.h" #include "vision/sensor/sensor_camera.h" #include "vision/internal/config.h" +#include <core/utils/utils_gtest.h> +#include "core/common/wolf.h" +#include "core/utils/logging.h" +#include "core/processor/processor_odom_3D.h" + +#include "vision_utils/vision_utils.h" + using namespace Eigen; using namespace wolf; -- GitLab From 160d8113e98a7f71c5b12591cd303eb029a7bf2c Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Thu, 23 May 2019 17:56:08 +0200 Subject: [PATCH 26/58] Use prefix 'vision_utils' in includes --- include/vision/factor/factor_autodiff_trifocal.h | 4 ++-- include/vision/feature/feature_point_image.h | 2 +- .../vision/processor/processor_tracker_feature_image.h | 8 ++++---- .../processor/processor_tracker_feature_trifocal.h | 10 +++++----- .../processor/processor_tracker_landmark_image.h | 8 ++++---- src/processor/processor_tracker_feature_image.cpp | 8 ++++---- src/processor/processor_tracker_feature_trifocal.cpp | 10 +++++----- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/include/vision/factor/factor_autodiff_trifocal.h b/include/vision/factor/factor_autodiff_trifocal.h index 71002f224..4ad34ce40 100644 --- a/include/vision/factor/factor_autodiff_trifocal.h +++ b/include/vision/factor/factor_autodiff_trifocal.h @@ -6,8 +6,8 @@ #include "core/factor/factor_autodiff.h" #include "vision/sensor/sensor_camera.h" -#include <common_class/trifocaltensor.h> -#include <vision_utils.h> +#include <vision_utils/common_class/trifocaltensor.h> +#include <vision_utils/vision_utils.h> namespace wolf { diff --git a/include/vision/feature/feature_point_image.h b/include/vision/feature/feature_point_image.h index b4d7d0891..b95839d7f 100644 --- a/include/vision/feature/feature_point_image.h +++ b/include/vision/feature/feature_point_image.h @@ -5,7 +5,7 @@ #include "core/feature/feature_base.h" // Vision Utils includes -#include <vision_utils.h> +#include <vision_utils/vision_utils.h> namespace wolf { diff --git a/include/vision/processor/processor_tracker_feature_image.h b/include/vision/processor/processor_tracker_feature_image.h index f65deb9bc..1ee0f78ae 100644 --- a/include/vision/processor/processor_tracker_feature_image.h +++ b/include/vision/processor/processor_tracker_feature_image.h @@ -12,10 +12,10 @@ #include "vision/processor/processor_params_image.h" // vision_utils -#include <detectors/detector_base.h> -#include <descriptors/descriptor_base.h> -#include <matchers/matcher_base.h> -#include <algorithms/activesearch/alg_activesearch.h> +#include <vision_utils/detectors/detector_base.h> +#include <vision_utils/descriptors/descriptor_base.h> +#include <vision_utils/matchers/matcher_base.h> +#include <vision_utils/algorithms/activesearch/alg_activesearch.h> // General includes #include <cmath> diff --git a/include/vision/processor/processor_tracker_feature_trifocal.h b/include/vision/processor/processor_tracker_feature_trifocal.h index 51e109cba..23b25085d 100644 --- a/include/vision/processor/processor_tracker_feature_trifocal.h +++ b/include/vision/processor/processor_tracker_feature_trifocal.h @@ -7,11 +7,11 @@ #include "core/utils/params_server.hpp" // Vision utils -#include <vision_utils.h> -#include <detectors/detector_base.h> -#include <descriptors/descriptor_base.h> -#include <matchers/matcher_base.h> -#include <algorithms/activesearch/alg_activesearch.h> +#include <vision_utils/vision_utils.h> +#include <vision_utils/detectors/detector_base.h> +#include <vision_utils/descriptors/descriptor_base.h> +#include <vision_utils/matchers/matcher_base.h> +#include <vision_utils/algorithms/activesearch/alg_activesearch.h> namespace wolf { diff --git a/include/vision/processor/processor_tracker_landmark_image.h b/include/vision/processor/processor_tracker_landmark_image.h index 2298c9ea9..70273dd20 100644 --- a/include/vision/processor/processor_tracker_landmark_image.h +++ b/include/vision/processor/processor_tracker_landmark_image.h @@ -9,10 +9,10 @@ #include "core/processor/processor_tracker_landmark.h" #include "core/common/wolf.h" -#include <algorithms/activesearch/alg_activesearch.h> -#include <descriptors/descriptor_base.h> -#include <detectors/detector_base.h> -#include <matchers/matcher_base.h> +#include <vision_utils/algorithms/activesearch/alg_activesearch.h> +#include <vision_utils/descriptors/descriptor_base.h> +#include <vision_utils/detectors/detector_base.h> +#include <vision_utils/matchers/matcher_base.h> #include <opencv2/core/mat.hpp> #include <opencv2/core/mat.inl.hpp> diff --git a/src/processor/processor_tracker_feature_image.cpp b/src/processor/processor_tracker_feature_image.cpp index ab7c59b19..88aede08b 100644 --- a/src/processor/processor_tracker_feature_image.cpp +++ b/src/processor/processor_tracker_feature_image.cpp @@ -2,10 +2,10 @@ #include "vision/processor/processor_tracker_feature_image.h" // Vision utils -#include <detectors.h> -#include <descriptors.h> -#include <matchers.h> -#include <algorithms.h> +#include <vision_utils/detectors.h> +#include <vision_utils/descriptors.h> +#include <vision_utils/matchers.h> +#include <vision_utils/algorithms.h> // standard libs #include <bitset> diff --git a/src/processor/processor_tracker_feature_trifocal.cpp b/src/processor/processor_tracker_feature_trifocal.cpp index be96cc33f..ed99f8bb7 100644 --- a/src/processor/processor_tracker_feature_trifocal.cpp +++ b/src/processor/processor_tracker_feature_trifocal.cpp @@ -8,11 +8,11 @@ #include "vision/capture/capture_image.h" // vision_utils -#include <vision_utils.h> -#include <detectors.h> -#include <descriptors.h> -#include <matchers.h> -#include <algorithms.h> +#include <vision_utils/vision_utils.h> +#include <vision_utils/detectors.h> +#include <vision_utils/descriptors.h> +#include <vision_utils/matchers.h> +#include <vision_utils/algorithms.h> #include <memory> -- GitLab From 340966635c96a9908e21a920f3092da502edc637 Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Thu, 23 May 2019 17:57:03 +0200 Subject: [PATCH 27/58] Organize includes --- src/yaml/processor_image_yaml.cpp | 4 ++-- src/yaml/processor_tracker_feature_trifocal_yaml.cpp | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/yaml/processor_image_yaml.cpp b/src/yaml/processor_image_yaml.cpp index 2ab14bfa4..f8cdeeac0 100644 --- a/src/yaml/processor_image_yaml.cpp +++ b/src/yaml/processor_image_yaml.cpp @@ -5,6 +5,8 @@ * \author: jsola */ +#include "vision/processor/processor_params_image.h" + // wolf yaml #include "core/yaml/yaml_conversion.h" @@ -14,8 +16,6 @@ // yaml-cpp library #include <yaml-cpp/yaml.h> -#include "vision/processor/processor_params_image.h" - namespace wolf { namespace diff --git a/src/yaml/processor_tracker_feature_trifocal_yaml.cpp b/src/yaml/processor_tracker_feature_trifocal_yaml.cpp index 78bb7ee98..a6619c704 100644 --- a/src/yaml/processor_tracker_feature_trifocal_yaml.cpp +++ b/src/yaml/processor_tracker_feature_trifocal_yaml.cpp @@ -5,11 +5,10 @@ * Author: asantamaria */ -// wolf yaml +// wolf #include "vision/processor/processor_tracker_feature_trifocal.h" -#include "core/yaml/yaml_conversion.h" -// wolf +#include "core/yaml/yaml_conversion.h" #include "core/common/factory.h" // yaml-cpp library -- GitLab From 114f5ca7767e0fb9aed6a913ef2ad6b0519b6e82 Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Thu, 23 May 2019 17:57:26 +0200 Subject: [PATCH 28/58] Remove file that is already in plugin 'apriltag' --- ...ocessor_tracker_landmark_apriltag_yaml.cpp | 92 ------------------- 1 file changed, 92 deletions(-) delete mode 100644 src/yaml/processor_tracker_landmark_apriltag_yaml.cpp diff --git a/src/yaml/processor_tracker_landmark_apriltag_yaml.cpp b/src/yaml/processor_tracker_landmark_apriltag_yaml.cpp deleted file mode 100644 index 70a44fc67..000000000 --- a/src/yaml/processor_tracker_landmark_apriltag_yaml.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/** - * \file processor_tracker_landmark_apriltag_yaml.cpp - * - * Created on: Dec 6, 2018 - * \author: jsola - */ - - -// wolf -#include "base/processor/processor_tracker_landmark_apriltag.h" -#include "base/yaml/yaml_conversion.h" -#include "base/common/factory.h" - -// yaml-cpp library -#include <yaml-cpp/yaml.h> - -namespace wolf -{ - -namespace -{ -static ProcessorParamsBasePtr createProcessorParamsLandmarkApriltag(const std::string & _filename_dot_yaml) -{ - YAML::Node config = YAML::LoadFile(_filename_dot_yaml); - - if (config.IsNull()) - { - WOLF_ERROR("Invalid YAML file!"); - return nullptr; - } - else if (config["processor type"].as<std::string>() == "TRACKER LANDMARK APRILTAG") - { - ProcessorParamsTrackerLandmarkApriltagPtr params = std::make_shared<ProcessorParamsTrackerLandmarkApriltag>(); - - YAML::Node detector_parameters = config["detector parameters"]; - params->quad_decimate_ = detector_parameters["quad_decimate"] .as<Scalar>(); - params->quad_sigma_ = detector_parameters["quad_sigma"] .as<Scalar>(); - params->nthreads_ = detector_parameters["nthreads"] .as<int>(); - params->debug_ = detector_parameters["debug"] .as<bool>(); - params->refine_edges_ = detector_parameters["refine_edges"] .as<bool>(); - params->ippe_min_ratio_ = detector_parameters["ippe_min_ratio"] .as<Scalar>(); - params->ippe_max_rep_error_ = detector_parameters["ippe_max_rep_error"] .as<Scalar>(); - - YAML::Node tag_parameters = config["tag parameters"]; - params->tag_family_ = tag_parameters["tag_family"] .as<std::string>(); - // params->tag_black_border_ = tag_parameters["tag_black_border"] .as<int>(); - params->tag_width_default_ = tag_parameters["tag_width_default"] .as<Scalar>(); - - // read list of tag widths - YAML::Node tag_widths = config["tag widths"]; - for (auto pair_id_width : tag_widths) - { - int tag_id = pair_id_width.first .as<int>(); - Scalar tag_width = pair_id_width.second .as<Scalar>(); - params->tag_widths_.emplace(tag_id, tag_width); - } - - YAML::Node noise = config["noise"]; - params->std_xy_ = noise["std_xy"] .as<Scalar>(); - params->std_z_ = noise["std_z"] .as<Scalar>(); - params->std_rpy_ = M_TORAD * noise["std_rpy_degrees"] .as<Scalar>(); - params->std_pix_ = noise["std_pix"] .as<Scalar>(); - - YAML::Node vote = config["vote"]; - params->voting_active = vote["voting active"] .as<bool>(); - params->min_time_vote_ = vote["min_time_vote"] .as<Scalar>(); - params->max_time_vote_ = vote["max_time_vote"] .as<Scalar>(); - params->min_features_for_keyframe = vote["min_features_for_keyframe"] .as<unsigned int>(); - params->max_features_diff_ = vote["max_features_diff"] .as<int>(); - params->nb_vote_for_every_first_ = vote["nb_vote_for_every_first"] .as<int>(); - params->enough_info_necessary_ = vote["enough_info_necessary"] .as<bool>(); - - params->reestimate_last_frame_ = config["reestimate_last_frame"] .as<bool>(); - params->add_3D_cstr_ = config["add_3D_cstr"] .as<bool>(); - - return params; - } - else - { - WOLF_ERROR("Wrong processor type! Should be \"TRACKER LANDMARK APRILTAG\""); - return nullptr; - } - return nullptr; -} - -// Register in the SensorFactory -const bool WOLF_UNUSED registered_prc_apriltag = ProcessorParamsFactory::get().registerCreator("TRACKER LANDMARK APRILTAG", createProcessorParamsLandmarkApriltag); -const bool WOLF_UNUSED registered_prc_apriltag_wrapper = ProcessorParamsFactory::get().registerCreator("TRACKER LANDMARK APRILTAG WRAPPER", createProcessorParamsLandmarkApriltag); - -} // namespace [unnamed] - -} // namespace wolf -- GitLab From 2f5a01fcdeb0f306047839665d47b0ff6dd1b66a Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Thu, 23 May 2019 18:07:31 +0200 Subject: [PATCH 29/58] Export pinhole_tools.h when installing --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d00762c84..ff95d8697 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -165,6 +165,7 @@ ENDIF(Ceres_FOUND) SET(HDRS_COMMON ) SET(HDRS_MATH +include/vision/math/pinhole_tools.h ) SET(HDRS_UTILS ) -- GitLab From fdfe144ced097d518363f1a732a5c47811485a83 Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Thu, 23 May 2019 18:29:42 +0200 Subject: [PATCH 30/58] Fix cmake creating folder 'vision' instead of 'plugin_vision' --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff95d8697..7315df21d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -352,7 +352,7 @@ INSTALL(FILES ${PROJECT_NAME}.found DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}) INSTALL(FILES "${WOLF_CONFIG_DIR}/config.h" - DESTINATION include/iri-algorithms/wolf/${PROJECT_NAME}/${PROJECT_NAME}/internal) + DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/internal) # INSTALL(FILES "${CMAKE_BINARY_DIR}/cmake_modules/Findwolf${PLUGIN_NAME}.cmake" # DESTINATION "lib/cmake/${PLUGIN_NAME}") -- GitLab From eadb7a9748b8c3df72fc57c364efc7fd183d814a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Fri, 24 May 2019 19:42:13 +0200 Subject: [PATCH 31/58] replace Affine --> Isometry --- include/vision/factor/factor_AHP.h | 6 +++--- include/vision/factor/factor_autodiff_trifocal.h | 2 +- src/landmark/landmark_AHP.cpp | 4 ++-- src/landmark/landmark_HP.cpp | 4 ++-- src/processor/processor_tracker_landmark_image.cpp | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/vision/factor/factor_AHP.h b/include/vision/factor/factor_AHP.h index 3ef1b6c8b..448ca1fcb 100644 --- a/include/vision/factor/factor_AHP.h +++ b/include/vision/factor/factor_AHP.h @@ -116,7 +116,7 @@ inline void FactorAHP::expectation(const T* const _current_frame_p, using namespace Eigen; // All involved transforms typedef - typedef Eigen::Transform<T, 3, Eigen::Affine> TransformType; + typedef Eigen::Transform<T, 3, Eigen::Isometry> TransformType; // world to anchor robot transform Map<const Matrix<T, 3, 1> > p_w_r0(_anchor_frame_p); @@ -144,8 +144,8 @@ inline void FactorAHP::expectation(const T* const _current_frame_p, // hmg point in current camera frame C1 Eigen::Map<const Eigen::Matrix<T, 4, 1> > landmark_hmg_c0(_lmk_hmg); - Eigen::Matrix<T, 4, 1> landmark_hmg_c1 = T_R1_C1.inverse(Eigen::Affine) - * T_W_R1. inverse(Eigen::Affine) + Eigen::Matrix<T, 4, 1> landmark_hmg_c1 = T_R1_C1.inverse(Eigen::Isometry) + * T_W_R1. inverse(Eigen::Isometry) * T_W_R0 * T_R0_C0 * landmark_hmg_c0; diff --git a/include/vision/factor/factor_autodiff_trifocal.h b/include/vision/factor/factor_autodiff_trifocal.h index 4ad34ce40..31b5d5969 100644 --- a/include/vision/factor/factor_autodiff_trifocal.h +++ b/include/vision/factor/factor_autodiff_trifocal.h @@ -271,7 +271,7 @@ inline void FactorAutodiffTrifocal::expectation(const MatrixBase<D1>& _wtr1, { typedef Translation<T, 3> TranslationType; - typedef Eigen::Transform<T, 3, Eigen::Affine> TransformType; + typedef Eigen::Transform<T, 3, Eigen::Isometry> TransformType; // All input Transforms TransformType wHr1 = TranslationType(_wtr1) * _wqr1; diff --git a/src/landmark/landmark_AHP.cpp b/src/landmark/landmark_AHP.cpp index 28efec608..d8d49a66d 100644 --- a/src/landmark/landmark_AHP.cpp +++ b/src/landmark/landmark_AHP.cpp @@ -44,10 +44,10 @@ Eigen::Vector3s LandmarkAHP::getPointInAnchorSensor() const Eigen::Vector3s LandmarkAHP::point() const { using namespace Eigen; - Transform<Scalar,3,Affine> T_w_r + Transform<Scalar,3,Isometry> T_w_r = Translation<Scalar,3>(getAnchorFrame()->getP()->getState()) * Quaternions(getAnchorFrame()->getO()->getState().data()); - Transform<Scalar,3,Affine> T_r_c + Transform<Scalar,3,Isometry> T_r_c = Translation<Scalar,3>(getAnchorSensor()->getP()->getState()) * Quaternions(getAnchorSensor()->getO()->getState().data()); Vector4s point_hmg_c = getP()->getState(); diff --git a/src/landmark/landmark_HP.cpp b/src/landmark/landmark_HP.cpp index a9bf53f4d..33e52b303 100644 --- a/src/landmark/landmark_HP.cpp +++ b/src/landmark/landmark_HP.cpp @@ -38,10 +38,10 @@ Eigen::Vector3s LandmarkHP::point() const using namespace Eigen; /* TODO: done when creating the landmark - Transform<Scalar,3,Affine> T_w_r + Transform<Scalar,3,Isometry> T_w_r = Translation<Scalar,3>(getAnchorFrame()->getP()->getState()) * Quaternions(getAnchorFrame()->getO()->getState().data()); - Transform<Scalar,3,Affine> T_r_c + Transform<Scalar,3,Isometry> T_r_c = Translation<Scalar,3>(getAnchorSensor()->getP()->getState()) * Quaternions(getAnchorSensor()->getO()->getState().data()); */ diff --git a/src/processor/processor_tracker_landmark_image.cpp b/src/processor/processor_tracker_landmark_image.cpp index b9ae15084..ec11fb573 100644 --- a/src/processor/processor_tracker_landmark_image.cpp +++ b/src/processor/processor_tracker_landmark_image.cpp @@ -304,7 +304,7 @@ void ProcessorTrackerLandmarkImage::landmarkInCurrentCamera(const Eigen::VectorX assert((_current_state.size() == 7 || _current_state.size() == 16) && "Wrong state size! Should be 7 for 3D pose or 16 for IMU."); // ALL TRANSFORMS - Transform<Scalar,3,Eigen::Affine> T_W_R0, T_W_R1, T_R0_C0, T_R1_C1; + Transform<Scalar,3,Eigen::Isometry> T_W_R0, T_W_R1, T_R0_C0, T_R1_C1; // world to anchor robot frame Translation<Scalar,3> t_w_r0(_landmark->getAnchorFrame()->getP()->getState()); // sadly we cannot put a Map over a translation @@ -328,7 +328,7 @@ void ProcessorTrackerLandmarkImage::landmarkInCurrentCamera(const Eigen::VectorX // Transform lmk from c0 to c1 and exit Vector4s landmark_hmg_c0 = _landmark->getP()->getState(); // lmk in anchor frame - _point3D_hmg = T_R1_C1.inverse(Eigen::Affine) * T_W_R1.inverse(Eigen::Affine) * T_W_R0 * T_R0_C0 * landmark_hmg_c0; + _point3D_hmg = T_R1_C1.inverse(Eigen::Isometry) * T_W_R1.inverse(Eigen::Isometry) * T_W_R0 * T_R0_C0 * landmark_hmg_c0; } Scalar ProcessorTrackerLandmarkImage::match(const cv::Mat _target_descriptor, const cv::Mat _candidate_descriptors, DMatchVector& _cv_matches) -- GitLab From 222cb3b6365bab3c37415f9246764e530abe3600 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:41:50 +0200 Subject: [PATCH 32/58] Add demo bundle adjustment --- CMakeLists.txt | 2 +- demos/CMakeLists.txt | 240 +++---------------------------------------- 2 files changed, 15 insertions(+), 227 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7315df21d..db4ea725a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -290,7 +290,7 @@ TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${vision_utils_LIBRARY}) # TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${CERES_LIBRARIES}) # ENDIF(Ceres_FOUND) - +add_subdirectory(demos) #Build tests #===============EXAMPLE========================= IF (GLOG_FOUND) diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index beae7b87e..5b7c8ec27 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -1,232 +1,20 @@ -# Dynamically remove objects from list -# add_executable(test_list_remove test_list_remove.cpp) -# Matrix product test -#ADD_EXECUTABLE(test_matrix_prod test_matrix_prod.cpp) +if (OpenCV_FOUND) + if (${OpenCV_VERSION_MAJOR} GREATER 1) + message("-- [INFO] Found OpenCV support") + ADD_DEFINITIONS(-DHAVE_OPENCV_H) + SET(USE_CV true) + else(${OpenCV_VERSION_MAJOR} GREATER 1) + message("[WARN] OpenCV support not installed. Minimum 2.4 version required.") + message("[WARN] Current version ${OpenCV_VERSION_MAJOR}") + endif(${OpenCV_VERSION_MAJOR} GREATER 1) +else(OpenCV_FOUND) + message("[WARN] OpenCV support not installed. Minimum 2.4 version required.") +endif(OpenCV_FOUND) -#ADD_EXECUTABLE(test_eigen_template test_eigen_template.cpp) -ADD_EXECUTABLE(test_fcn_ptr test_fcn_ptr.cpp) -ADD_EXECUTABLE(test_kf_callback test_kf_callback.cpp) -TARGET_LINK_LIBRARIES(test_kf_callback ${PROJECT_NAME}) +ADD_EXECUTABLE(demo_processor_bundle_adjustment demo_processor_bundle_adjustment.cpp) +TARGET_LINK_LIBRARIES(demo_processor_bundle_adjustment ${PLUGIN_NAME}) -ADD_EXECUTABLE(test_wolf_logging test_wolf_logging.cpp) -TARGET_LINK_LIBRARIES(test_wolf_logging ${PROJECT_NAME}) -IF(Ceres_FOUND) - # test_processor_odom_3D - ADD_EXECUTABLE(test_processor_odom_3D test_processor_odom_3D.cpp) - TARGET_LINK_LIBRARIES(test_processor_odom_3D ${PROJECT_NAME}) - -# ADD_EXECUTABLE(test_motion_2d test_motion_2d.cpp) -# TARGET_LINK_LIBRARIES(test_motion_2d ${PROJECT_NAME}) -ENDIF(Ceres_FOUND) - - - - -# State blocks with local parametrizations test -#ADD_EXECUTABLE(test_state_quaternion test_state_quaternion.cpp) -#TARGET_LINK_LIBRARIES(test_state_quaternion ${PROJECT_NAME}) - -# Testing Eigen Permutations -#ADD_EXECUTABLE(test_permutations solver/test_permutations.cpp) -#TARGET_LINK_LIBRARIES(test_permutations ${PROJECT_NAME}) - -# Enable Yaml config files -IF(YAMLCPP_FOUND) -# ADD_EXECUTABLE(test_yaml test_yaml.cpp) -# TARGET_LINK_LIBRARIES(test_yaml ${PROJECT_NAME}) - -# ADD_EXECUTABLE(test_yaml_conversions test_yaml_conversions.cpp) -# TARGET_LINK_LIBRARIES(test_yaml_conversions ${PROJECT_NAME}) - - # SensorFactory classes test -# ADD_EXECUTABLE(test_wolf_factories test_wolf_factories.cpp) -# TARGET_LINK_LIBRARIES(test_wolf_factories ${PROJECT_NAME}) - - # Map load and save test -# ADD_EXECUTABLE(test_map_yaml test_map_yaml.cpp) -# TARGET_LINK_LIBRARIES(test_map_yaml ${PROJECT_NAME}) -ENDIF(YAMLCPP_FOUND) - -IF(Suitesparse_FOUND) -IF (0) # These cannot compile on MacOSX -- we'll fix it some day. - # Testing a ccolamd test - ADD_EXECUTABLE(test_ccolamd solver/test_ccolamd.cpp) - TARGET_LINK_LIBRARIES(test_ccolamd ${PROJECT_NAME}) - - # Testing a blocks ccolamd test - ADD_EXECUTABLE(test_ccolamd_blocks solver/test_ccolamd_blocks.cpp) - TARGET_LINK_LIBRARIES(test_ccolamd_blocks ${PROJECT_NAME}) - - # Testing an incremental blocks ccolamd test - ADD_EXECUTABLE(test_incremental_ccolamd_blocks solver/test_incremental_ccolamd_blocks.cpp) - TARGET_LINK_LIBRARIES(test_incremental_ccolamd_blocks ${PROJECT_NAME}) - - # Testing an incremental QR with block ccolamd test - ADD_EXECUTABLE(test_iQR solver/test_iQR.cpp) - TARGET_LINK_LIBRARIES(test_iQR ${PROJECT_NAME}) - - # Testing QR solver test tending to wolf - ADD_EXECUTABLE(test_iQR_wolf solver/test_iQR_wolf.cpp) - TARGET_LINK_LIBRARIES(test_iQR_wolf ${PROJECT_NAME}) - - # Testing SPQR simple test - #ADD_EXECUTABLE(test_SPQR solver/test_SPQR.cpp) - #TARGET_LINK_LIBRARIES(test_SPQR ${PROJECT_NAME}) -ENDIF(0) - -ENDIF(Suitesparse_FOUND) - -# Building and populating the wolf tree -# ADD_EXECUTABLE(test_wolf_tree test_wolf_tree.cpp) -# TARGET_LINK_LIBRARIES(test_wolf_tree ${PROJECT_NAME}) - -# Building and populating the wolf tree from .graph file (TORO) -#ADD_EXECUTABLE(test_wolf_imported_graph test_wolf_imported_graph.cpp) -#TARGET_LINK_LIBRARIES(test_wolf_imported_graph ${PROJECT_NAME}) - -# Comparing performance of wolf auto_diff and ceres auto_diff -#ADD_EXECUTABLE(test_wolf_autodiffwrapper test_wolf_autodiffwrapper.cpp) -#TARGET_LINK_LIBRARIES(test_wolf_autodiffwrapper ${PROJECT_NAME}) - -# Prunning wolf tree from .graph file (TORO) -#ADD_EXECUTABLE(test_wolf_prunning test_wolf_prunning.cpp) -#TARGET_LINK_LIBRARIES(test_wolf_prunning ${PROJECT_NAME}) - -# Sparsification from wolf tree from .graph file (TORO) -ADD_EXECUTABLE(test_sparsification test_sparsification.cpp) -TARGET_LINK_LIBRARIES(test_sparsification ${PROJECT_NAME}) - -# Comparing analytic and autodiff odometry factors -#ADD_EXECUTABLE(test_analytic_odom_factor test_analytic_odom_factor.cpp) -#TARGET_LINK_LIBRARIES(test_analytic_odom_factor ${PROJECT_NAME}) - -# Vision -IF(vision_utils_FOUND) - - IF(Ceres_FOUND) - # Testing many things for the 3D image odometry - ADD_EXECUTABLE(test_image test_image.cpp) - TARGET_LINK_LIBRARIES(test_image ${PROJECT_NAME}) - - # Processor Image Landmark test - ADD_EXECUTABLE(test_processor_tracker_landmark_image test_processor_tracker_landmark_image.cpp) - TARGET_LINK_LIBRARIES(test_processor_tracker_landmark_image ${PROJECT_NAME}) - - # Simple AHP test - ADD_EXECUTABLE(test_simple_AHP test_simple_AHP.cpp) - TARGET_LINK_LIBRARIES(test_simple_AHP ${PROJECT_NAME}) - - IF (APRILTAG_LIBRARY) - ADD_EXECUTABLE(test_apriltag test_apriltag.cpp) - TARGET_LINK_LIBRARIES(test_apriltag ${PROJECT_NAME}) - ENDIF(APRILTAG_LIBRARY) - - ENDIF(Ceres_FOUND) - - # Testing OpenCV functions for projection of points - ADD_EXECUTABLE(test_projection_points test_projection_points.cpp) - TARGET_LINK_LIBRARIES(test_projection_points ${PROJECT_NAME}) - - # Factor test - ADD_EXECUTABLE(test_factor_AHP test_factor_AHP.cpp) - TARGET_LINK_LIBRARIES(test_factor_AHP ${PROJECT_NAME}) - - # ORB tracker test - ADD_EXECUTABLE(test_tracker_ORB test_tracker_ORB.cpp) - TARGET_LINK_LIBRARIES(test_tracker_ORB ${PROJECT_NAME}) - - # Trifocal optimization test - ADD_EXECUTABLE(test_trifocal_optimization test_trifocal_optimization.cpp) - TARGET_LINK_LIBRARIES(test_trifocal_optimization ${PROJECT_NAME}) - -ENDIF(vision_utils_FOUND) - -# Processor Tracker Feature test -ADD_EXECUTABLE(test_processor_tracker_feature test_processor_tracker_feature.cpp) -TARGET_LINK_LIBRARIES(test_processor_tracker_feature ${PROJECT_NAME}) - -# Processor Tracker Landmark test -ADD_EXECUTABLE(test_processor_tracker_landmark test_processor_tracker_landmark.cpp) -TARGET_LINK_LIBRARIES(test_processor_tracker_landmark ${PROJECT_NAME}) - -# Processor IMU test -ADD_EXECUTABLE(test_processor_imu test_processor_imu.cpp) -TARGET_LINK_LIBRARIES(test_processor_imu ${PROJECT_NAME}) - -# Processor Diff-Drive test -ADD_EXECUTABLE(test_processor_diff_drive test_diff_drive.cpp) -TARGET_LINK_LIBRARIES(test_processor_diff_drive ${PROJECT_NAME}) - -# MPU6050 IMU test -#ADD_EXECUTABLE(test_mpu test_mpu.cpp) -#TARGET_LINK_LIBRARIES(test_mpu ${PROJECT_NAME}) - -# Processor IMU - Jacobian checking test -#ADD_EXECUTABLE(test_processor_imu_jacobians test_processor_imu_jacobians.cpp) -#TARGET_LINK_LIBRARIES(test_processor_imu_jacobians ${PROJECT_NAME}) - -# Test IMU using printed Dock -#ADD_EXECUTABLE(test_imuDock test_imuDock.cpp) -#TARGET_LINK_LIBRARIES(test_imuDock ${PROJECT_NAME}) - -# Test IMU with auto KF generation (Humanoids 20017) -#ADD_EXECUTABLE(test_imuDock_autoKFs test_imuDock_autoKFs.cpp) -#TARGET_LINK_LIBRARIES(test_imuDock_autoKFs ${PROJECT_NAME}) - -# FactorIMU - factors test -#ADD_EXECUTABLE(test_imu_constrained0 test_imu_constrained0.cpp) -#TARGET_LINK_LIBRARIES(test_imu_constrained0 ${PROJECT_NAME}) - -# IMU - Offline plateform test -#ADD_EXECUTABLE(test_imuPlateform_Offline test_imuPlateform_Offline.cpp) -#TARGET_LINK_LIBRARIES(test_imuPlateform_Offline ${PROJECT_NAME}) - -# IMU - factorIMU -#ADD_EXECUTABLE(test_factor_imu test_factor_imu.cpp) -#TARGET_LINK_LIBRARIES(test_factor_imu ${PROJECT_NAME}) - -# IF (laser_scan_utils_FOUND) -# ADD_EXECUTABLE(test_capture_laser_2D test_capture_laser_2D.cpp) -# TARGET_LINK_LIBRARIES(test_capture_laser_2D ${PROJECT_NAME}) -# #ENDIF (laser_scan_utils_FOUND) - -# IF(faramotics_FOUND) -# IF (laser_scan_utils_FOUND) -# ADD_EXECUTABLE(test_ceres_2_lasers test_ceres_2_lasers.cpp) -# TARGET_LINK_LIBRARIES(test_ceres_2_lasers -# ${pose_state_time_LIBRARIES} -# ${faramotics_LIBRARIES} -# ${PROJECT_NAME}) -# ADD_EXECUTABLE(test_ceres_2_lasers_polylines test_ceres_2_lasers_polylines.cpp) -# TARGET_LINK_LIBRARIES(test_ceres_2_lasers_polylines -# ${pose_state_time_LIBRARIES} -# ${faramotics_LIBRARIES} -# ${PROJECT_NAME}) -# ADD_EXECUTABLE(test_2_lasers_offline test_2_lasers_offline.cpp) -# TARGET_LINK_LIBRARIES(test_2_lasers_offline -# ${pose_state_time_LIBRARIES} -# ${faramotics_LIBRARIES} -# ${PROJECT_NAME}) -# ADD_EXECUTABLE(test_faramotics_simulation test_faramotics_simulation.cpp) -# TARGET_LINK_LIBRARIES(test_faramotics_simulation -# ${pose_state_time_LIBRARIES} -# ${faramotics_LIBRARIES} -# ${PROJECT_NAME}) -# # ADD_EXECUTABLE(test_autodiff test_autodiff.cpp) -# # TARGET_LINK_LIBRARIES(test_autodiff -# # ${pose_state_time_LIBRARIES} -# # ${faramotics_LIBRARIES} -# # ${PROJECT_NAME}) -# # IF(Suitesparse_FOUND) -# # ADD_EXECUTABLE(test_iQR_wolf2 solver/test_iQR_wolf2.cpp) -# # TARGET_LINK_LIBRARIES(test_iQR_wolf2 -# # ${pose_state_time_LIBRARIES} -# # ${faramotics_LIBRARIES} -# # ${PROJECT_NAME}) -# # ENDIF(Suitesparse_FOUND) -# # ENDIF (laser_scan_utils_FOUND) -# # ENDIF(faramotics_FOUND) -- GitLab From ef211f7013a8551399c449ddf53b506ae1ad62b7 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:43:31 +0200 Subject: [PATCH 33/58] params for demo bundle adjustment --- demos/calib_logitech_webcam_params.yaml | 20 ++++++++++++++++++++ demos/processor_bundle_adjustment.yaml | 7 ++++--- 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 demos/calib_logitech_webcam_params.yaml diff --git a/demos/calib_logitech_webcam_params.yaml b/demos/calib_logitech_webcam_params.yaml new file mode 100644 index 000000000..1285f904c --- /dev/null +++ b/demos/calib_logitech_webcam_params.yaml @@ -0,0 +1,20 @@ +image_width: 640 +image_height: 480 +camera_name: narrow_stereo +camera_matrix: + rows: 3 + cols: 3 + data: [942.816482, 0.000000, 334.175643, 0.000000, 897.287666, 309.904004, 0.000000, 0.000000, 1.000000] +distortion_model: plumb_bob +distortion_coefficients: + rows: 1 + cols: 5 + data: [0.159958, -0.578834, 0.000000, 0.000000, 0.000000] +rectification_matrix: + rows: 3 + cols: 3 + data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000] +projection_matrix: + rows: 3 + cols: 4 + data: [953.235413, 0.000000, 334.175675, 0.000000, 0.000000, 907.202332, 309.904238, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000] diff --git a/demos/processor_bundle_adjustment.yaml b/demos/processor_bundle_adjustment.yaml index 788373081..52242f47c 100644 --- a/demos/processor_bundle_adjustment.yaml +++ b/demos/processor_bundle_adjustment.yaml @@ -1,11 +1,12 @@ -processor type: "TRACKER FEATURE TRIFOCAL" -processor name: "tracker feature trifocal example" +processor type: "TRACKER BUNDLE ADJUSTMENT" +processor name: "tracker bundle adjustment example" vision_utils: - YAML file params: processor_tracker_feature_trifocal_vision_utils.yaml + YAML file params: processor_bundle_adjustment_vision_utils.yaml algorithm: time tolerance: 0.005 + delete ambiguities: true voting active: false minimum features for keyframe: 40 maximum new features: 100 -- GitLab From ebbe4c1de6f91be29b1812b4b9f3df5e286503f6 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:44:04 +0200 Subject: [PATCH 34/58] Add demo bundle adjustment --- demos/demo_processor_bundle_adjustment.cpp | 254 +++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 demos/demo_processor_bundle_adjustment.cpp diff --git a/demos/demo_processor_bundle_adjustment.cpp b/demos/demo_processor_bundle_adjustment.cpp new file mode 100644 index 000000000..6ef81f47e --- /dev/null +++ b/demos/demo_processor_bundle_adjustment.cpp @@ -0,0 +1,254 @@ +//std +#include <iostream> + +#include "vision/processor/processor_bundle_adjustment.h" + +//Wolf +#include <core/common/wolf.h> +#include <core/problem/problem.h> +#include <core/state_block/state_block.h> +#include "vision/sensor/sensor_camera.h" +#include "vision/capture/capture_image.h" +#include <core/ceres_wrapper/ceres_manager.h> +#include "vision/landmark/landmark_HP.h" +#include "vision/internal/config.h" + + +// Vision utils includes +#include <vision_utils.h> +#include <sensors.h> +#include <common_class/buffer.h> +#include <common_class/frame.h> + +////Mvbluefox includes +//#include <iri/mvbluefox3/mvbluefox3.h> +//#include <unistd.h> +//#include <limits.h> +//#include <sstream> +// +//typedef bool( *SUPPORTED_DEVICE_CHECK )( const mvIMPACT::acquire::Device* const ); +// +//// mvIMPACT::acquire::DeviceManager devMgr_; // Device Manager. +// +// +//std::string GetSerialFromUser(void) +//{ +// mvIMPACT::acquire::DeviceManager devMgr; // Device Manager. +// return getDeviceFromUserInput(devMgr)->serial.read(); +//} +// +//std::string AvailableDevices(SUPPORTED_DEVICE_CHECK pSupportedDeviceCheckFn) +//{ +// mvIMPACT::acquire::DeviceManager devMgr; // Device Manager. +// std::ostringstream devices; +// devices << "Available device(s): "; +// const unsigned int devCnt = devMgr.deviceCount(); +// if (devCnt == 0) +// { +// devices << "0."; +// } +// else +// { +// for( unsigned int i = 0; i < devCnt; i++ ) +// { +// Device* pDev = devMgr[i]; +// if( pDev ) +// { +// if( !pSupportedDeviceCheckFn || pSupportedDeviceCheckFn( pDev ) ) +// { +// devices << " \n - " << pDev->product.read() << ": " << pDev->serial.read(); +// } +// } +// } +// } +// return devices.str(); +//} +// +//std::string GetPath() +//{ +// char result[ PATH_MAX ]; +// ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX ); +// return std::string( result, (count > 0) ? count : 0 ); +//} + +using Eigen::Vector3s; +using Eigen::Vector4s; +using Eigen::Vector6s; +using Eigen::Vector7s; + +using namespace wolf; + +std::string wolf_vision_root = _WOLF_VISION_ROOT_DIR; + +int main(int argc, char** argv) +{ + std::cout << std::endl << "==================== processor bundle adjustment test ======================" << std::endl; + +// std::cout << "______________________________Get image from driver_________________________" << std::endl; +// // Sensor or sensor recording +// +// int num_cams = 1; +// +// // Get own path +// std::string argv_str(argv[0]); +// +// std::cout << argv[0] << "\n"; +// +// std::string pbase = argv_str.substr(0, argv_str.find_last_of("/")); +// std::string paramspath = pbase + "/../demos/demo_processor_bundle_adjustment_params.xml"; +// +// std::cout << paramspath << "\n"; +// +// std::cout << std::endl; +// std::cout << "******************************" << std::endl; +// std::cout << "* ---- mvBlueFOX3 ---- *" << std::endl; +// std::cout << "******************************" << std::endl; +// std::cout << std::endl; +// std::cout << "Please, choose the device to test from the following list:" << std::endl; +// std::cout << std::endl; +// +// std::vector<std::string> serial; +// serial.resize(num_cams); +// serial[0] = GetSerialFromUser(); +// +// std::vector<std::string> window_name; +// window_name.resize(num_cams); +// window_name[0] = serial[0]; +// +// +// mvIMPACT::acquire::DeviceManager devMgr_; // Device Manager. +// std::vector<CMvbluefox3::CMvbluefox3*> cam_ptr; // Device. +// +// try { +// cam_ptr.resize(num_cams); +// for (int ii = 0; ii < num_cams; ++ii) +// { +// cam_ptr[ii] = NULL; +// +// if( !serial[ii].empty() ) +// { +// std::cout << "Trying to open device with serial: " << serial[ii] << std::endl; +// +// if (devMgr_.getDeviceBySerial(serial[ii]) == 0) +// std::cout << "No device found! Unable to continue. " << std::endl; +// else +// cam_ptr[ii] = new CMvbluefox3::CMvbluefox3(devMgr_.getDeviceBySerial(serial[ii]),paramspath); +// } +// else +// std::cout << "Device cannot be found because serial number is not specified." << std::endl; +// } +// +//// std::cout << "Acquiring images." << std::endl << ">WARNING: depending on OpenCV compilation flags, visualization might experience hard delays (e.g. if \"init done\" appears in the following line)" << std::endl; +// for (int ii = 0; ii < num_cams; ++ii) +// cv::namedWindow( window_name[ii], cv::WINDOW_NORMAL ); +// +// while (true) +// { +// for (int ii = 0; ii < num_cams; ++ii) +// { +// cv::Mat image; +// cam_ptr[ii]->GetImageCV(image); +// cv::imshow( window_name[ii], image ); +// } +// if(cv::waitKey(30) >= 0) break; +// } +// +// cv::destroyAllWindows(); +// +// std::cout << "[Camera test]: Finished successfully." << std::endl; +// }catch (CMvbluefox3::CmvBlueFOX3Exception& e) { +// std::cout << e.what() << std::endl; +// } +// +// for (int ii = 0; ii < num_cams; ++ii) +// { +// if (cam_ptr[ii] != NULL) +// { +// cam_ptr[ii] = NULL; +// delete [] cam_ptr[ii]; +// } +// } +// + + vision_utils::SensorCameraPtr sen_ptr = vision_utils::askUserSource(argc, argv); + if (sen_ptr==NULL) + return 0; + + unsigned int buffer_size = 10; + vision_utils::Buffer<vision_utils::FramePtr> frame_buff(buffer_size); + frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), 0) ); + + unsigned int img_width = frame_buff.back()->getImage().cols; + unsigned int img_height = frame_buff.back()->getImage().rows; + std::cout << "Image size: " << img_width << "x" << img_height << std::endl; + +// =========================================================================== + + // Wolf problem + ProblemPtr problem = Problem::create("PO", 3); + ceres::Solver::Options options; + options.max_num_iterations = 100; + options.function_tolerance = 1e-4; + CeresManagerPtr ceres_manager = std::make_shared<CeresManager>(problem, options); + + // Install camera +// IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML +// intr->pinhole_model_raw = Eigen::Vector4s(320,240,320,320); +// intr->width = img_width; +// intr->height = img_height; +// auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr); + auto sens_cam = problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), wolf_vision_root + "/demos/calib_logitech_webcam_params.yaml"); + SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); + camera->setImgWidth(img_width); + camera->setImgHeight(img_height); + + // Install processor + ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); + params->delete_ambiguities = true; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->pixel_noise_std = 1.0; + params->min_track_length_for_factor = 3; + params->voting_active = true; + params->max_new_features = 200; + params->min_features_for_keyframe = 50; + params->time_tolerance = 0.01; + auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); + ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); + + std::cout << "sensor & processor created and added to wolf problem" << std::endl; + + +// ============================================================================== + + TimeStamp t = 0; + unsigned int number_of_KFs = 0; + // main loop + Scalar dt = 0.04; + for(int frame_count = 0; frame_count<10000; ++frame_count) + { + t += dt; + + // Image --------------------------------------------- + frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), frame_count) ); + CaptureImagePtr image = std::make_shared<CaptureImage>(t, camera, frame_buff.back()->getImage()); + /* process */ + camera->process(image); + + // solve only when new KFs are added + if (problem->getTrajectory()->getFrameList().size() > number_of_KFs) + { + number_of_KFs = problem->getTrajectory()->getFrameList().size(); + std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::BRIEF); + std::cout << report << std::endl; + if (number_of_KFs > 5) + break; + + } + + } + + problem->print(1,0,1,0); + + return 0; +} + -- GitLab From 740f734365a2321798929962ad4b7f6ada1fe547 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:44:37 +0200 Subject: [PATCH 35/58] Suggest (commented) alternative correction model. Keep original one. --- include/vision/math/pinhole_tools.h | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/include/vision/math/pinhole_tools.h b/include/vision/math/pinhole_tools.h index ef226651e..85ee2062a 100644 --- a/include/vision/math/pinhole_tools.h +++ b/include/vision/math/pinhole_tools.h @@ -761,6 +761,45 @@ void computeCorrectionModel(const Vk & k, const Vd & d, Vc & c) c = iRd * (rc - rd); } + +// //This method follows the one in: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4934233/ +// SizeEigen size = c.size(); +// if (size != 0 && size <=9) //Only implemented to compute a maximum of 9 distortion correction parameters +// { +// c(0) = -d(0); +// if (d.size() >= 2) +// { +// c(1) = 3 * pow(d(0),2) - d(1); +// } +// +// if (d.size() >= 3) +// { +// c(2) = -12 * pow(d(0), 3) + 8 * d(0) * d(1) - d(2); +// +//// c(3) = 55 * pow(d(0), 4) - 55 * pow(d(0), 2) * d(1) + 5 * pow(d(1), 2) + 10 * d(0) * d(2) - d(3); +//// +//// c(4) = -273 * pow(d(0), 5) + 364 * pow(d(0), 3) * d(1) - 78 * d(0) * pow(d(1), 2) - 78 * pow(d(0), 2) * d(2) + 12 * d(1) * d(2) + 12 * d(0) * d(3); +//// +//// c(5) = 1428 * pow(d(0), 6) - 2380 * pow(d(0), 4) * d(1) + 840 * pow(d(0), 2) * pow(d(1), 2) - 35 * pow(d(1), 3) + 560 * pow(d(0), 3) * d(2) +//// - 210 * d(0) * d(1) * d(2) + 7 * pow(d(2), 2) - 105 * pow(d(0), 2) * d(3) + 14 * d(1) * d(3); +//// +//// c(6) = -7752 * pow(d(0), 7) + 15504 * pow(d(0), 5) * d(1) - 7752 * pow(d(0), 3) * pow(d(1), 2) + 816 * d(0) * pow(d(1), 3) + 2448 * pow(d(0), 2) * d(1) * d(2) +//// - 136 * pow(d(1), 2) * d(2) - 136 * d(0) * pow(d(2), 2) + 816 * pow(d(0), 3) * d(3) - 272 * d(0) * d(1) * d(3) + 16 * d(2) * d(3); +//// +//// c(7) = 43263 * pow(d(0), 8) - 100947 * pow(d(0), 6) * d(1) + 65835 * pow(d(0), 4) * pow(d(1), 2) - 11970 * pow(d(0), 2) * pow(d(1), 3) + 285 * pow(d(1), 4) +//// + 26334 * pow(d(0), 5) * d(2) - 23940 * pow(d(0), 3) * d(1) * d(2) + 3420 * d(0) * pow(d(1), 2) * d(2) + 1710 * pow(d(0), 2) * pow(d(2), 2) +//// - 171 * d(1) * pow(d(2), 2) - 5985 * pow(d(0), 4) * d(3) + 3420 * pow(d(0), 2) * d(1) * d(3) - 171 * pow(d(1), 2) * d(3) - 342 * d(0) * d(2) * d(3) +//// + 9 * pow(d(3), 2); +//// +//// c(8) = -246675 * pow(d(0), 9) + 657800 * pow(d(0), 7) * d(1) - 531300 * pow(d(0), 5) * pow(d(1), 2) + 141680 * pow(d(0), 3) * pow(d(1), 3) +//// - 8855 * d(0) * pow(d(1), 4) - 177100 * pow(d(0), 6) * d(2) + 212520 * pow(d(0), 4) * d(1) * d(2) - 53130 * pow(d(0), 2) * pow(d(1), 2) * d(2) +//// + 1540 * pow(d(1), 3) * d(2) - 17710 * pow(d(0), 3) * pow(d(2), 2) + 4620 * d(0) * d(1) * pow(d(2), 2) - 70 * pow(d(2), 3) +//// + 42504 * pow(d(0), 5) * d(3) - 35420 * pow(d(0), 3) * d(1) * d(3) + 4620 * d(0) * pow(d(1), 2) * d(3) + 4620 * pow(d(0), 2) * d(2) * d(3) +//// - 420 * d(1) * d(2) * d(3) - 210 * d(0) * pow(d(3), 2); +// } +// c = c.head(size); +// } + } } // namespace pinhole -- GitLab From 9bc84c485a33c9c69713b883ac0c216624093c71 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:47:14 +0200 Subject: [PATCH 36/58] Improve processor bundle adj. --- .../processor/processor_bundle_adjustment.h | 9 ++ src/processor/processor_bundle_adjustment.cpp | 106 ++++++++++++------ 2 files changed, 80 insertions(+), 35 deletions(-) diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index 8c55cdb5b..c13f4cad3 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -12,6 +12,8 @@ #include "core/processor/processor_tracker_feature.h" #include "vision/capture/capture_image.h" #include "vision/landmark/landmark_HP.h" +#include "vision/math/pinhole_tools.h" +#include "vision/sensor/sensor_camera.h" //vision utils includes #include "vision_utils/vision_utils.h" @@ -144,6 +146,8 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature */ virtual void establishFactors() override; + void setParams(const ProcessorParamsBundleAdjustmentPtr _params); + public: /// @brief Factory method static ProcessorBasePtr create(const std::string& _unique_name, @@ -162,6 +166,11 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature cv::Mat getImageDebug(); }; +inline cv::Mat ProcessorBundleAdjustment::getImageDebug() +{ + return image_debug_; +} + } //namespace wolf #endif /* INCLUDE_BASE_PROCESSOR_PROCESSOR_BUNDLE_ADJUSTMENT_H_ */ diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 0c4b8a0c4..cd5ce5347 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -122,6 +122,51 @@ void ProcessorBundleAdjustment::postProcess() // DEBUG image_debug_ = vision_utils::buildImageProcessed((std::static_pointer_cast<CaptureImage>(last_ptr_))->getImage(), kp_enh_tracks); +// typedef std::map<size_t, LandmarkBasePtr>::iterator iter; +// for(iter it = lmk_track_map_.begin(); it != lmk_track_map_.end(); ++it) +// { +// Vector3s point3D = std::static_pointer_cast<LandmarkHP>(it->second)->point(); +// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); +// Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D); +// cv::Point point = cv::Point(point2D(0), point2D(1)); +// cv::circle(image_debug_, point, 1, cv::Scalar(0,0,255) , 1 , 8); +// } + +// for (auto const & feat_base : last_ptr_->getFeatureList()) +// { +// FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); +// unsigned int track_id = feat->trackId(); +// Vector3s point3D = std::static_pointer_cast<LandmarkHP>(lmk_track_map_[track_id])->point(); +// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); +// Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D); +// cv::Point point = cv::Point(point2D(0), point2D(1)); +// cv::circle(image_debug_, point, 1, cv::Scalar(0,0,255) , 1 , 8); +// } + + list<FeatureBasePtr> snapshot = track_matrix_.snapshotAsList(last_ptr_); + for (auto const & feat_base : snapshot) + { + FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); + unsigned int track_id = feat->trackId(); + if (lmk_track_map_.count(track_id)) + { + Vector3s point3D = std::static_pointer_cast<LandmarkHP>(lmk_track_map_[track_id])->point(); + Transform<Scalar,3,Isometry> T_w_r + = Translation<Scalar,3>(feat_base->getFrame()->getP()->getState()) + * Quaternions(feat_base->getFrame()->getO()->getState().data()); + Transform<Scalar,3,Isometry> T_r_c + = Translation<Scalar,3>(feat_base->getCapture()->getSensorP()->getState()) + * Quaternions(feat_base->getCapture()->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 3, 1> point3D_c = T_r_c.inverse() + * T_w_r.inverse() + * point3D; + SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); + Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D_c); + cv::Point point = cv::Point(point2D(0), point2D(1)); + cv::circle(image_debug_, point, 3, cv::Scalar(0,0,255) , 1 , 8); + } + } + cv::imshow("DEBUG VIEW", image_debug_); cv::waitKey(1); } @@ -156,7 +201,8 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& } } } - return _feature_correspondences.size(); +// return _feature_correspondences.size(); + return _features_incoming_out.size(); } @@ -253,14 +299,18 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur Eigen::Vector2s point2D = _feature_ptr->getMeasurement(); Eigen::Vector3s point3D; - point3D = pinhole::backprojectPoint(getSensor()->getIntrinsic()->getState(),(std::static_pointer_cast<SensorCamera>(getSensor()))->getCorrectionVector(), point2D); - point3D.normalize(); + point3D = pinhole::backprojectPoint( + getSensor()->getIntrinsic()->getState(), + (std::static_pointer_cast<SensorCamera>(getSensor()))->getCorrectionVector(), + point2D); + //Scalar distance = params_bundle_adjustment_->distance; // arbitrary value Scalar distance = 1; - Eigen::Vector4s vec_homogeneous; - vec_homogeneous = {point3D(0),point3D(1),point3D(2),1/distance}; + Eigen::Vector4s vec_homogeneous_c; + vec_homogeneous_c = {point3D(0),point3D(1),point3D(2),point3D.norm()/distance}; + vec_homogeneous_c.normalize(); //TODO: lmk from camera to world coordinate frame. Transform<Scalar,3,Isometry> T_w_r @@ -271,7 +321,7 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur * Quaternions(_feature_ptr->getCapture()->getSensorO()->getState().data()); Eigen::Matrix<Scalar, 4, 1> vec_homogeneous_w = T_w_r * T_r_c - * vec_homogeneous; + * vec_homogeneous_c; // std::cout << "Point2D: " << point2D.transpose() << std::endl; @@ -280,7 +330,7 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur // std::cout << "Hmg_w: " << vec_homogeneous_w.transpose() << std::endl; //vec_homogeneous_w = vec_homogeneous; - LandmarkHPPtr lmk_hp_ptr = std::make_shared<LandmarkHP>(vec_homogeneous_w, getSensor(), feat_point_image_ptr->getDescriptor()); + LandmarkBasePtr lmk_hp_ptr = LandmarkBase::emplace<LandmarkHP>(getProblem()->getMap(), vec_homogeneous_w, getSensor(), feat_point_image_ptr->getDescriptor()); _feature_ptr->setLandmarkId(lmk_hp_ptr->id()); return lmk_hp_ptr; } @@ -288,6 +338,10 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur void ProcessorBundleAdjustment::establishFactors() { + if (origin_ptr_ == last_ptr_) + return; + + TrackMatches matches_origin_inc = track_matrix_.matches(origin_ptr_, last_ptr_); for (auto const & pair_trkid_pair : matches_origin_inc) @@ -296,12 +350,8 @@ void ProcessorBundleAdjustment::establishFactors() FeatureBasePtr feature_origin = pair_trkid_pair.second.first; FeatureBasePtr feature_last = pair_trkid_pair.second.second; -// assert(feature_origin!=nullptr && "null feature origin"); -// assert(feature_last!=nullptr && "null feature last"); -// assert(feature_origin->getCapture()!=nullptr); -// assert(feature_last->getCapture()!=nullptr); -// assert(feature_last->getCapture()->getFrame()!=nullptr && feature_last->getCapture()->getFrame()->isKey()); -// assert(feature_origin->getCapture()->getFrame()!=nullptr && feature_origin->getCapture()->getFrame()->isKey()); + assert(feature_origin!=feature_last && "feature: origin equal last"); + assert(feature_origin->getCapture()!=feature_last->getCapture() && "capture: origin equal last"); if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr { @@ -309,7 +359,6 @@ void ProcessorBundleAdjustment::establishFactors() LandmarkBasePtr lmk = createLandmark(feature_origin); assert(lmk!=nullptr); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); - getProblem()->addLandmark(lmk_hp); //add Landmark to map: map[track_id] = landmarkptr lmk_track_map_[trkid] = lmk; @@ -318,20 +367,8 @@ void ProcessorBundleAdjustment::establishFactors() // assert(feature_origin->getCapture()->getSensorP() != nullptr); // assert(feature_origin->getCapture()->getSensorO() != nullptr); // assert(lmk->getP() != nullptr); - FactorPixelHPPtr fac_ptr_origin = std::make_shared<FactorPixelHP>(feature_origin, lmk_hp, shared_from_this()); - if (fac_ptr_origin != nullptr) // factor links - { - feature_origin->addFactor(fac_ptr_origin); - fac_ptr_origin->link(feature_origin); - lmk->addConstrainedBy(fac_ptr_origin); - } - FactorPixelHPPtr fac_ptr_last = std::make_shared<FactorPixelHP>(feature_last, lmk_hp, shared_from_this()); - if (fac_ptr_last != nullptr) // factor links - { - feature_last->addFactor(fac_ptr_last); - fac_ptr_last->link(feature_last); - lmk->addConstrainedBy(fac_ptr_last); - } + FactorBase::emplace<FactorPixelHP>(feature_origin, feature_origin, lmk_hp, shared_from_this()); + FactorBase::emplace<FactorPixelHP>(feature_last, feature_last, lmk_hp, shared_from_this()); } else { @@ -339,17 +376,16 @@ void ProcessorBundleAdjustment::establishFactors() LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); //Create factor - FactorPixelHPPtr fac_ptr_last = std::make_shared<FactorPixelHP>(feature_last, lmk_hp, shared_from_this()); - if (fac_ptr_last != nullptr) // factor links - { - feature_last->addFactor(fac_ptr_last); - fac_ptr_last->link(feature_last); - lmk->addConstrainedBy(fac_ptr_last); - } + FactorBase::emplace<FactorPixelHP>(feature_last, feature_last, lmk_hp, shared_from_this()); } } } +void ProcessorBundleAdjustment::setParams(const ProcessorParamsBundleAdjustmentPtr _params) +{ + params_bundle_adjustment_ = _params; +} + ProcessorBasePtr ProcessorBundleAdjustment::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr _sensor_ptr) -- GitLab From 3c7d08cecf1947fb76d989498b69e6e940c11d9e Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:47:43 +0200 Subject: [PATCH 37/58] fix int type --- src/yaml/processor_tracker_feature_trifocal_yaml.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yaml/processor_tracker_feature_trifocal_yaml.cpp b/src/yaml/processor_tracker_feature_trifocal_yaml.cpp index a6619c704..9257e0373 100644 --- a/src/yaml/processor_tracker_feature_trifocal_yaml.cpp +++ b/src/yaml/processor_tracker_feature_trifocal_yaml.cpp @@ -46,7 +46,7 @@ static ProcessorParamsBasePtr createProcessorParamsTrackerFeatureTrifocal(const params->time_tolerance = algorithm["time tolerance"] .as<Scalar>(); params->voting_active = algorithm["voting active"] .as<bool>(); params->min_features_for_keyframe = algorithm["minimum features for keyframe"] .as<unsigned int>(); - params->max_new_features = algorithm["maximum new features"] .as<unsigned int>(); + params->max_new_features = algorithm["maximum new features"] .as<int>(); params->n_cells_h = algorithm["grid horiz cells"] .as<int>(); params->n_cells_v = algorithm["grid vert cells"] .as<int>(); params->min_response_new_feature = algorithm["min response new features"] .as<int>(); -- GitLab From e00aa392aef5c4f2602a686f74165fa143a06112 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:48:10 +0200 Subject: [PATCH 38/58] use correction model 1 unit larger than distortion model --- src/sensor/sensor_camera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp index 39386d4d2..44b7fa6b0 100644 --- a/src/sensor/sensor_camera.cpp +++ b/src/sensor/sensor_camera.cpp @@ -13,7 +13,7 @@ SensorCamera::SensorCamera(const Eigen::VectorXs& _extrinsics, const IntrinsicsC img_width_(_intrinsics.width), // img_height_(_intrinsics.height), // distortion_(_intrinsics.distortion), // - correction_(distortion_.size()==0 ? 0 : distortion_.size()), // make correction vector slightly larger in size than the distortion vector + correction_(distortion_.size()==0 ? 0 : distortion_.size() + 1), // make correction vector slightly larger in size than the distortion vector pinhole_model_raw_(_intrinsics.pinhole_model_raw), // pinhole_model_rectified_(_intrinsics.pinhole_model_rectified), // using_raw_(true) -- GitLab From a6dcb6967b077f3748916bbbe9a2a9922ff24d6e Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:48:39 +0200 Subject: [PATCH 39/58] Add test for complete BA --- test/gtest_factor_pixelHP.cpp | 261 +++++++++++++++++++++++++++++++--- 1 file changed, 243 insertions(+), 18 deletions(-) diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index 59647ad9f..318226812 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -20,7 +20,7 @@ using namespace wolf; using namespace Eigen; -std::string wolf_root = _WOLF_VISION_ROOT_DIR; +std::string wolf_vision_root = _WOLF_VISION_ROOT_DIR; class FactorPixelHPTest : public testing::Test{ @@ -35,23 +35,26 @@ class FactorPixelHPTest : public testing::Test{ ProblemPtr problem; CeresManagerPtr ceres_manager; + SensorCameraPtr camera; ProcessorBundleAdjustmentPtr proc_bundle_adjustment; SensorBasePtr S; FrameBasePtr F1, F2, F3; CaptureImagePtr I1, I2, I3; - FeaturePointImagePtr f1, f2, f3; + FeaturePointImagePtr f11, f21, f31; FeaturePointImagePtr f12, f13, f14; + FeaturePointImagePtr f22, f23, f24; + FeaturePointImagePtr f32, f33, f34; LandmarkHPPtr L1; //only one landmark L1 is initialized LandmarkHPPtr L2; LandmarkHPPtr L3; LandmarkHPPtr L4; - FactorPixelHPPtr c1, c12, c13, c14; - FactorPixelHPPtr c2; - FactorPixelHPPtr c3; + FactorPixelHPPtr c11, c12, c13, c14; + FactorPixelHPPtr c21, c22, c23, c24; + FactorPixelHPPtr c31, c32, c33, c34; Scalar pixel_noise_std; @@ -146,8 +149,11 @@ class FactorPixelHPTest : public testing::Test{ // Build problem problem = Problem::create("PO", 3); ceres::Solver::Options options; + options.function_tolerance = 1e-6; + options.max_num_iterations = 200; ceres_manager = std::make_shared<CeresManager>(problem, options); + // Install sensor and processor IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); intr->pinhole_model_raw = Eigen::Vector4s(320,240,320,320); @@ -179,15 +185,15 @@ class FactorPixelHPTest : public testing::Test{ F1 = problem->emplaceFrame(KEY, pose1, 1.0); I1 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F1, 1.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1))); - f1 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp, 0, des, pix_cov)); // pixel at origin + f11 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp, 0, des, pix_cov)); // pixel at origin F2 = problem->emplaceFrame(KEY, pose2, 2.0); I2 = std::static_pointer_cast<CaptureImage>((CaptureBase::emplace<CaptureImage>(F2, 2.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1)))); - f2 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp, 0, des, pix_cov)); // pixel at origin + f21 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp, 0, des, pix_cov)); // pixel at origin F3 = problem->emplaceFrame(KEY, pose3, 3.0); I3 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F3, 3.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1))); - f3 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp, 0, des, pix_cov)); // pixel at origin + f31 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp, 0, des, pix_cov)); // pixel at origin //create Landmark -- with f1, f2 or f3 //LandmarkBasePtr lmk = proc_bundle_adjustment->createLandmark(f1); @@ -196,9 +202,9 @@ class FactorPixelHPTest : public testing::Test{ // lmk->link(problem->getMap()); // factors - c1 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f1, f1, L1, nullptr /*proc*/)); - c2 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f2, f2, L1, nullptr /*proc*/)); - c3 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f3, f3, L1, nullptr /*proc*/)); + c11 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f11, f11, L1, nullptr /*proc*/)); + c21 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f21, f21, L1, nullptr /*proc*/)); + c31 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f31, f31, L1, nullptr /*proc*/)); } }; @@ -218,7 +224,7 @@ TEST(ProcessorFactorPixelHP, testZeroResidual) // Install processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -341,9 +347,9 @@ TEST_F(FactorPixelHPTest, testSolveFramePosition2ObservableDoF) // Frame must be in the X axis, so Y=0 and Z=0 ASSERT_MATRIX_APPROX(F1->getP()->getState().tail(2), orig.tail(2), 1e-6); - Eigen::VectorXs expect = c1->expectation(); - ASSERT_FLOAT_EQ(expect(0,0),f1->getMeasurement()(0,0)); - ASSERT_FLOAT_EQ(expect(1,0),f1->getMeasurement()(1,0)); + Eigen::VectorXs expect = c11->expectation(); + ASSERT_FLOAT_EQ(expect(0,0),f11->getMeasurement()(0,0)); + ASSERT_FLOAT_EQ(expect(1,0),f11->getMeasurement()(1,0)); } @@ -430,15 +436,234 @@ TEST_F(FactorPixelHPTest, testSolveFramePosition) // This test checks 3 DoF (3DoF are observable). ASSERT_MATRIX_APPROX(F1->getP()->getState(), orig, 1e-6); - Eigen::VectorXs expect = c1->expectation(); - ASSERT_FLOAT_EQ(expect(0,0),f1->getMeasurement()(0,0)); - ASSERT_FLOAT_EQ(expect(1,0),f1->getMeasurement()(1,0)); + Eigen::VectorXs expect = c11->expectation(); + ASSERT_FLOAT_EQ(expect(0,0),f11->getMeasurement()(0,0)); + ASSERT_FLOAT_EQ(expect(1,0),f11->getMeasurement()(1,0)); +} + + +TEST_F(FactorPixelHPTest, testSolveBundleAdjustment) +{ + //landmark homogeneous coordinates in world reference + lmkHP2 << 0.5, 0.5, 0.5, 1; + lmkHP3 << -0.5, 0.75, 0.5, 1; + lmkHP4 << 0.5, 0, -0.5, 1; + + //landmarks to camera coordinates + Transform<Scalar,3,Isometry> T_w_r + = Translation<Scalar,3>(F1->getP()->getState()) + * Quaternions(F1->getO()->getState().data()); + Transform<Scalar,3,Isometry> T_r_c + = Translation<Scalar,3>(I1->getSensorP()->getState()) + * Quaternions(I1->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 4, 1> lmkHP2_c = T_r_c.inverse() * T_w_r.inverse() * lmkHP2; + Eigen::Matrix<Scalar, 4, 1> lmkHP3_c = T_r_c.inverse() * T_w_r.inverse() * lmkHP3; + Eigen::Matrix<Scalar, 4, 1> lmkHP4_c = T_r_c.inverse() * T_w_r.inverse() * lmkHP4; + + //landmark point in camera coord + Vector3s lmk_point_2_c = lmkHP2_c.head<3>()/lmkHP2_c(3); + Vector3s lmk_point_3_c = lmkHP3_c.head<3>()/lmkHP3_c(3); + Vector3s lmk_point_4_c = lmkHP4_c.head<3>()/lmkHP4_c(3); + + //landmarks to camera coordinates + Transform<Scalar,3,Isometry> T_w_r2 + = Translation<Scalar,3>(F2->getP()->getState()) + * Quaternions(F2->getO()->getState().data()); + Transform<Scalar,3,Isometry> T_r_c2 + = Translation<Scalar,3>(I2->getSensorP()->getState()) + * Quaternions(I2->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 4, 1> lmkHP2_c2 = T_r_c2.inverse() * T_w_r2.inverse() * lmkHP2; + Eigen::Matrix<Scalar, 4, 1> lmkHP3_c2 = T_r_c2.inverse() * T_w_r2.inverse() * lmkHP3; + Eigen::Matrix<Scalar, 4, 1> lmkHP4_c2 = T_r_c2.inverse() * T_w_r2.inverse() * lmkHP4; + + //landmark point in camera coord + Vector3s lmk_point_2_c2 = lmkHP2_c2.head<3>()/lmkHP2_c2(3); + Vector3s lmk_point_3_c2 = lmkHP3_c2.head<3>()/lmkHP3_c2(3); + Vector3s lmk_point_4_c2 = lmkHP4_c2.head<3>()/lmkHP4_c2(3); + + //landmarks to camera coordinates + Transform<Scalar,3,Isometry> T_w_r3 + = Translation<Scalar,3>(F3->getP()->getState()) + * Quaternions(F3->getO()->getState().data()); + Transform<Scalar,3,Isometry> T_r_c3 + = Translation<Scalar,3>(I3->getSensorP()->getState()) + * Quaternions(I3->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 4, 1> lmkHP2_c3 = T_r_c3.inverse() * T_w_r3.inverse() * lmkHP2; + Eigen::Matrix<Scalar, 4, 1> lmkHP3_c3 = T_r_c3.inverse() * T_w_r3.inverse() * lmkHP3; + Eigen::Matrix<Scalar, 4, 1> lmkHP4_c3 = T_r_c3.inverse() * T_w_r3.inverse() * lmkHP4; + + //landmark point in camera coord + Vector3s lmk_point_2_c3 = lmkHP2_c3.head<3>()/lmkHP2_c3(3); + Vector3s lmk_point_3_c3 = lmkHP3_c3.head<3>()/lmkHP3_c3(3); + Vector3s lmk_point_4_c3 = lmkHP4_c3.head<3>()/lmkHP4_c3(3); + + //points projected to image plane + Vector2s point2 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_2_c); + Vector2s point3 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_3_c); + Vector2s point4 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_4_c); + cv::KeyPoint kp12 = cv::KeyPoint(cv::Point2f(point2(0),point2(1)), 32.0f); + cv::KeyPoint kp13 = cv::KeyPoint(cv::Point2f(point3(0),point3(1)), 32.0f); + cv::KeyPoint kp14 = cv::KeyPoint(cv::Point2f(point4(0),point4(1)), 32.0f); + + Vector2s point22 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_2_c2); + Vector2s point23 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_3_c2); + Vector2s point24 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_4_c2); + cv::KeyPoint kp22 = cv::KeyPoint(cv::Point2f(point22(0),point22(1)), 32.0f); + cv::KeyPoint kp23 = cv::KeyPoint(cv::Point2f(point23(0),point23(1)), 32.0f); + cv::KeyPoint kp24 = cv::KeyPoint(cv::Point2f(point24(0),point24(1)), 32.0f); + + Vector2s point32 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_2_c3); + Vector2s point33 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_3_c3); + Vector2s point34 = pinhole::projectPoint(camera->getIntrinsic()->getState(), camera->getDistortionVector(), lmk_point_4_c3); + cv::KeyPoint kp32 = cv::KeyPoint(cv::Point2f(point32(0),point32(1)), 32.0f); + cv::KeyPoint kp33 = cv::KeyPoint(cv::Point2f(point33(0),point33(1)), 32.0f); + cv::KeyPoint kp34 = cv::KeyPoint(cv::Point2f(point34(0),point34(1)), 32.0f); + + cv::Mat des = cv::Mat::zeros(1,8, CV_8UC1); + pixel_noise_std = 1.0; //params->pixel_noise_std; + Vector2s pix(0,0); + Matrix2s pix_cov(Matrix2s::Identity() * pow(pixel_noise_std, 2)); + + //create features + f12 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp12, 0, des, pix_cov)); + f13 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp13, 0, des, pix_cov)); + f14 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp14, 0, des, pix_cov)); + + f22 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp22, 0, des, pix_cov)); + f23 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp23, 0, des, pix_cov)); + f24 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp24, 0, des, pix_cov)); + + f32 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp32, 0, des, pix_cov)); + f33 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp33, 0, des, pix_cov)); + f34 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp34, 0, des, pix_cov)); + + //create landmarks + L2 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP2, camera, des)); + L3 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP3, camera, des)); + L4 = std::static_pointer_cast<LandmarkHP>(LandmarkBase::emplace<LandmarkHP>(problem->getMap(),lmkHP4, camera, des)); + + //create factors + c12 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f12, f12, L2, nullptr /*proc*/)); + c13 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f13, f13, L3, nullptr /*proc*/)); + c14 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f14, f14, L4, nullptr /*proc*/)); + + c22 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f22, f22, L2, nullptr /*proc*/)); + c23 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f23, f23, L3, nullptr /*proc*/)); + c24 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f24, f24, L4, nullptr /*proc*/)); + + c32 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f32, f32, L2, nullptr /*proc*/)); + c33 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f33, f33, L3, nullptr /*proc*/)); + c34 = std::static_pointer_cast<FactorPixelHP>(FactorBase::emplace<FactorPixelHP>(f34, f34, L4, nullptr /*proc*/)); + + ASSERT_TRUE(problem->check()); + +// S->fix(); + F1->fix(); +// F2->fix(); +// F3->fix(); + L1->fix(); +// L2->fix(); +// L3->fix(); +// L4->fix(); + + auto p1 = F1->getP()->getState(); + auto p2 = F2->getP()->getState(); + auto p3 = F3->getP()->getState(); + auto q1 = F1->getO()->getState(); + auto q2 = F2->getO()->getState(); + auto q3 = F3->getO()->getState(); + auto l1 = L1->getP()->getState(); + auto l2 = L2->getP()->getState(); + auto l3 = L3->getP()->getState(); + auto l4 = L4->getP()->getState(); + + + std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); + std::cout << report << std::endl; + + // + ASSERT_MATRIX_APPROX(c11->expectation(), f11->getMeasurement(), 0.1); // 0.1 pixel error allowed + ASSERT_MATRIX_APPROX(c12->expectation(), f12->getMeasurement(), 0.1); + ASSERT_MATRIX_APPROX(c13->expectation(), f13->getMeasurement(), 0.1); + ASSERT_MATRIX_APPROX(c14->expectation(), f14->getMeasurement(), 0.1); + + ASSERT_MATRIX_APPROX(F1->getP()->getState(), p1, 1e-6); + ASSERT_MATRIX_APPROX(F2->getP()->getState(), p2, 1e-6); + ASSERT_MATRIX_APPROX(F3->getP()->getState(), p3, 1e-6); + ASSERT_MATRIX_APPROX(F1->getO()->getState(), q1, 1e-6); + ASSERT_MATRIX_APPROX(F2->getO()->getState(), q2, 1e-6); + ASSERT_MATRIX_APPROX(F3->getO()->getState(), q3, 1e-6); + + ASSERT_MATRIX_APPROX(L1->getP()->getState(), l1, 1e-6); + ASSERT_MATRIX_APPROX(L2->getP()->getState(), l2, 1e-6); + ASSERT_MATRIX_APPROX(L3->getP()->getState(), l3, 1e-6); + ASSERT_MATRIX_APPROX(L4->getP()->getState(), l4, 1e-6); + + // perturb states + + // sensor is not obvservable: comment all perturbations and unfixes + // S->getP()->fix(); + // S->getP()->unfix(); + // S->getP()->setState(S->getP()->getState() + 0.1*Vector3s::Random()); + // S->getO()->fix(); + // S->getO()->unfix(); + // S->getO()->setState((Quaternions(S->getO()->getState().data()) * exp_q(0.1*Vector3s::Random())).coeffs()); + + // kfs + for (auto kf : problem->getTrajectory()->getFrameList()) + { + if (kf == F1) continue; + + kf->getP()->setState(kf->getP()->getState() + 0.5*Vector3s::Random()); + kf->getO()->setState((Quaternions(kf->getO()->getState().data()) * exp_q(0.5*Vector3s::Random())).coeffs()); + } + + // lmks + for (auto lmk : problem->getMap()->getLandmarkList()) + { + if (lmk == L1) continue; + + lmk->getP()->setState(lmk->getP()->getState() + 0.5*Vector4s::Random()); + } + + // solve again + report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); + std::cout << report << std::endl; + + problem->print(1,0,1,0); + for (auto lmk : problem->getMap()->getLandmarkList()) + { + std::cout << "L" << lmk->id()<< ": " << std::static_pointer_cast<LandmarkHP>(lmk)->point().transpose() << std::endl; + } + + + // This test checks 3 DoF (3DoF are observable). + ASSERT_MATRIX_APPROX(F1->getP()->getState(), p1, 1e-6); + ASSERT_MATRIX_APPROX(F2->getP()->getState(), p2, 1e-6); + ASSERT_MATRIX_APPROX(F3->getP()->getState(), p3, 1e-6); + ASSERT_QUATERNION_APPROX(Quaternions(F1->getO()->getState().data()), Quaternions(q1.data()), 1e-6); + ASSERT_QUATERNION_APPROX(Quaternions(F2->getO()->getState().data()), Quaternions(q2.data()), 1e-6); + ASSERT_QUATERNION_APPROX(Quaternions(F3->getO()->getState().data()), Quaternions(q3.data()), 1e-6); + + ASSERT_MATRIX_APPROX(L1->point(), lmkHP1.head<3>()/lmkHP1(3), 1e-6); + ASSERT_MATRIX_APPROX(L2->point(), lmkHP2.head<3>()/lmkHP2(3), 1e-6); + ASSERT_MATRIX_APPROX(L3->point(), lmkHP3.head<3>()/lmkHP3(3), 1e-6); + ASSERT_MATRIX_APPROX(L4->point(), lmkHP4.head<3>()/lmkHP4(3), 1e-6); + + ASSERT_MATRIX_APPROX(c11->expectation(), f11->getMeasurement(), 0.1); // 0.1 pixel error allowed + ASSERT_MATRIX_APPROX(c12->expectation(), f12->getMeasurement(), 0.1); + ASSERT_MATRIX_APPROX(c13->expectation(), f13->getMeasurement(), 0.1); + ASSERT_MATRIX_APPROX(c14->expectation(), f14->getMeasurement(), 0.1); + + } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); + ::testing::GTEST_FLAG(filter) = "FactorPixelHPTest.testSolveBundleAdjustment*"; + return RUN_ALL_TESTS(); } -- GitLab From ac08feeddd47e92f4f353c8900daf505bdd6eb63 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:49:26 +0200 Subject: [PATCH 40/58] Update test processor BA --- test/gtest_processor_bundle_adjustment.cpp | 94 ++++++++++++++++++---- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index c14d73d41..097a06063 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -20,7 +20,7 @@ using namespace wolf; -std::string wolf_root = _WOLF_VISION_ROOT_DIR; +std::string wolf_vision_root = _WOLF_VISION_ROOT_DIR; class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment { @@ -105,7 +105,7 @@ TEST(ProcessorBundleAdjustment, installProcessor) // Install processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -123,7 +123,7 @@ TEST(ProcessorBundleAdjustment, preProcess) // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -132,10 +132,10 @@ TEST(ProcessorBundleAdjustment, preProcess) auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); proc_dummy->setInc(image_inc_ptr); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); proc_dummy->setLast(image_last_ptr); // demo dpreProcess proc_dummy->preProcess(); @@ -150,7 +150,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -160,7 +160,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); // Put an image on last_ptr_ - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); ASSERT_NE(image_last_ptr->keypoints_.size(), 0); proc_dummy->setLast(image_last_ptr); @@ -169,7 +169,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) ASSERT_EQ(num, 0); // Put an image on incoming_ptr_ - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); proc_dummy->setInc(image_inc_ptr); // demo detectNewFeatures @@ -191,7 +191,7 @@ TEST(ProcessorBundleAdjustment, trackFeatures) // Create processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -200,9 +200,9 @@ TEST(ProcessorBundleAdjustment, trackFeatures) //fill feat_last list FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); - CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); + CaptureImagePtr image_last_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr, true); proc_dummy->setLast(image_last_ptr); - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", nullptr); proc_dummy->setInc(image_inc_ptr); proc_dummy->preProcess(); CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); @@ -234,7 +234,7 @@ TEST(ProcessorBundleAdjustment, createLandmark) // Install processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -282,7 +282,7 @@ TEST(ProcessorBundleAdjustment, process) // Install processor ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); params->delete_ambiguities = true; - params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; + params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; @@ -291,13 +291,13 @@ TEST(ProcessorBundleAdjustment, process) auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); //1ST TIME - CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); proc_dummy->process(image_inc_ptr); ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), 0); ASSERT_EQ(problem->getMap()->getLandmarkList().size(), 0); //2ND TIME - CaptureImagePtr image_inc_ptr2 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + CaptureImagePtr image_inc_ptr2 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); // proc_dummy->setInc(image_inc_ptr2); // proc_dummy->preProcess(); // proc_dummy->getProcessKnown(); @@ -308,7 +308,7 @@ TEST(ProcessorBundleAdjustment, process) ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); //3RD TIME -- RUNNING - CaptureImagePtr image_inc_ptr3 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + CaptureImagePtr image_inc_ptr3 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); assert(proc_dummy->getOrigin()!=nullptr); assert(proc_dummy->getLast()!= nullptr && proc_dummy->getLast()!=proc_dummy->getOrigin()); proc_dummy->process(image_inc_ptr3); @@ -316,7 +316,7 @@ TEST(ProcessorBundleAdjustment, process) ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); //4TH TIME -- RUNNING - CaptureImagePtr image_inc_ptr4 = proc_dummy->createCaptureImage(wolf_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); + CaptureImagePtr image_inc_ptr4 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); proc_dummy->process(image_inc_ptr4); ASSERT_EQ(image_inc_ptr4->getFeatureList().size(), params->max_new_features); @@ -333,6 +333,66 @@ TEST(ProcessorBundleAdjustment, processNew) std::cout << "EMPTY Test\n"; } +//TEST(ProcessorBundleAdjustment, processVideo) +//{ +// // Wolf problem +// ProblemPtr problem = Problem::create("PO", 3); +// +// // Install camera +// IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML +// intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); +// intr->width = 640; +// intr->height = 480; +// SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); +// +// // Install processor +// ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); +// params->delete_ambiguities = true; +// params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; +// params->pixel_noise_std = 1.0; +// params->min_track_length_for_factor = 3; +// params->voting_active = true; +// params->max_new_features = 400; +// params->min_features_for_keyframe = 50; +// auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); +// auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); +// +// //==================================vision_utils ============================================ +// vision_utils::SensorCameraPtr sen_ptr = std::make_shared<vision_utils::SensorCamera>(); +// sen_ptr->open("/home/ovendrell/eclipse-workspace/ddm_triad/data/video/VID4b.mp4"); //TODO: this should be a demo +// //"/home/ovendrell/dev/vision_utils/src/test/data/test_usb_cam.mp4"); +// +// unsigned int buffer_size = 10; +// vision_utils::Buffer<vision_utils::FramePtr> frame_buff(buffer_size); +// frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), 0) ); +// +// unsigned int img_width = frame_buff.back()->getImage().cols; +// unsigned int img_height = frame_buff.back()->getImage().rows; +// std::cout << "Image size: " << img_width << "x" << img_height << std::endl; +// //==================================vision_utils ============================================ +// +// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); +// camera->setImgWidth(img_width); +// camera->setImgHeight(img_height); +// ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); +// +// TimeStamp t = 0; +// // main loop +// Scalar dt = 0.04; +// for(int frame_count = 0; frame_count<150; ++frame_count) +// { +// t += dt; +// // Image --------------------------------------------- +// frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), frame_count) ); +// CaptureImagePtr image = std::make_shared<CaptureImage>(t, camera, frame_buff.back()->getImage()); +// /* process */ +// camera->process(image); +//// //Debug lines +//// std::cout << "FEATURES:" << image->getFeatureList().size() << std::endl; +//// std::cout << "MATCHES:" << image->matches_from_precedent_.size() << std::endl; +// } +//} + int main(int argc, char **argv) -- GitLab From e6a6e9fe80eb9f9b594cad2889b0a89325265c96 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 31 May 2019 13:59:40 +0200 Subject: [PATCH 41/58] Add opencv libs to demo BA --- demos/CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index 5b7c8ec27..42a4d3048 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -12,9 +12,7 @@ else(OpenCV_FOUND) message("[WARN] OpenCV support not installed. Minimum 2.4 version required.") endif(OpenCV_FOUND) - - ADD_EXECUTABLE(demo_processor_bundle_adjustment demo_processor_bundle_adjustment.cpp) -TARGET_LINK_LIBRARIES(demo_processor_bundle_adjustment ${PLUGIN_NAME}) +TARGET_LINK_LIBRARIES(demo_processor_bundle_adjustment ${PLUGIN_NAME} ${OpenCV_LIBS}) -- GitLab From 5c68270ffa10ced7858452394a89fbb9e33184fb Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Mon, 3 Jun 2019 10:44:32 +0200 Subject: [PATCH 42/58] Fix test processor BA (emplace related issue) --- test/gtest_processor_bundle_adjustment.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 097a06063..1be6eb24a 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -261,7 +261,6 @@ TEST(ProcessorBundleAdjustment, createLandmark) LandmarkBasePtr lmk = proc_bundle_adj->createLandmark(fea0); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); - problem_ptr->addLandmark(lmk_hp); ASSERT_EQ(problem_ptr->getMap()->getLandmarkList().size(), 1); } -- GitLab From c45703abab88dd1f552c5d19a42df0ab4526a37c Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Wed, 5 Jun 2019 10:12:12 +0200 Subject: [PATCH 43/58] Fix test processor BA --- test/gtest_processor_bundle_adjustment.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 1be6eb24a..41a92bb75 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -303,21 +303,22 @@ TEST(ProcessorBundleAdjustment, process) // proc_dummy->getProcessNew(params->max_new_features); // proc_dummy->establishFactors(); proc_dummy->process(image_inc_ptr2); - ASSERT_EQ(problem->getMap()->getLandmarkList().size(), params->max_new_features); - ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); + ASSERT_LE(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); + ASSERT_NE(problem->getMap(), nullptr); + ASSERT_EQ(problem->getMap()->getLandmarkList().empty(), true); + //3RD TIME -- RUNNING CaptureImagePtr image_inc_ptr3 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); assert(proc_dummy->getOrigin()!=nullptr); assert(proc_dummy->getLast()!= nullptr && proc_dummy->getLast()!=proc_dummy->getOrigin()); proc_dummy->process(image_inc_ptr3); - ASSERT_EQ(problem->getMap()->getLandmarkList().size(), params->max_new_features); - ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); + ASSERT_LE(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); //4TH TIME -- RUNNING CaptureImagePtr image_inc_ptr4 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); proc_dummy->process(image_inc_ptr4); - ASSERT_EQ(image_inc_ptr4->getFeatureList().size(), params->max_new_features); + ASSERT_LE(image_inc_ptr4->getFeatureList().size(), params->max_new_features); } -- GitLab From 45b1c903a1e724d6d71d8aa64598ac62d84cb766 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Thu, 6 Jun 2019 13:33:09 +0200 Subject: [PATCH 44/58] delete test processVideo from processor BA (should be a demo) --- test/gtest_processor_bundle_adjustment.cpp | 62 ---------------------- 1 file changed, 62 deletions(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 41a92bb75..36bb2de9f 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -333,68 +333,6 @@ TEST(ProcessorBundleAdjustment, processNew) std::cout << "EMPTY Test\n"; } -//TEST(ProcessorBundleAdjustment, processVideo) -//{ -// // Wolf problem -// ProblemPtr problem = Problem::create("PO", 3); -// -// // Install camera -// IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML -// intr->pinhole_model_raw = Eigen::Vector4s(0,0,1,1); -// intr->width = 640; -// intr->height = 480; -// SensorCameraPtr sens_cam = std::static_pointer_cast<SensorCamera>(problem->installSensor("CAMERA", "camera", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), intr)); -// -// // Install processor -// ProcessorParamsBundleAdjustmentPtr params = std::make_shared<ProcessorParamsBundleAdjustment>(); -// params->delete_ambiguities = true; -// params->yaml_file_params_vision_utils = wolf_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; -// params->pixel_noise_std = 1.0; -// params->min_track_length_for_factor = 3; -// params->voting_active = true; -// params->max_new_features = 400; -// params->min_features_for_keyframe = 50; -// auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); -// auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); -// -// //==================================vision_utils ============================================ -// vision_utils::SensorCameraPtr sen_ptr = std::make_shared<vision_utils::SensorCamera>(); -// sen_ptr->open("/home/ovendrell/eclipse-workspace/ddm_triad/data/video/VID4b.mp4"); //TODO: this should be a demo -// //"/home/ovendrell/dev/vision_utils/src/test/data/test_usb_cam.mp4"); -// -// unsigned int buffer_size = 10; -// vision_utils::Buffer<vision_utils::FramePtr> frame_buff(buffer_size); -// frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), 0) ); -// -// unsigned int img_width = frame_buff.back()->getImage().cols; -// unsigned int img_height = frame_buff.back()->getImage().rows; -// std::cout << "Image size: " << img_width << "x" << img_height << std::endl; -// //==================================vision_utils ============================================ -// -// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(sens_cam); -// camera->setImgWidth(img_width); -// camera->setImgHeight(img_height); -// ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); -// -// TimeStamp t = 0; -// // main loop -// Scalar dt = 0.04; -// for(int frame_count = 0; frame_count<150; ++frame_count) -// { -// t += dt; -// // Image --------------------------------------------- -// frame_buff.add( vision_utils::setFrame(sen_ptr->getImage(), frame_count) ); -// CaptureImagePtr image = std::make_shared<CaptureImage>(t, camera, frame_buff.back()->getImage()); -// /* process */ -// camera->process(image); -//// //Debug lines -//// std::cout << "FEATURES:" << image->getFeatureList().size() << std::endl; -//// std::cout << "MATCHES:" << image->matches_from_precedent_.size() << std::endl; -// } -//} - - - int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); -- GitLab From 0da12f418c72da8f7db01e8916019cc53f843c60 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Thu, 6 Jun 2019 13:34:50 +0200 Subject: [PATCH 45/58] resize processor BA debug view --- src/processor/processor_bundle_adjustment.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index cd5ce5347..bee5cf4b9 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -166,7 +166,8 @@ void ProcessorBundleAdjustment::postProcess() cv::circle(image_debug_, point, 3, cv::Scalar(0,0,255) , 1 , 8); } } - + cv::namedWindow("DEBUG VIEW", cv::WINDOW_NORMAL); + cv::resizeWindow("DEBUG VIEW", 800,600); cv::imshow("DEBUG VIEW", image_debug_); cv::waitKey(1); } -- GitLab From c66408563a9ab9d030fba0d52de1518fc44f0791 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Thu, 6 Jun 2019 13:38:51 +0200 Subject: [PATCH 46/58] Add function isInlier to processor BA --- .../vision/processor/processor_bundle_adjustment.h | 1 + src/processor/processor_bundle_adjustment.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index c13f4cad3..54909e09c 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -118,6 +118,7 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature */ virtual bool voteForKeyFrame() override; + bool isInlier(const cv::KeyPoint& _kp_incoming, const cv::KeyPoint& _kp_last); bool is_tracked(int& kp_idx_); /** \brief Detect new Features diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index bee5cf4b9..6afce4b00 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -206,6 +206,19 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& return _features_incoming_out.size(); } +bool ProcessorBundleAdjustment::isInlier(const cv::KeyPoint& _kp_last, const cv::KeyPoint& _kp_incoming) +{ + // List of conditions + bool inlier = true; + + // A. Check euclidean norm + inlier = inlier && (cv::norm(_kp_incoming.pt-_kp_last.pt) < mat_ptr_->getParams()->max_match_euclidean_dist); + + // B. add your new condition test here + // inlier = inlier && ... + + return inlier; +} bool ProcessorBundleAdjustment::is_tracked(int& _kp_idx) { -- GitLab From b684f83778eff7395a54b5c48412cb66fe293eb7 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 7 Jun 2019 14:17:09 +0200 Subject: [PATCH 47/58] Add grid features to processor BA --- .../processor/processor_bundle_adjustment.h | 33 ++- src/processor/processor_bundle_adjustment.cpp | 197 +++++++++++++----- test/gtest_processor_bundle_adjustment.cpp | 17 +- 3 files changed, 192 insertions(+), 55 deletions(-) diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index 54909e09c..56210ccd7 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -28,12 +28,18 @@ WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsBundleAdjustment); struct ProcessorParamsBundleAdjustment : public ProcessorParamsTrackerFeature { - std::string yaml_file_params_vision_utils; + std::string yaml_file_params_vision_utils; - bool delete_ambiguities; + bool delete_ambiguities; - Scalar pixel_noise_std; ///< std noise of the pixel - int min_track_length_for_factor; ///< Minimum track length of a matched feature to create a factor + int n_cells_h; + int n_cells_v; + int min_response_new_feature; + + Scalar pixel_noise_std; ///< std noise of the pixel + int min_track_length_for_factor; ///< Minimum track length of a matched feature to create a factor + + ProcessorParamsBundleAdjustment() = default; }; @@ -165,6 +171,15 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature * \brief Return Image for debug purposes */ cv::Mat getImageDebug(); + + /** + * \brief Return list of Features tracked in a Capture + */ + std::list<FeatureBasePtr> trackedFeatures(const CaptureBasePtr& _capture_ptr); + /** + * \brief Return list of Landmarks + */ + std::list<LandmarkBasePtr> currentLandmarks(); }; inline cv::Mat ProcessorBundleAdjustment::getImageDebug() @@ -172,6 +187,16 @@ inline cv::Mat ProcessorBundleAdjustment::getImageDebug() return image_debug_; } +inline std::list<FeatureBasePtr> ProcessorBundleAdjustment::trackedFeatures(const CaptureBasePtr& _capture_ptr) +{ + return track_matrix_.snapshotAsList(_capture_ptr); +} + +inline std::list<LandmarkBasePtr> ProcessorBundleAdjustment::currentLandmarks() +{ + return getProblem()->getMap()->getLandmarkList(); +} + } //namespace wolf #endif /* INCLUDE_BASE_PROCESSOR_PROCESSOR_BUNDLE_ADJUSTMENT_H_ */ diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 6afce4b00..5c0589c26 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -55,9 +55,23 @@ void ProcessorBundleAdjustment::preProcess() capture_image_incoming_ = std::static_pointer_cast<CaptureImage>(incoming_ptr_); // Detect KeyPoints capture_image_incoming_->keypoints_ = det_ptr_->detect(capture_image_incoming_->getImage()); + + //Sort keypoints by response if needed + if (!capture_image_incoming_->keypoints_.empty()) + vision_utils::sortByResponse(capture_image_incoming_->keypoints_, CV_SORT_DESCENDING); + // Compute Descriptors capture_image_incoming_->descriptors_ = des_ptr_->getDescriptor(capture_image_incoming_->getImage(), capture_image_incoming_->keypoints_); + std::cout << "before fill grid " << std::endl; + + // Create and fill incoming grid + capture_image_incoming_->grid_features_ = std::make_shared<vision_utils::FeatureIdxGrid>(capture_image_incoming_->getImage().rows, capture_image_incoming_->getImage().cols, params_bundle_adjustment_->n_cells_v, params_bundle_adjustment_->n_cells_h); + + capture_image_incoming_->grid_features_->insert(capture_image_incoming_->keypoints_); + + std::cout << "after fill grid done " << std::endl; + if (last_ptr_ != nullptr) { @@ -90,7 +104,20 @@ void ProcessorBundleAdjustment::preProcess() capture_image_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming } + +// cv::Mat img_mat = cv::Mat(capture_image_incoming_->getImage().rows, capture_image_incoming_->getImage().cols, capture_image_incoming_->getImage().type()); +// +// cv::drawMatches(capture_image_incoming_->getImage(), capture_image_incoming_->getKeypoints(), +// capture_image_last_->getImage(), capture_image_last_->getKeypoints(), +// capture_image_incoming_->matches_from_precedent_, img_mat); +// +// cv::namedWindow("MATCHES VIEW", cv::WINDOW_NORMAL); +// cv::resizeWindow("MATCHES VIEW", 800,600); +// cv::imshow("MATCHES VIEW", img_mat); } + + std::cout << "preProcess() done " << std::endl; + } void ProcessorBundleAdjustment::postProcess() @@ -122,26 +149,28 @@ void ProcessorBundleAdjustment::postProcess() // DEBUG image_debug_ = vision_utils::buildImageProcessed((std::static_pointer_cast<CaptureImage>(last_ptr_))->getImage(), kp_enh_tracks); -// typedef std::map<size_t, LandmarkBasePtr>::iterator iter; -// for(iter it = lmk_track_map_.begin(); it != lmk_track_map_.end(); ++it) -// { -// Vector3s point3D = std::static_pointer_cast<LandmarkHP>(it->second)->point(); -// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); -// Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D); -// cv::Point point = cv::Point(point2D(0), point2D(1)); -// cv::circle(image_debug_, point, 1, cv::Scalar(0,0,255) , 1 , 8); -// } - -// for (auto const & feat_base : last_ptr_->getFeatureList()) -// { -// FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); -// unsigned int track_id = feat->trackId(); -// Vector3s point3D = std::static_pointer_cast<LandmarkHP>(lmk_track_map_[track_id])->point(); -// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); -// Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D); -// cv::Point point = cv::Point(point2D(0), point2D(1)); -// cv::circle(image_debug_, point, 1, cv::Scalar(0,0,255) , 1 , 8); -// } + Snapshot snapshot_last = track_matrix_.snapshot(last_ptr_); +// getProblem()->print(4,1,1,0); + for (auto pair : track_matrix_.snapshot(origin_ptr_)) + { + if (snapshot_last.count(pair.first)==0) + { + if (!(pair.second->getFactorList()).empty()) + { + auto factor = pair.second->getFactorList().front(); + if (factor) + { + auto lmk = factor->getLandmarkOther(); + if (lmk) + { +// lmk->remove(); +// track_matrix_.remove(pair.second->trackId()); + } + } + } + } + } + getProblem()->print(4,1,1,0); list<FeatureBasePtr> snapshot = track_matrix_.snapshotAsList(last_ptr_); for (auto const & feat_base : snapshot) @@ -187,18 +216,25 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& { // Get kp incoming and keypoint last cv::KeyPoint kp_inc = capture_image_incoming_->keypoints_.at(index_inc); - //cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(feat_last_->getIndexKeyPoint()); +// cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(feat_last->getIndexKeyPoint()); - FeaturePointImagePtr feat_inc = std::make_shared<FeaturePointImage>(kp_inc, index_inc, - capture_image_incoming_->descriptors_.row(index_inc), - pixel_cov_); +// if (isInlier(kp_last, kp_inc)) +// { + FeaturePointImagePtr feat_inc = std::make_shared<FeaturePointImage>(kp_inc, index_inc, + capture_image_incoming_->descriptors_.row(index_inc), + pixel_cov_); - _features_incoming_out.push_back(feat_inc); + _features_incoming_out.push_back(feat_inc); - auto feature_match_ptr = std::make_shared<FeatureMatch>(); - feature_match_ptr->feature_ptr_= feat_last; - feature_match_ptr->normalized_score_ = 1.0;//capture_image_incoming_->matches_normalized_scores_.at(index_inc); - _feature_correspondences[feat_inc] = feature_match_ptr; + auto feature_match_ptr = std::make_shared<FeatureMatch>(); + feature_match_ptr->feature_ptr_= feat_last; + feature_match_ptr->normalized_score_ = 1.0;//capture_image_incoming_->matches_normalized_scores_.at(index_inc); + _feature_correspondences[feat_inc] = feature_match_ptr; + + + // hit cell to acknowledge there's a tracked point in that cell + capture_image_incoming_->grid_features_->hitTrackingCell(kp_inc); +// } } } } @@ -238,27 +274,81 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe { //TODO: efficient implementation? - typedef std::map<int,int>::iterator iter; - - for (iter it = capture_image_last_->map_index_to_next_.begin(); it!=capture_image_last_->map_index_to_next_.end(); ++it) - { - if (_features_last_out.size() >= _max_new_features) - break; - - else if(!is_tracked(it->second)) - { - //add to _features_last_out - int idx_last = it->first; - cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(idx_last); - FeaturePointImagePtr feat_last_ = std::make_shared<FeaturePointImage>(kp_last, idx_last, - capture_image_last_->descriptors_.row(idx_last), - pixel_cov_); - _features_last_out.push_back(feat_last_); - - } - } - - return _features_last_out.size(); +////Simpler method to detect new features without using Grid Features form vision_utils +// typedef std::map<int,int>::iterator iter; +// +// for (iter it = capture_image_last_->map_index_to_next_.begin(); it!=capture_image_last_->map_index_to_next_.end(); ++it) +// { +// if (_features_last_out.size() >= _max_new_features) +// break; +// +// else if(!is_tracked(it->second)) +// { +// //add to _features_last_out +// int idx_last = it->first; +// cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(idx_last); +// FeaturePointImagePtr feat_last_ = std::make_shared<FeaturePointImage>(kp_last, idx_last, +// capture_image_last_->descriptors_.row(idx_last), +// pixel_cov_); +// _features_last_out.push_back(feat_last_); +// +// } +// } +// +// return _features_last_out.size(); + + for (unsigned int n_iterations = 0; _max_new_features == -1 || n_iterations < _max_new_features; ++n_iterations) + { + Eigen::Vector2i cell_last; + assert(capture_image_last_->grid_features_!=nullptr); + if (capture_image_last_->grid_features_->pickEmptyTrackingCell(cell_last)) + { + // Get best keypoint in cell + vision_utils::FeatureIdxMap cell_feat_map = capture_image_last_->grid_features_->getFeatureIdxMap(cell_last(0), cell_last(1), params_bundle_adjustment_->min_response_new_feature); + bool found_feature_in_cell = false; + + for (auto target_last_pair_response_idx : cell_feat_map) + { + // Get KeyPoint in last + unsigned int index_last = target_last_pair_response_idx.second; + cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(index_last); + assert(target_last_pair_response_idx.first == kp_last.response && "[ProcessorTrackerFeatureTrifocal::detectNewFeatures]: response mismatch."); + + // Check if there is match with incoming, if not we do not want it + if (capture_image_last_->map_index_to_next_.count(index_last)) + { + // matching keypoint in incoming +// unsigned int index_incoming = capture_image_last_->map_index_to_next_[index_last]; +// cv::KeyPoint kp_incoming = capture_image_incoming_->keypoints_.at(index_incoming); + + // validate match with extra tests +// if (isInlier( kp_incoming, kp_last)) +// { + // Create WOLF feature + FeaturePointImagePtr ftr_point_last = std::make_shared<FeaturePointImage>( + kp_last, + index_last, + capture_image_last_->descriptors_.row(index_last), + pixel_cov_); + + _features_last_out.push_back(ftr_point_last); + + // hit cell to acknowledge there's a tracked point in that cell + capture_image_last_->grid_features_->hitTrackingCell(kp_last); + + found_feature_in_cell = true; + + break; // Good kp found for this grid. +// } + } + } + if (!found_feature_in_cell) + capture_image_last_->grid_features_->blockTrackingCell(cell_last); + } + else + break; // There are no empty cells + } + return _features_last_out.size(); } @@ -294,6 +384,8 @@ bool ProcessorBundleAdjustment::voteForKeyFrame() // WOLF_TRACE("VOTE DOWN"); // if (vote_time) // WOLF_TRACE("VOTE TIME"); + if (vote_down) + WOLF_INFO("Creating KF. Number of features: ", incoming_ptr_->getFeatureList().size()); return vote_up || vote_down || vote_time; } @@ -345,6 +437,9 @@ LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _featur //vec_homogeneous_w = vec_homogeneous; LandmarkBasePtr lmk_hp_ptr = LandmarkBase::emplace<LandmarkHP>(getProblem()->getMap(), vec_homogeneous_w, getSensor(), feat_point_image_ptr->getDescriptor()); + +// std::cout << "LANDMARKS CREATED AND ADDED to MAP: " << getProblem()->getMap()->getLandmarkList().size() << std::endl; + _feature_ptr->setLandmarkId(lmk_hp_ptr->id()); return lmk_hp_ptr; } @@ -361,6 +456,8 @@ void ProcessorBundleAdjustment::establishFactors() for (auto const & pair_trkid_pair : matches_origin_inc) { size_t trkid = pair_trkid_pair.first; + if (track_matrix_.trackSize(trkid)<params_bundle_adjustment_->min_track_length_for_factor) + continue; FeatureBasePtr feature_origin = pair_trkid_pair.second.first; FeatureBasePtr feature_last = pair_trkid_pair.second.second; diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 36bb2de9f..27031c3ec 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -78,6 +78,9 @@ class ProcessorBundleAdjustmentDummy : public ProcessorBundleAdjustment im->keypoints_ = det_ptr_->detect(im->getImage()); // Compute Descriptors im->descriptors_ = des_ptr_->getDescriptor(im->getImage(), im->keypoints_); + // Create and fill incoming grid + im->grid_features_ = std::make_shared<vision_utils::FeatureIdxGrid>(im->getImage().rows, im->getImage().cols, params_bundle_adjustment_->n_cells_v, params_bundle_adjustment_->n_cells_h); + im->grid_features_->insert(im->keypoints_); } return im; } @@ -128,6 +131,9 @@ TEST(ProcessorBundleAdjustment, preProcess) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; + params->n_cells_h = 50; + params-> n_cells_v = 50; + params->min_response_new_feature = 50; auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); @@ -155,6 +161,9 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; + params->n_cells_h = 20; + params-> n_cells_v = 15; + params->min_response_new_feature = 0; auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); FeatureBasePtrList feat_list = std::list<FeatureBasePtr>(); @@ -183,7 +192,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) // demo detectNewFeatures unsigned int num3 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); - ASSERT_EQ(num3, params->max_new_features); + ASSERT_LE(num3, params->max_new_features); } TEST(ProcessorBundleAdjustment, trackFeatures) @@ -196,6 +205,9 @@ TEST(ProcessorBundleAdjustment, trackFeatures) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; + params->n_cells_h = 50; + params-> n_cells_v = 50; + params->min_response_new_feature = 50; auto proc_dummy = std::make_shared<ProcessorBundleAdjustmentDummy>(params); //fill feat_last list @@ -286,6 +298,9 @@ TEST(ProcessorBundleAdjustment, process) params->min_track_length_for_factor = 3; params->voting_active = true; params->max_new_features = 5; + params->n_cells_h = 50; + params-> n_cells_v = 50; + params->min_response_new_feature = 50; auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); auto proc_dummy = std::static_pointer_cast<ProcessorBundleAdjustmentDummy>(proc); -- GitLab From 9d3a326e36dc23da31f80621114da6643e0939f0 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 7 Jun 2019 14:17:28 +0200 Subject: [PATCH 48/58] Update demo processor BA --- demos/demo_processor_bundle_adjustment.cpp | 100 +++------------------ 1 file changed, 10 insertions(+), 90 deletions(-) diff --git a/demos/demo_processor_bundle_adjustment.cpp b/demos/demo_processor_bundle_adjustment.cpp index 6ef81f47e..09b8c4ce4 100644 --- a/demos/demo_processor_bundle_adjustment.cpp +++ b/demos/demo_processor_bundle_adjustment.cpp @@ -84,92 +84,6 @@ int main(int argc, char** argv) { std::cout << std::endl << "==================== processor bundle adjustment test ======================" << std::endl; -// std::cout << "______________________________Get image from driver_________________________" << std::endl; -// // Sensor or sensor recording -// -// int num_cams = 1; -// -// // Get own path -// std::string argv_str(argv[0]); -// -// std::cout << argv[0] << "\n"; -// -// std::string pbase = argv_str.substr(0, argv_str.find_last_of("/")); -// std::string paramspath = pbase + "/../demos/demo_processor_bundle_adjustment_params.xml"; -// -// std::cout << paramspath << "\n"; -// -// std::cout << std::endl; -// std::cout << "******************************" << std::endl; -// std::cout << "* ---- mvBlueFOX3 ---- *" << std::endl; -// std::cout << "******************************" << std::endl; -// std::cout << std::endl; -// std::cout << "Please, choose the device to test from the following list:" << std::endl; -// std::cout << std::endl; -// -// std::vector<std::string> serial; -// serial.resize(num_cams); -// serial[0] = GetSerialFromUser(); -// -// std::vector<std::string> window_name; -// window_name.resize(num_cams); -// window_name[0] = serial[0]; -// -// -// mvIMPACT::acquire::DeviceManager devMgr_; // Device Manager. -// std::vector<CMvbluefox3::CMvbluefox3*> cam_ptr; // Device. -// -// try { -// cam_ptr.resize(num_cams); -// for (int ii = 0; ii < num_cams; ++ii) -// { -// cam_ptr[ii] = NULL; -// -// if( !serial[ii].empty() ) -// { -// std::cout << "Trying to open device with serial: " << serial[ii] << std::endl; -// -// if (devMgr_.getDeviceBySerial(serial[ii]) == 0) -// std::cout << "No device found! Unable to continue. " << std::endl; -// else -// cam_ptr[ii] = new CMvbluefox3::CMvbluefox3(devMgr_.getDeviceBySerial(serial[ii]),paramspath); -// } -// else -// std::cout << "Device cannot be found because serial number is not specified." << std::endl; -// } -// -//// std::cout << "Acquiring images." << std::endl << ">WARNING: depending on OpenCV compilation flags, visualization might experience hard delays (e.g. if \"init done\" appears in the following line)" << std::endl; -// for (int ii = 0; ii < num_cams; ++ii) -// cv::namedWindow( window_name[ii], cv::WINDOW_NORMAL ); -// -// while (true) -// { -// for (int ii = 0; ii < num_cams; ++ii) -// { -// cv::Mat image; -// cam_ptr[ii]->GetImageCV(image); -// cv::imshow( window_name[ii], image ); -// } -// if(cv::waitKey(30) >= 0) break; -// } -// -// cv::destroyAllWindows(); -// -// std::cout << "[Camera test]: Finished successfully." << std::endl; -// }catch (CMvbluefox3::CmvBlueFOX3Exception& e) { -// std::cout << e.what() << std::endl; -// } -// -// for (int ii = 0; ii < num_cams; ++ii) -// { -// if (cam_ptr[ii] != NULL) -// { -// cam_ptr[ii] = NULL; -// delete [] cam_ptr[ii]; -// } -// } -// - vision_utils::SensorCameraPtr sen_ptr = vision_utils::askUserSource(argc, argv); if (sen_ptr==NULL) return 0; @@ -191,6 +105,7 @@ int main(int argc, char** argv) options.function_tolerance = 1e-4; CeresManagerPtr ceres_manager = std::make_shared<CeresManager>(problem, options); + // Install camera // IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML // intr->pinhole_model_raw = Eigen::Vector4s(320,240,320,320); @@ -209,9 +124,12 @@ int main(int argc, char** argv) params->pixel_noise_std = 1.0; params->min_track_length_for_factor = 3; params->voting_active = true; - params->max_new_features = 200; - params->min_features_for_keyframe = 50; + params->max_new_features = 15; + params->min_features_for_keyframe = 5; params->time_tolerance = 0.01; + params->n_cells_h = 13; + params-> n_cells_v = 10; + params->min_response_new_feature = -1; auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); @@ -242,12 +160,14 @@ int main(int argc, char** argv) std::cout << report << std::endl; if (number_of_KFs > 5) break; - } +// problem->print(4,1,1,0); + + cv::waitKey();//1e7); } - problem->print(1,0,1,0); +// problem->print(1,0,1,0); return 0; } -- GitLab From 0e23bf8a55aada1f029261c8c7c20b77944c15bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Vallv=C3=A9=20Navarro?= <jvallve@iri.upc.edu> Date: Thu, 13 Jun 2019 14:15:08 +0200 Subject: [PATCH 49/58] opencv error in gtest_bundle_adjustment --- .../processor/processor_bundle_adjustment.h | 39 ++++++++++---- src/processor/processor_bundle_adjustment.cpp | 51 +++++++++++-------- test/gtest_factor_pixelHP.cpp | 9 +--- test/gtest_processor_bundle_adjustment.cpp | 16 +++--- 4 files changed, 66 insertions(+), 49 deletions(-) diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index 56210ccd7..b32ffbf93 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -101,12 +101,18 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature */ virtual void postProcess() override; - /** \brief Track provided features from \b last to \b incoming - * \param _features_last_in input list of features in \b last to track - * \param _features_incoming_out returned list of features found in \b incoming + /** \brief Track provided features in \b _capture + * \param _features_in input list of features in \b last to track + * \param _capture the capture in which the _features_in should be searched + * \param _features_out returned list of features found in \b _capture * \param _feature_correspondences returned map of correspondences: _feature_correspondences[feature_out_ptr] = feature_in_ptr + * + * \return the number of features tracked */ - virtual unsigned int trackFeatures(const FeatureBasePtrList& _features_last_in, FeatureBasePtrList& _features_incoming_out, FeatureMatchMap& _feature_correspondences) override; + virtual unsigned int trackFeatures(const FeatureBasePtrList& _features_in, + const CaptureBasePtr& _capture, + FeatureBasePtrList& _features_out, + FeatureMatchMap& _feature_correspondences) override; /** \brief Correct the drift in incoming feature by re-comparing against the corresponding feature in origin. * \param _origin_feature input feature in origin capture tracked @@ -127,27 +133,38 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature bool isInlier(const cv::KeyPoint& _kp_incoming, const cv::KeyPoint& _kp_last); bool is_tracked(int& kp_idx_); + /** \brief Detect new Features - * \param _max_features maximum number of features detected + * \param _max_features maximum number of features detected (-1: unlimited. 0: none) + * \param _capture The capture in which the new features should be detected. + * \param _features_out The list of detected Features in _capture. * \return The number of detected Features. * * This function detects Features that do not correspond to known Features/Landmarks in the system. * - * The function sets _features_last_out, the list of newly detected features in Capture last. + * IMPORTANT: The features in _features_out should be emplaced. Don't use `make_shared`, use `FeatureBase::emplace` instead. + * Then, they will be already linked to the _capture. + * If you detect all the features at once in preprocess(), you should either emplace them (`FeatureBase::emplace()`) and remove the not returned features in _features_out (`FeatureBase::remove()`), + * or create them (`make_shared()`) and link all the returned features in _features_out (`FeatureBase::link(_capture)`). + * + * The function is called in ProcessorTrackerFeature::processNew() to set the member new_features_last_, + * the list of newly detected features of the capture last_ptr_. */ - virtual unsigned int detectNewFeatures(const int& _max_new_features, FeatureBasePtrList& _features_last_out) override; + virtual unsigned int detectNewFeatures(const int& _max_new_features, + const CaptureBasePtr& _capture, + FeatureBasePtrList& _features_out) override; - /** \brief Create a new factor and link it to the wolf tree + /** \brief Emplaces a new factor * \param _feature_ptr pointer to the parent Feature * \param _feature_other_ptr pointer to the other feature constrained. * * Implement this method in derived classes. * - * This function creates a factor of the appropriate type for the derived processor. + * This function emplaces a factor of the appropriate type for the derived processor. */ - virtual FactorBasePtr createFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) override; + virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) override; - virtual LandmarkBasePtr createLandmark(FeatureBasePtr _feature_ptr); + virtual LandmarkBasePtr emplaceLandmark(FeatureBasePtr _feature_ptr); /** \brief Establish factors between features in Captures \b last and \b origin */ diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 5c0589c26..e7bc2b1b0 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -202,9 +202,12 @@ void ProcessorBundleAdjustment::postProcess() } -unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& _features_last_in, FeatureBasePtrList& _features_incoming_out, FeatureMatchMap& _feature_correspondences) +unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& _features_in, + const CaptureBasePtr& _capture, + FeatureBasePtrList& _features_out, + FeatureMatchMap& _feature_correspondences) { - for (auto feat_base: _features_last_in) + for (auto feat_base: _features_in) { FeaturePointImagePtr feat_last = std::static_pointer_cast<FeaturePointImage>(feat_base); @@ -220,11 +223,13 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& // if (isInlier(kp_last, kp_inc)) // { - FeaturePointImagePtr feat_inc = std::make_shared<FeaturePointImage>(kp_inc, index_inc, - capture_image_incoming_->descriptors_.row(index_inc), - pixel_cov_); + FeatureBasePtr feat_inc = FeatureBase::emplace<FeaturePointImage>(_capture, + kp_inc, + index_inc, + capture_image_incoming_->descriptors_.row(index_inc), + pixel_cov_); - _features_incoming_out.push_back(feat_inc); + _features_out.push_back(feat_inc); auto feature_match_ptr = std::make_shared<FeatureMatch>(); feature_match_ptr->feature_ptr_= feat_last; @@ -239,7 +244,7 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& } } // return _feature_correspondences.size(); - return _features_incoming_out.size(); + return _features_out.size(); } bool ProcessorBundleAdjustment::isInlier(const cv::KeyPoint& _kp_last, const cv::KeyPoint& _kp_incoming) @@ -270,7 +275,9 @@ bool ProcessorBundleAdjustment::is_tracked(int& _kp_idx) return false; } -unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_features, FeatureBasePtrList& _features_last_out) +unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_features, + const CaptureBasePtr& _capture, + FeatureBasePtrList& _features_out) { //TODO: efficient implementation? @@ -279,23 +286,23 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe // // for (iter it = capture_image_last_->map_index_to_next_.begin(); it!=capture_image_last_->map_index_to_next_.end(); ++it) // { -// if (_features_last_out.size() >= _max_new_features) +// if (_features_out.size() >= _max_new_features) // break; // // else if(!is_tracked(it->second)) // { -// //add to _features_last_out +// //add to _features_out // int idx_last = it->first; // cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(idx_last); // FeaturePointImagePtr feat_last_ = std::make_shared<FeaturePointImage>(kp_last, idx_last, // capture_image_last_->descriptors_.row(idx_last), // pixel_cov_); -// _features_last_out.push_back(feat_last_); +// _features_out.push_back(feat_last_); // // } // } // -// return _features_last_out.size(); +// return _features_out.size(); for (unsigned int n_iterations = 0; _max_new_features == -1 || n_iterations < _max_new_features; ++n_iterations) { @@ -325,13 +332,13 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe // if (isInlier( kp_incoming, kp_last)) // { // Create WOLF feature - FeaturePointImagePtr ftr_point_last = std::make_shared<FeaturePointImage>( - kp_last, - index_last, - capture_image_last_->descriptors_.row(index_last), - pixel_cov_); + FeatureBasePtr ftr_point_last = FeatureBase::emplace<FeaturePointImage>(_capture, + kp_last, + index_last, + capture_image_last_->descriptors_.row(index_last), + pixel_cov_); - _features_last_out.push_back(ftr_point_last); + _features_out.push_back(ftr_point_last); // hit cell to acknowledge there's a tracked point in that cell capture_image_last_->grid_features_->hitTrackingCell(kp_last); @@ -348,7 +355,7 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe else break; // There are no empty cells } - return _features_last_out.size(); + return _features_out.size(); } @@ -391,7 +398,7 @@ bool ProcessorBundleAdjustment::voteForKeyFrame() } -FactorBasePtr ProcessorBundleAdjustment::createFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) +FactorBasePtr ProcessorBundleAdjustment::emplaceFactor(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) { /* This function is no creating any factor. * We create factors with establishFactors() @@ -399,7 +406,7 @@ FactorBasePtr ProcessorBundleAdjustment::createFactor(FeatureBasePtr _feature_pt return FactorBasePtr(); } -LandmarkBasePtr ProcessorBundleAdjustment::createLandmark(FeatureBasePtr _feature_ptr) +LandmarkBasePtr ProcessorBundleAdjustment::emplaceLandmark(FeatureBasePtr _feature_ptr) { FeaturePointImagePtr feat_point_image_ptr = std::static_pointer_cast<FeaturePointImage>( _feature_ptr); Eigen::Vector2s point2D = _feature_ptr->getMeasurement(); @@ -467,7 +474,7 @@ void ProcessorBundleAdjustment::establishFactors() if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr { //createLandmark - LandmarkBasePtr lmk = createLandmark(feature_origin); + LandmarkBasePtr lmk = emplaceLandmark(feature_origin); assert(lmk!=nullptr); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); //add Landmark to map: map[track_id] = landmarkptr diff --git a/test/gtest_factor_pixelHP.cpp b/test/gtest_factor_pixelHP.cpp index 318226812..807d5b084 100644 --- a/test/gtest_factor_pixelHP.cpp +++ b/test/gtest_factor_pixelHP.cpp @@ -243,16 +243,11 @@ TEST(ProcessorFactorPixelHP, testZeroResidual) cv::KeyPoint kp = cv::KeyPoint(p, 32.0f); cv::Mat des = cv::Mat::zeros(1,8, CV_8U); - FeaturePointImagePtr fea0 = std::make_shared<FeaturePointImage>(kp, 0, des, Eigen::Matrix2s::Identity()* pow(1, 2)); - fea0->setCapture(cap0); - cap0->addFeature(fea0); - fea0->link(cap0); + FeatureBasePtr fea0 = FeatureBase::emplace<FeaturePointImage>(cap0, kp, 0, des, Eigen::Matrix2s::Identity()* pow(1, 2)); // Landmark - LandmarkBasePtr lmk = proc_bundle_adj->createLandmark(fea0); + LandmarkBasePtr lmk = proc_bundle_adj->emplaceLandmark(fea0); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); - problem_ptr->addLandmark(lmk_hp); - lmk->link(problem_ptr->getMap()); // Factor auto fac0 = FactorBase::emplace<FactorPixelHP>(fea0, fea0, lmk_hp, proc); diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 27031c3ec..431b9bbc7 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -174,7 +174,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) proc_dummy->setLast(image_last_ptr); // demo detectNewFeatures - unsigned int num = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + unsigned int num = proc_dummy->detectNewFeatures(params->max_new_features, image_last_ptr, feat_list); ASSERT_EQ(num, 0); // Put an image on incoming_ptr_ @@ -182,7 +182,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) proc_dummy->setInc(image_inc_ptr); // demo detectNewFeatures - unsigned int num2 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + unsigned int num2 = proc_dummy->detectNewFeatures(params->max_new_features, image_last_ptr, feat_list); ASSERT_EQ(num2, 0); // preProcess Incoming to fill last_ptr_ map_index_to_next_ @@ -191,7 +191,7 @@ TEST(ProcessorBundleAdjustment, detectNewFeatures) ASSERT_NE(last->map_index_to_next_.size(),0); // demo detectNewFeatures - unsigned int num3 = proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + unsigned int num3 = proc_dummy->detectNewFeatures(params->max_new_features, image_last_ptr, feat_list); ASSERT_LE(num3, params->max_new_features); } @@ -218,11 +218,11 @@ TEST(ProcessorBundleAdjustment, trackFeatures) proc_dummy->setInc(image_inc_ptr); proc_dummy->preProcess(); CaptureImagePtr last = std::static_pointer_cast<CaptureImage>(proc_dummy->getLast()); - proc_dummy->detectNewFeatures(params->max_new_features, feat_list); + proc_dummy->detectNewFeatures(params->max_new_features, last, feat_list); //demo trackFeatures FeatureBasePtrList feat_list_out = std::list<FeatureBasePtr>(); FeatureMatchMap feat_correspondance = FeatureMatchMap(); - proc_dummy->trackFeatures(feat_list, feat_list_out, feat_correspondance); + proc_dummy->trackFeatures(feat_list, image_inc_ptr, feat_list_out, feat_correspondance); ASSERT_EQ(feat_list.size(), feat_list_out.size()); } @@ -232,7 +232,7 @@ TEST(ProcessorBundleAdjustment, establishFactors) std::cout << "EMPTY Test\n"; } -TEST(ProcessorBundleAdjustment, createLandmark) +TEST(ProcessorBundleAdjustment, emplaceLandmark) { //Build problem ProblemPtr problem_ptr = Problem::create("PO", 3); @@ -265,13 +265,11 @@ TEST(ProcessorBundleAdjustment, createLandmark) cv::Mat des = cv::Mat::zeros(1,8, CV_8U); FeaturePointImagePtr fea0 = std::make_shared<FeaturePointImage>(kp, 0, des, Eigen::Matrix2s::Identity()* pow(1, 2)); - fea0->setCapture(cap0); - cap0->addFeature(fea0); fea0->link(cap0); ASSERT_TRUE(problem_ptr->check(0)); - LandmarkBasePtr lmk = proc_bundle_adj->createLandmark(fea0); + LandmarkBasePtr lmk = proc_bundle_adj->emplaceLandmark(fea0); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); ASSERT_EQ(problem_ptr->getMap()->getLandmarkList().size(), 1); -- GitLab From 1ea5c36586fb93867d3acd8e1ea18dd6ad3b715b Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Mon, 17 Jun 2019 10:20:05 +0200 Subject: [PATCH 50/58] Detect all good kp in a cell --- src/processor/processor_bundle_adjustment.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index e7bc2b1b0..53a86c69f 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -345,7 +345,7 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe found_feature_in_cell = true; - break; // Good kp found for this grid. +// break; // Good kp found for this grid. //Use to have only one keypoint per grid // } } } -- GitLab From ba0224bd18240ed537a9aedc40e3d484847da8b5 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Mon, 17 Jun 2019 10:21:43 +0200 Subject: [PATCH 51/58] Emplace factors and landmarks depending on the track length --- src/processor/processor_bundle_adjustment.cpp | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 53a86c69f..daa43b26c 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -463,30 +463,29 @@ void ProcessorBundleAdjustment::establishFactors() for (auto const & pair_trkid_pair : matches_origin_inc) { size_t trkid = pair_trkid_pair.first; + //if track size is lower than a minimum, don't establish any factor. if (track_matrix_.trackSize(trkid)<params_bundle_adjustment_->min_track_length_for_factor) continue; + FeatureBasePtr feature_origin = pair_trkid_pair.second.first; FeatureBasePtr feature_last = pair_trkid_pair.second.second; - assert(feature_origin!=feature_last && "feature: origin equal last"); - assert(feature_origin->getCapture()!=feature_last->getCapture() && "capture: origin equal last"); - if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr { - //createLandmark + //emplaceLandmark LandmarkBasePtr lmk = emplaceLandmark(feature_origin); - assert(lmk!=nullptr); LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); - //add Landmark to map: map[track_id] = landmarkptr + + //add only one Landmark to map: map[track_id] = landmarkptr lmk_track_map_[trkid] = lmk; - //create factors -// assert(feature_origin->getCapture()->getSensor() != nullptr); -// assert(feature_origin->getCapture()->getSensorP() != nullptr); -// assert(feature_origin->getCapture()->getSensorO() != nullptr); -// assert(lmk->getP() != nullptr); - FactorBase::emplace<FactorPixelHP>(feature_origin, feature_origin, lmk_hp, shared_from_this()); - FactorBase::emplace<FactorPixelHP>(feature_last, feature_last, lmk_hp, shared_from_this()); + //emplace a factor for each feature in the track (only for keyframes) + Track full_track = track_matrix_.trackAtKeyframes(trkid); + for (auto it=full_track.begin(); it!=full_track.end(); ++it) + { + FactorBase::emplace<FactorPixelHP>(it->second, it->second, lmk_hp, shared_from_this()); + } + } else { -- GitLab From 2a3a644b66facd9f5af6320988ba268d3e08bf07 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Mon, 17 Jun 2019 10:27:17 +0200 Subject: [PATCH 52/58] Do not delete landmarks at post process --- src/processor/processor_bundle_adjustment.cpp | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index daa43b26c..670177d9a 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -63,16 +63,11 @@ void ProcessorBundleAdjustment::preProcess() // Compute Descriptors capture_image_incoming_->descriptors_ = des_ptr_->getDescriptor(capture_image_incoming_->getImage(), capture_image_incoming_->keypoints_); - std::cout << "before fill grid " << std::endl; - // Create and fill incoming grid capture_image_incoming_->grid_features_ = std::make_shared<vision_utils::FeatureIdxGrid>(capture_image_incoming_->getImage().rows, capture_image_incoming_->getImage().cols, params_bundle_adjustment_->n_cells_v, params_bundle_adjustment_->n_cells_h); capture_image_incoming_->grid_features_->insert(capture_image_incoming_->keypoints_); - std::cout << "after fill grid done " << std::endl; - - if (last_ptr_ != nullptr) { // Get Capture @@ -149,28 +144,28 @@ void ProcessorBundleAdjustment::postProcess() // DEBUG image_debug_ = vision_utils::buildImageProcessed((std::static_pointer_cast<CaptureImage>(last_ptr_))->getImage(), kp_enh_tracks); - Snapshot snapshot_last = track_matrix_.snapshot(last_ptr_); -// getProblem()->print(4,1,1,0); - for (auto pair : track_matrix_.snapshot(origin_ptr_)) - { - if (snapshot_last.count(pair.first)==0) - { - if (!(pair.second->getFactorList()).empty()) - { - auto factor = pair.second->getFactorList().front(); - if (factor) - { - auto lmk = factor->getLandmarkOther(); - if (lmk) - { -// lmk->remove(); -// track_matrix_.remove(pair.second->trackId()); - } - } - } - } - } - getProblem()->print(4,1,1,0); +// Snapshot snapshot_last = track_matrix_.snapshot(last_ptr_); +//// getProblem()->print(4,1,1,0); +// for (auto pair : track_matrix_.snapshot(origin_ptr_)) +// { +// if (snapshot_last.count(pair.first)==0) +// { +// if (!(pair.second->getFactorList()).empty()) +// { +// auto factor = pair.second->getFactorList().front(); +// if (factor) +// { +// auto lmk = factor->getLandmarkOther(); +// if (lmk) +// { +//// lmk->remove(); +//// track_matrix_.remove(pair.second->trackId()); +// } +// } +// } +// } +// } +// //getProblem()->print(1,1,1,0); list<FeatureBasePtr> snapshot = track_matrix_.snapshotAsList(last_ptr_); for (auto const & feat_base : snapshot) @@ -495,6 +490,7 @@ void ProcessorBundleAdjustment::establishFactors() //Create factor FactorBase::emplace<FactorPixelHP>(feature_last, feature_last, lmk_hp, shared_from_this()); } + } } -- GitLab From 98bed31028e88a9ecb701329eb7c8f9fb6f48b65 Mon Sep 17 00:00:00 2001 From: oriolvendrell <oriolvendrell10@gmail.com> Date: Fri, 21 Jun 2019 18:02:51 +0200 Subject: [PATCH 53/58] Debugging processor BA --- .../processor/processor_bundle_adjustment.h | 14 +- src/processor/processor_bundle_adjustment.cpp | 403 +++++++++++++++--- src/yaml/processor_bundle_adjustment_yaml.cpp | 4 +- 3 files changed, 354 insertions(+), 67 deletions(-) diff --git a/include/vision/processor/processor_bundle_adjustment.h b/include/vision/processor/processor_bundle_adjustment.h index b32ffbf93..629ee924e 100644 --- a/include/vision/processor/processor_bundle_adjustment.h +++ b/include/vision/processor/processor_bundle_adjustment.h @@ -14,6 +14,7 @@ #include "vision/landmark/landmark_HP.h" #include "vision/math/pinhole_tools.h" #include "vision/sensor/sensor_camera.h" +#include "core/math/rotations.h" //vision utils includes #include "vision_utils/vision_utils.h" @@ -57,12 +58,20 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature CaptureImagePtr capture_image_last_; CaptureImagePtr capture_image_incoming_; + SensorCameraPtr camera; + Matrix2s pixel_cov_; + cv::Mat tvec_; + cv::Mat rvec_; + //TODO: correct to add this? std::map<size_t, LandmarkBasePtr> lmk_track_map_; //LandmarkTrackMap; + private: + int frame_count_; + public: /** \brief Class constructor @@ -70,7 +79,10 @@ class ProcessorBundleAdjustment : public ProcessorTrackerFeature ProcessorBundleAdjustment(ProcessorParamsBundleAdjustmentPtr _params_bundle_adjustment); /** \brief Class destructor */ - //virtual ~ProcessorBundleAdjustment(); + virtual ~ProcessorBundleAdjustment() + { + // + } public: diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 670177d9a..82cfb37b8 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -21,9 +21,10 @@ ProcessorBundleAdjustment::ProcessorBundleAdjustment(ProcessorParamsBundleAdjust ProcessorTrackerFeature("TRACKER BUNDLE ADJUSTMENT", _params_bundle_adjustment), params_bundle_adjustment_(_params_bundle_adjustment), capture_image_last_(nullptr), - capture_image_incoming_(nullptr) + capture_image_incoming_(nullptr), + frame_count_(0) { - + //Initialize detector-descriptor-matcher pixel_cov_ = Eigen::Matrix2s::Identity() * params_bundle_adjustment_->pixel_noise_std * params_bundle_adjustment_->pixel_noise_std; // Detector yaml file @@ -41,11 +42,28 @@ ProcessorBundleAdjustment::ProcessorBundleAdjustment(ProcessorParamsBundleAdjust // Create Matcher mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_bundle_adjustment_->yaml_file_params_vision_utils); + //Initialize rvec and tvec + tvec_ = cv::Mat::zeros(cv::Size(3,1), CV_32F); + rvec_ = cv::Mat::zeros(cv::Size(3,1), CV_32F); +// Eigen::Vector3s last_pos = capture_image_last_->getFrame()->getP()->getState(); +// Eigen::Vector4s last_or = capture_image_last_->getFrame()->getO()->getState(); +// Eigen::Quaternion<Scalar> last_q(last_or(0), last_or(1), last_or(2), last_or(3)); +// +// Eigen::VectorXs tvec_eigen = last_pos; +// Eigen::VectorXs rvec_eigen = q2v(last_q); +// +// cv::eigen2cv(tvec_eigen, tvec); +// cv::eigen2cv(rvec_eigen, rvec); + + } void ProcessorBundleAdjustment::configure(SensorBasePtr _sensor) { //TODO: Implement if needed + //Initialize camera sensor pointer + camera = std::static_pointer_cast<SensorCamera>(_sensor); + } void ProcessorBundleAdjustment::preProcess() @@ -76,6 +94,8 @@ void ProcessorBundleAdjustment::preProcess() capture_image_incoming_->matches_normalized_scores_ = mat_ptr_->robustMatch(capture_image_incoming_->keypoints_, capture_image_last_->keypoints_, capture_image_incoming_->descriptors_, capture_image_last_->descriptors_, des_ptr_->getSize(), capture_image_incoming_->matches_from_precedent_); + + //TODO: Get only the best ones if (params_bundle_adjustment_->delete_ambiguities) //filter ambiguities { @@ -100,6 +120,50 @@ void ProcessorBundleAdjustment::preProcess() } + +// //get points 2D from inlier matches +// PointVector pts1, pts2; +// for (auto match : capture_image_incoming_->matches_from_precedent_) +// { +// pts1.push_back(capture_image_incoming_->keypoints_[match.queryIdx].pt); +// pts2.push_back(capture_image_last_->keypoints_[match.trainIdx].pt); +// } +// +// //find Essential Matrix +// std::vector<uchar> inliers(pts1.size(),0); +// +// auto camera_mat = std::static_pointer_cast<SensorCamera>(capture_image_last_->getSensor())->getIntrinsicMatrix(); +// cv::Mat camera_mat_cv; +// cv::eigen2cv(camera_mat, camera_mat_cv); +// +// cv::Mat E = cv::findEssentialMat(pts1, +// pts2, +// camera_mat_cv, +// CV_RANSAC, +// 0.999, +// 1.0, +// inliers); +// +// //Compute rotation R and translation t from E +// cv::Mat R_cv; +// cv::Mat t_cv; +// +// cv::recoverPose(E,pts1,pts2, camera_mat_cv, R_cv, t_cv, inliers); +// +// //Convert R and t from OpenCV type to Eigen type and convert Rotation to a quaternion +// Eigen::Matrix3s R; +// cv::cv2eigen(R_cv, R); +//// auto q = R2q(R); //Quaternion q +// +// Eigen::Vector3s t; //Translation t +// cv::cv2eigen(t_cv,t); + + + + + + + // cv::Mat img_mat = cv::Mat(capture_image_incoming_->getImage().rows, capture_image_incoming_->getImage().cols, capture_image_incoming_->getImage().type()); // // cv::drawMatches(capture_image_incoming_->getImage(), capture_image_incoming_->getKeypoints(), @@ -111,25 +175,187 @@ void ProcessorBundleAdjustment::preProcess() // cv::imshow("MATCHES VIEW", img_mat); } - std::cout << "preProcess() done " << std::endl; +// std::cout << "preProcess() done " << std::endl; } void ProcessorBundleAdjustment::postProcess() { - std::map<int,std::list<vision_utils::KeyPointEnhanced> > kp_enh_tracks; - for (auto const & feat_base : last_ptr_->getFeatureList()) + WOLF_INFO("last ", last_ptr_, "camera ", camera); + + //=====================================Compute prior for the frame=============================================== +// if (capture_image_last_) +// { +// +// std::vector<cv::Point3f> landmark_points; +// std::vector<cv::Point2f> image_points; +// +// //get camera information +// auto camera_mat = camera->getIntrinsicMatrix(); +// +// cv::Mat camera_mat_cv; +// cv::eigen2cv(camera_mat, camera_mat_cv); +// +// auto dist_coeffs = camera->getDistortionVector(); +// +// Eigen::Vector5s dist; +// switch(dist_coeffs.size()) +// { +// case 0: +// { +// dist << 0,0,0,0,0; +// break; +// } +// case 1: +// { +// dist << dist_coeffs(0),0,0,0,0; +// break; +// } +// case 2: +// { +// dist << dist_coeffs(0),dist_coeffs(1),0,0,0; +// break; +// } +// case 3: +// { +// dist << dist_coeffs(0),dist_coeffs(1),0,0,dist_coeffs(2); +// break; +// } +// default: +// dist << 0,0,0,0,0; +// } +// +// cv::Mat dist_coeffs_cv; +// cv::eigen2cv(dist, dist_coeffs_cv); +// +// +// +// //fill points and landmarks list +// int debug_counter = 0; +// +//// for (auto & feat : capture_image_last_->getFeatureList()) +//// { +//// for (auto & fact : feat->getFactorList()) +//// { +//// debug_counter++; +//// //check the number of factors to the landmark +//// if (fact->getLandmarkOther()->getConstrainedByList().size() >= 2) +//// { +//// //3d points +//// auto point3D = std::static_pointer_cast<LandmarkHP>(fact->getLandmarkOther())->point(); +//// landmark_points.push_back(cv::Point3f(point3D(0),point3D(1),point3D(2))); +//// //2d points +//// auto point2D = feat->getMeasurement(); +//// image_points.push_back(cv::Point2f(point2D(0), point2D(1))); +//// } +//// } +//// } +// +// for (auto & feat : track_matrix_.snapshotAsList(capture_image_last_)) +// { +// debug_counter++; +// auto trkId = feat->trackId(); +// if (lmk_track_map_.count(feat->trackId())) +// { +// auto lmk_base = lmk_track_map_[trkId]; +//// if (lmk_base->getConstrainedByList().size() >= 2) +// { +// //3d points +// auto point3D = std::static_pointer_cast<LandmarkHP>(lmk_base)->point(); +// landmark_points.push_back(cv::Point3f(point3D(0),point3D(1),point3D(2))); +// //2d points +// auto point2D = feat->getMeasurement(); +// image_points.push_back(cv::Point2f(point2D(0), point2D(1))); +// } +// } +// } +// +// WOLF_INFO("Num lmks in last:", debug_counter,"lmks constrained by >= 2 fctrs: ", landmark_points.size()); +// +// //solvePnP +// if (landmark_points.size() > 7) +// { +// WOLF_INFO("before PnP ", tvec, rvec); +// WOLF_INFO("before PnP ", last_ptr_->getFrame()->getState().transpose()); +// +// +// cv::solvePnP(landmark_points, image_points, camera_mat_cv, dist_coeffs_cv, rvec, tvec, true); +// WOLF_INFO("Solve PnP Done") +// +// //Compute and set Robot state +// //q_w_s Camera quaternion +// Eigen::Vector3s rvec_eigen; +// cv::cv2eigen(rvec, rvec_eigen); +// Eigen::Quaternion<Scalar> q_w_s = v2q(rvec_eigen); +// +// //p_w_s Camera position +// Eigen::Vector3s p_w_s; +// cv::cv2eigen(tvec, p_w_s); +// +// //Robot pose +// // Eigen::Vector3s p_w_r = capture_image_last_->getFrame()->getP()->getState(); +// // Eigen::Quaternion<Scalar> q_w_r = Quaternions(capture_image_last_->getFrame()->getO()->getState().data()); +// +// //Extrinsics (camera in robot reference frame) +// Eigen::Vector3s p_r_s = camera->getP()->getState(); +// Eigen::Quaternion<Scalar> q_r_s = Quaternions(camera->getO()->getState().data()); +// +// //Robot pose compositions +// Eigen::Quaternion<Scalar> q_w_r = q_w_s * q_r_s.conjugate(); +// Eigen::Vector3s p_w_r = p_w_s - q_w_r * p_r_s; +// +// +// +// Eigen::Vector7s prior_state; +// prior_state << p_w_r(0), p_w_r(1), p_w_r(2), q_w_r.x(), q_w_r.y(), q_w_r.z(), q_w_r.w(); +// +// last_ptr_->getFrame()->setState(prior_state); +// +// WOLF_INFO("after PnP ", last_ptr_->getFrame()->getState().transpose()); +// WOLF_INFO("after PnP ", tvec, rvec); +// +// } +// +// //================================================================================================================= +// } + + //delete landmarks + getProblem()->check(1); + for (auto & lmk : getProblem()->getMap()->getLandmarkList()) + { + if (lmk->getConstrainedByList().size()==1) + { + if (lmk->getConstrainedByList().front()->getFeature()->getCapture() != last_ptr_) + { + WOLF_INFO("Removing landmark: ", lmk->id()); + lmk_track_map_.erase(lmk->getConstrainedByList().front()->getFeature()->trackId()); + WOLF_INFO("Lmk deleted from track map: ", lmk->id()); + lmk->remove(); + WOLF_INFO("Lmk deleted: ", lmk->id()); + } + } + } + getProblem()->check(1); + + + // draw debug image ====================================================================================== + + // image to draw + CaptureBasePtr image_to_draw = last_ptr_; + + + std::map<int,std::list<vision_utils::KeyPointEnhanced> > kp_enh_tracks; + for (auto const & feat_base : image_to_draw->getFeatureList()) { FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); unsigned int feat_id = feat->id(); unsigned int track_id = feat->trackId(); - // tracks std::list<vision_utils::KeyPointEnhanced> kp_enh_track; - for (auto feat_base : track_matrix_.trackAsVector(track_id)) + for (auto feat_base_track : track_matrix_.trackAsVector(track_id)) { - FeaturePointImagePtr feat_img = std::static_pointer_cast<FeaturePointImage>(feat_base); + FeaturePointImagePtr feat_img = std::static_pointer_cast<FeaturePointImage>(feat_base_track); vision_utils::KeyPointEnhanced kp_enh(feat_img->getKeypoint(), feat_id, track_id, @@ -140,10 +366,8 @@ void ProcessorBundleAdjustment::postProcess() kp_enh_tracks[feat_id] = kp_enh_track; } - // DEBUG - image_debug_ = vision_utils::buildImageProcessed((std::static_pointer_cast<CaptureImage>(last_ptr_))->getImage(), kp_enh_tracks); - + image_debug_ = vision_utils::buildImageProcessed((std::static_pointer_cast<CaptureImage>(image_to_draw))->getImage(), kp_enh_tracks); // Snapshot snapshot_last = track_matrix_.snapshot(last_ptr_); //// getProblem()->print(4,1,1,0); // for (auto pair : track_matrix_.snapshot(origin_ptr_)) @@ -165,9 +389,10 @@ void ProcessorBundleAdjustment::postProcess() // } // } // } -// //getProblem()->print(1,1,1,0); +// getProblem()->print(0,0,1,0); + + list<FeatureBasePtr> snapshot = track_matrix_.snapshotAsList(image_to_draw); - list<FeatureBasePtr> snapshot = track_matrix_.snapshotAsList(last_ptr_); for (auto const & feat_base : snapshot) { FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); @@ -175,25 +400,33 @@ void ProcessorBundleAdjustment::postProcess() if (lmk_track_map_.count(track_id)) { Vector3s point3D = std::static_pointer_cast<LandmarkHP>(lmk_track_map_[track_id])->point(); - Transform<Scalar,3,Isometry> T_w_r + + Transform<Scalar,3,Isometry> T_w_r = Translation<Scalar,3>(feat_base->getFrame()->getP()->getState()) * Quaternions(feat_base->getFrame()->getO()->getState().data()); Transform<Scalar,3,Isometry> T_r_c = Translation<Scalar,3>(feat_base->getCapture()->getSensorP()->getState()) * Quaternions(feat_base->getCapture()->getSensorO()->getState().data()); + Eigen::Matrix<Scalar, 3, 1> point3D_c = T_r_c.inverse() * T_w_r.inverse() * point3D; - SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); - Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D_c); + +// SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); + + Vector2s point2D = pinhole::projectPoint(getSensor()->getIntrinsic()->getState(), camera->getDistortionVector(), point3D_c); cv::Point point = cv::Point(point2D(0), point2D(1)); + cv::circle(image_debug_, point, 3, cv::Scalar(0,0,255) , 1 , 8); + std::string id = std::to_string(lmk_track_map_[track_id]->id()); + cv::putText(image_debug_, id, point, cv::FONT_HERSHEY_DUPLEX, 1.0, CV_RGB(0,255,0),2); } } - cv::namedWindow("DEBUG VIEW", cv::WINDOW_NORMAL); - cv::resizeWindow("DEBUG VIEW", 800,600); - cv::imshow("DEBUG VIEW", image_debug_); - cv::waitKey(1); + +// cv::namedWindow("DEBUG VIEW", cv::WINDOW_NORMAL); +// cv::resizeWindow("DEBUG VIEW", 800,600); +// cv::imshow("DEBUG VIEW", image_debug_); +// cv::waitKey(1); } @@ -214,10 +447,10 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& { // Get kp incoming and keypoint last cv::KeyPoint kp_inc = capture_image_incoming_->keypoints_.at(index_inc); -// cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(feat_last->getIndexKeyPoint()); + cv::KeyPoint kp_last = capture_image_last_->keypoints_.at(feat_last->getIndexKeyPoint()); -// if (isInlier(kp_last, kp_inc)) -// { + if (isInlier(kp_last, kp_inc)) + { FeatureBasePtr feat_inc = FeatureBase::emplace<FeaturePointImage>(_capture, kp_inc, index_inc, @@ -234,7 +467,7 @@ unsigned int ProcessorBundleAdjustment::trackFeatures(const FeatureBasePtrList& // hit cell to acknowledge there's a tracked point in that cell capture_image_incoming_->grid_features_->hitTrackingCell(kp_inc); -// } + } } } } @@ -320,12 +553,12 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe if (capture_image_last_->map_index_to_next_.count(index_last)) { // matching keypoint in incoming -// unsigned int index_incoming = capture_image_last_->map_index_to_next_[index_last]; -// cv::KeyPoint kp_incoming = capture_image_incoming_->keypoints_.at(index_incoming); + unsigned int index_incoming = capture_image_last_->map_index_to_next_[index_last]; + cv::KeyPoint kp_incoming = capture_image_incoming_->keypoints_.at(index_incoming); // validate match with extra tests -// if (isInlier( kp_incoming, kp_last)) -// { + if (isInlier( kp_incoming, kp_last)) + { // Create WOLF feature FeatureBasePtr ftr_point_last = FeatureBase::emplace<FeaturePointImage>(_capture, kp_last, @@ -340,8 +573,8 @@ unsigned int ProcessorBundleAdjustment::detectNewFeatures(const int& _max_new_fe found_feature_in_cell = true; -// break; // Good kp found for this grid. //Use to have only one keypoint per grid -// } + break; // Good kp found for this grid. //Use to have only one keypoint per grid + } } } if (!found_feature_in_cell) @@ -362,6 +595,17 @@ bool ProcessorBundleAdjustment::correctFeatureDrift(const FeatureBasePtr _origin bool ProcessorBundleAdjustment::voteForKeyFrame() { + + frame_count_ ++; + + + return ((frame_count_ % 5) == 0); + + + + + + // // A. crossing voting threshold with ascending number of features bool vote_up = false; // // 1. vote if we did not have enough features before @@ -449,49 +693,80 @@ LandmarkBasePtr ProcessorBundleAdjustment::emplaceLandmark(FeatureBasePtr _featu void ProcessorBundleAdjustment::establishFactors() { - if (origin_ptr_ == last_ptr_) - return; - +// if (origin_ptr_ == last_ptr_) +// return; +// +// TrackMatches matches_origin_inc = track_matrix_.matches(origin_ptr_, last_ptr_); +// +// for (auto const & pair_trkid_pair : matches_origin_inc) +// { +// size_t trkid = pair_trkid_pair.first; +// //if track size is lower than a minimum, don't establish any factor. +// if (track_matrix_.trackSize(trkid) < params_bundle_adjustment_->min_track_length_for_factor) +// continue; +// +// FeatureBasePtr feature_origin = pair_trkid_pair.second.first; +// FeatureBasePtr feature_last = pair_trkid_pair.second.second; +// +// if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr +// { +// //emplaceLandmark +// LandmarkBasePtr lmk = emplaceLandmark(feature_origin); +// LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); +// +// //add only one Landmark to map: map[track_id] = landmarkptr +// lmk_track_map_[trkid] = lmk; +// +// //emplace a factor for each feature in the track (only for keyframes) +// Track full_track = track_matrix_.trackAtKeyframes(trkid); +// for (auto it=full_track.begin(); it!=full_track.end(); ++it) +// { +// FactorBase::emplace<FactorPixelHP>(it->second, it->second, lmk_hp, shared_from_this()); +// } +// +// } +// else +// { +// LandmarkBasePtr lmk = lmk_track_map_[trkid]; +// LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); +// +// //Create factor +// FactorBase::emplace<FactorPixelHP>(feature_last, feature_last, lmk_hp, shared_from_this()); +// } +// +// } - TrackMatches matches_origin_inc = track_matrix_.matches(origin_ptr_, last_ptr_); - for (auto const & pair_trkid_pair : matches_origin_inc) - { - size_t trkid = pair_trkid_pair.first; - //if track size is lower than a minimum, don't establish any factor. - if (track_matrix_.trackSize(trkid)<params_bundle_adjustment_->min_track_length_for_factor) - continue; - FeatureBasePtr feature_origin = pair_trkid_pair.second.first; - FeatureBasePtr feature_last = pair_trkid_pair.second.second; + for (auto & pair_id_ftr : track_matrix_.snapshot(last_ptr_)) + { + auto & trkid = pair_id_ftr.first; + auto & ftr = pair_id_ftr.second; - if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr - { - //emplaceLandmark - LandmarkBasePtr lmk = emplaceLandmark(feature_origin); - LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + if (lmk_track_map_.count(trkid)==0) //if the track doesn't have landmark associated -> we need a map: map[track_id] = landmarkptr + { + //emplaceLandmark + LandmarkBasePtr lmk = emplaceLandmark(ftr); + LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); - //add only one Landmark to map: map[track_id] = landmarkptr - lmk_track_map_[trkid] = lmk; + //add only one Landmark to map: map[track_id] = landmarkptr + lmk_track_map_[trkid] = lmk; - //emplace a factor for each feature in the track (only for keyframes) - Track full_track = track_matrix_.trackAtKeyframes(trkid); - for (auto it=full_track.begin(); it!=full_track.end(); ++it) - { - FactorBase::emplace<FactorPixelHP>(it->second, it->second, lmk_hp, shared_from_this()); - } + //emplace a factor + FactorBase::emplace<FactorPixelHP>(ftr, ftr, lmk_hp, shared_from_this()); - } - else - { - LandmarkBasePtr lmk = lmk_track_map_[trkid]; - LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); + } + else + { + // recover the landmark + LandmarkBasePtr lmk = lmk_track_map_[trkid]; + LandmarkHPPtr lmk_hp = std::static_pointer_cast<LandmarkHP>(lmk); - //Create factor - FactorBase::emplace<FactorPixelHP>(feature_last, feature_last, lmk_hp, shared_from_this()); - } + //emplace a factor + FactorBase::emplace<FactorPixelHP>(ftr, ftr, lmk_hp, shared_from_this()); + } - } + } } void ProcessorBundleAdjustment::setParams(const ProcessorParamsBundleAdjustmentPtr _params) diff --git a/src/yaml/processor_bundle_adjustment_yaml.cpp b/src/yaml/processor_bundle_adjustment_yaml.cpp index ac6740fc5..11ec27e6c 100644 --- a/src/yaml/processor_bundle_adjustment_yaml.cpp +++ b/src/yaml/processor_bundle_adjustment_yaml.cpp @@ -42,11 +42,11 @@ static ProcessorParamsBasePtr createProcessorParamsBundleAdjustment(const std::s params->delete_ambiguities = algorithm["delete ambiguities"] .as<bool>(); params->min_features_for_keyframe = algorithm["minimum features for keyframe"] .as<unsigned int>(); params->max_new_features = algorithm["maximum new features"] .as<unsigned int>(); - /* + params->n_cells_h = algorithm["grid horiz cells"] .as<int>(); params->n_cells_v = algorithm["grid vert cells"] .as<int>(); params->min_response_new_feature = algorithm["min response new features"] .as<int>(); - */ + params->min_track_length_for_factor = algorithm["min track length for factor"].as<int>(); -- GitLab From f44db5c78557a7b9b6c5d4282554d242e608c0f3 Mon Sep 17 00:00:00 2001 From: Oriol Vendrell Gallart <ovendrell@iri.upc.edu> Date: Fri, 28 Jun 2019 09:11:01 +0200 Subject: [PATCH 54/58] Add lmk id to 2D visualization --- src/processor/processor_bundle_adjustment.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 82cfb37b8..c32f4d866 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -419,7 +419,7 @@ void ProcessorBundleAdjustment::postProcess() cv::circle(image_debug_, point, 3, cv::Scalar(0,0,255) , 1 , 8); std::string id = std::to_string(lmk_track_map_[track_id]->id()); - cv::putText(image_debug_, id, point, cv::FONT_HERSHEY_DUPLEX, 1.0, CV_RGB(0,255,0),2); + cv::putText(image_debug_, id, point, cv::FONT_HERSHEY_DUPLEX, 0.5, CV_RGB(0,255,0),2); } } -- GitLab From 9404888571bc7d5e57c0c053e5ceb9d0280d37d4 Mon Sep 17 00:00:00 2001 From: Oriol Vendrell Gallart <ovendrell@iri.upc.edu> Date: Fri, 28 Jun 2019 09:11:47 +0200 Subject: [PATCH 55/58] Remove lmks from lost tracks with only one factor --- src/processor/processor_bundle_adjustment.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index c32f4d866..38a0f1a41 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -321,22 +321,27 @@ void ProcessorBundleAdjustment::postProcess() // } //delete landmarks - getProblem()->check(1); + getProblem()->print(4,1,0,0); + std::list<LandmarkBasePtr> lmks_to_remove; for (auto & lmk : getProblem()->getMap()->getLandmarkList()) { if (lmk->getConstrainedByList().size()==1) { - if (lmk->getConstrainedByList().front()->getFeature()->getCapture() != last_ptr_) + if (lmk->getConstrainedByList().front()->getFeature()->getCapture() != origin_ptr_) { WOLF_INFO("Removing landmark: ", lmk->id()); lmk_track_map_.erase(lmk->getConstrainedByList().front()->getFeature()->trackId()); WOLF_INFO("Lmk deleted from track map: ", lmk->id()); - lmk->remove(); - WOLF_INFO("Lmk deleted: ", lmk->id()); + lmks_to_remove.push_back(lmk); } } } - getProblem()->check(1); + for (auto & lmk : lmks_to_remove) + { + lmk->remove(); + WOLF_INFO("Lmk deleted: ", lmk->id()); + } + getProblem()->check(0); // draw debug image ====================================================================================== -- GitLab From c456222f6c553abbf51f707d35dcdc027ffddc19 Mon Sep 17 00:00:00 2001 From: Oriol Vendrell Gallart <ovendrell@iri.upc.edu> Date: Fri, 28 Jun 2019 09:12:05 +0200 Subject: [PATCH 56/58] Change demo BA parametrers --- demos/demo_processor_bundle_adjustment.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/demos/demo_processor_bundle_adjustment.cpp b/demos/demo_processor_bundle_adjustment.cpp index 09b8c4ce4..d7a27c2d9 100644 --- a/demos/demo_processor_bundle_adjustment.cpp +++ b/demos/demo_processor_bundle_adjustment.cpp @@ -122,14 +122,14 @@ int main(int argc, char** argv) params->delete_ambiguities = true; params->yaml_file_params_vision_utils = wolf_vision_root + "/demos/processor_bundle_adjustment_vision_utils.yaml"; params->pixel_noise_std = 1.0; - params->min_track_length_for_factor = 3; + params->min_track_length_for_factor = 1; params->voting_active = true; - params->max_new_features = 15; - params->min_features_for_keyframe = 5; + params->max_new_features = 200; + params->min_features_for_keyframe = 50; params->time_tolerance = 0.01; - params->n_cells_h = 13; - params-> n_cells_v = 10; - params->min_response_new_feature = -1; + params->n_cells_h = 20; + params-> n_cells_v = 17; + params->min_response_new_feature = 10; auto proc = problem->installProcessor("TRACKER BUNDLE ADJUSTMENT", "processor", sens_cam, params); ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); -- GitLab From db8e857af9430b0d925ea1299844dd3517a1f808 Mon Sep 17 00:00:00 2001 From: Oriol Vendrell Gallart <ovendrell@iri.upc.edu> Date: Fri, 28 Jun 2019 09:28:27 +0200 Subject: [PATCH 57/58] Adapt changes in process() --- test/gtest_processor_bundle_adjustment.cpp | 12 ++++++++---- test/gtest_processor_tracker_feature_trifocal.cpp | 9 ++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 431b9bbc7..8fe8bfb72 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -304,7 +304,8 @@ TEST(ProcessorBundleAdjustment, process) //1ST TIME CaptureImagePtr image_inc_ptr = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); - proc_dummy->process(image_inc_ptr); + image_inc_ptr->process(); +// proc_dummy->process(image_inc_ptr); ASSERT_EQ(proc_dummy->getTrackMatrix().numTracks(), 0); ASSERT_EQ(problem->getMap()->getLandmarkList().size(), 0); @@ -315,7 +316,8 @@ TEST(ProcessorBundleAdjustment, process) // proc_dummy->getProcessKnown(); // proc_dummy->getProcessNew(params->max_new_features); // proc_dummy->establishFactors(); - proc_dummy->process(image_inc_ptr2); + image_inc_ptr2->process(); +// proc_dummy->process(image_inc_ptr2); ASSERT_LE(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); ASSERT_NE(problem->getMap(), nullptr); ASSERT_EQ(problem->getMap()->getLandmarkList().empty(), true); @@ -325,12 +327,14 @@ TEST(ProcessorBundleAdjustment, process) CaptureImagePtr image_inc_ptr3 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); assert(proc_dummy->getOrigin()!=nullptr); assert(proc_dummy->getLast()!= nullptr && proc_dummy->getLast()!=proc_dummy->getOrigin()); - proc_dummy->process(image_inc_ptr3); + image_inc_ptr3->process(); +// proc_dummy->process(image_inc_ptr3); ASSERT_LE(proc_dummy->getTrackMatrix().numTracks(), params->max_new_features); //4TH TIME -- RUNNING CaptureImagePtr image_inc_ptr4 = proc_dummy->createCaptureImage(wolf_vision_root + "/demos/demo_gazebo_x00cm_y00cm.jpg", sens_cam); - proc_dummy->process(image_inc_ptr4); + image_inc_ptr4->process(); +// proc_dummy->process(image_inc_ptr4); ASSERT_LE(image_inc_ptr4->getFeatureList().size(), params->max_new_features); } diff --git a/test/gtest_processor_tracker_feature_trifocal.cpp b/test/gtest_processor_tracker_feature_trifocal.cpp index 3cc902a0c..92351ff34 100644 --- a/test/gtest_processor_tracker_feature_trifocal.cpp +++ b/test/gtest_processor_tracker_feature_trifocal.cpp @@ -131,7 +131,8 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) image *= 0; // TODO see if we want to use a real image SensorCameraPtr sens_trk_cam = std::static_pointer_cast<SensorCamera>(sens_trk); CaptureImagePtr capt_trk = make_shared<CaptureImage>(t, sens_trk_cam, image); - proc_trk->process(capt_trk); + capt_trk->process(); +// proc_trk->process(capt_trk); problem->print(2,0,1,0); @@ -142,11 +143,13 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) WOLF_INFO("----------------------- ts: ", t , " --------------------------"); capt_odo->setTimeStamp(t); - proc_odo->process(capt_odo); + capt_odo->process(); +// proc_odo->process(capt_odo); // Track capt_trk = make_shared<CaptureImage>(t, sens_trk_cam, image); - proc_trk->process(capt_trk); + capt_trk->process(); +// proc_trk->process(capt_trk); problem->print(2,0,1,0); -- GitLab From 6352924ad21ceb4aa8dca689b05458e4b91eddfc Mon Sep 17 00:00:00 2001 From: Joan Sola <jsola@iri.upc.edu> Date: Tue, 2 Jul 2019 15:56:42 +0200 Subject: [PATCH 58/58] remove-serialization --- serialization/CMakeLists.txt | 1 - serialization/cereal/CMakeLists.txt | 26 - serialization/cereal/archives.h | 9 - serialization/cereal/io.h | 229 ------- .../cereal/serialization_eigen_core.h | 125 ---- .../cereal/serialization_eigen_geometry.h | 38 -- .../cereal/serialization_eigen_sparse.h | 79 --- ...serialization_local_parametrization_base.h | 26 - ...zation_local_parametrization_homogeneous.h | 27 - ...ization_local_parametrization_quaternion.h | 30 - .../cereal/serialization_node_base.h | 77 --- .../serialization_processor_odom2d_params.h | 29 - .../serialization_processor_odom3d_params.h | 27 - .../serialization_processor_params_base.h | 22 - .../serialization_sensor_intrinsic_base.h | 25 - .../serialization_sensor_odom2d_intrinsic.h | 26 - .../cereal/serialization_time_stamp.h | 31 - test/serialization/CMakeLists.txt | 4 - test/serialization/cereal/CMakeLists.txt | 43 -- .../cereal/gtest_serialization_eigen_core.cpp | 92 --- .../gtest_serialization_eigen_geometry.cpp | 72 --- .../gtest_serialization_eigen_sparse.cpp | 114 ---- ...st_serialization_local_parametrization.cpp | 571 ------------------ .../cereal/gtest_serialization_node_base.cpp | 247 -------- ..._serialization_processor_odom2d_params.cpp | 108 ---- ..._serialization_processor_odom3d_params.cpp | 246 -------- .../cereal/gtest_serialization_save_load.cpp | 202 ------- ...st_serialization_sensor_intrinsic_base.cpp | 233 ------- ..._serialization_sensor_odom2d_intrinsic.cpp | 256 -------- .../cereal/gtest_serialization_time_stamp.cpp | 62 -- 30 files changed, 3077 deletions(-) delete mode 100644 serialization/CMakeLists.txt delete mode 100644 serialization/cereal/CMakeLists.txt delete mode 100644 serialization/cereal/archives.h delete mode 100644 serialization/cereal/io.h delete mode 100644 serialization/cereal/serialization_eigen_core.h delete mode 100644 serialization/cereal/serialization_eigen_geometry.h delete mode 100644 serialization/cereal/serialization_eigen_sparse.h delete mode 100644 serialization/cereal/serialization_local_parametrization_base.h delete mode 100644 serialization/cereal/serialization_local_parametrization_homogeneous.h delete mode 100644 serialization/cereal/serialization_local_parametrization_quaternion.h delete mode 100644 serialization/cereal/serialization_node_base.h delete mode 100644 serialization/cereal/serialization_processor_odom2d_params.h delete mode 100644 serialization/cereal/serialization_processor_odom3d_params.h delete mode 100644 serialization/cereal/serialization_processor_params_base.h delete mode 100644 serialization/cereal/serialization_sensor_intrinsic_base.h delete mode 100644 serialization/cereal/serialization_sensor_odom2d_intrinsic.h delete mode 100644 serialization/cereal/serialization_time_stamp.h delete mode 100644 test/serialization/CMakeLists.txt delete mode 100644 test/serialization/cereal/CMakeLists.txt delete mode 100644 test/serialization/cereal/gtest_serialization_eigen_core.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_eigen_geometry.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_eigen_sparse.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_local_parametrization.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_node_base.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_save_load.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp delete mode 100644 test/serialization/cereal/gtest_serialization_time_stamp.cpp diff --git a/serialization/CMakeLists.txt b/serialization/CMakeLists.txt deleted file mode 100644 index a853ba8ec..000000000 --- a/serialization/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(cereal) diff --git a/serialization/cereal/CMakeLists.txt b/serialization/cereal/CMakeLists.txt deleted file mode 100644 index 1ae16bcd2..000000000 --- a/serialization/cereal/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) - -SET(HDRS_SERIALIZATION ${HDRS_SERIALIZATION} - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_eigen_core.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_eigen_geometry.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_eigen_sparse.h - - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_local_parametrization_base.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_local_parametrization_homogeneous.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_local_parametrization_quaternion.h - - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_node_base.h - - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_sensor_intrinsic_base.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_sensor_odom2d_intrinsic.h - - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_processor_params_base.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_processor_odom2d_params.h - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_processor_odom3d_params.h - - ${CMAKE_CURRENT_SOURCE_DIR}/serialization_time_stamp.h - - ${CMAKE_CURRENT_SOURCE_DIR}/archives.h - ${CMAKE_CURRENT_SOURCE_DIR}/io.h - - PARENT_SCOPE) diff --git a/serialization/cereal/archives.h b/serialization/cereal/archives.h deleted file mode 100644 index d8c16fd18..000000000 --- a/serialization/cereal/archives.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_ARCHIVE_H_ -#define _WOLF_IO_CEREAL_ARCHIVE_H_ - -#include <cereal/archives/binary.hpp> -#include <cereal/archives/json.hpp> -#include <cereal/archives/portable_binary.hpp> -#include <cereal/archives/xml.hpp> - -#endif /* _WOLF_IO_CEREAL_ARCHIVE_H_ */ diff --git a/serialization/cereal/io.h b/serialization/cereal/io.h deleted file mode 100644 index 8a8e58c2d..000000000 --- a/serialization/cereal/io.h +++ /dev/null @@ -1,229 +0,0 @@ -#ifndef _WOLF_SERIALIZATION_CEREAL_IO_H_ -#define _WOLF_SERIALIZATION_CEREAL_IO_H_ - -#include <stdexcept> -#include "archives.h" - -//#include <cereal/types/tuple.hpp> - -namespace wolf { -namespace serialization { - -/// @todo demangle typeid.name ? -template <typename T> -inline const std::string& type_name(const T&) -{ - static const std::string typeid_name = typeid(T).name(); - return typeid_name; -} - -inline std::string extension(const std::string& file) -{ - const std::size_t p = file.find_last_of("."); - return (p != std::string::npos) ? file.substr(p) : ""; -} - -//struct Extensions -//{ -// constexpr static const char* bin = ".bin"; -// constexpr static const char* json = ".json"; -// constexpr static const char* xml = ".xml"; - -// constexpr static const char* fall_back = json; -//}; - -//enum class Extensions2 : std::size_t -//{ -// BIN = 0, -//// CBIN, -// JSON, -//// TEXT, -// XML, -//}; - -//template <char... Chars> -//struct constexp_str -//{ -// using type = constexp_str<Chars...>; - -// virtual ~constexp_str() = default; - -// constexpr static const char value[sizeof...(Chars)+1] = {Chars..., '\0'}; - -// constexpr static std::size_t size() { return sizeof...(Chars); } - -// constexpr static const char* c_str() { return &value[0]; } - -//// constexpr static bool comp(const std::string& s) { return s == value; } - -// /*constexpr*/ bool operator == (const std::string& s) { return s == value; } - -// constexpr /*static*/ operator const char* () { return c_str(); } -// constexpr /*static*/ operator std::string& () { return c_str(); } -//}; - -struct Extensions -{ -// template <char... Chars> -// struct EXT : constexp_str<Chars...> -// { -// // -// }; - -// struct BIN : EXT<'.','b','i','n'> { }; -// struct XML : EXT<'.','x','m','l'> { }; -// struct JSON : EXT<'.','j','s','o','n'> { }; - - struct EXT { virtual ~EXT() = default; }; - - struct BIN : EXT - { - constexpr static const char* value = ".bin"; - bool operator == (const std::string& s) { return value == s; } - }; - - struct XML : EXT - { - constexpr static const char* value = ".xml"; - bool operator == (const std::string& s) { return value == s; } - }; - - struct JSON : EXT - { - constexpr static const char* value = ".json"; - bool operator == (const std::string& s) { return value == s; } - }; -}; - -template <typename Ar> -void serialize_pack(Ar&&) -{ - // end of expansion -} - -template <typename Ar, typename T, typename... Args> -void serialize_pack(Ar&& archive, T&& object, Args&&... args) -{ - archive( cereal::make_nvp(type_name(object), std::forward<T>(object)) ); - serialize_pack(archive, std::forward<Args>(args)...); -} - -template <typename Ar, typename S, typename T, typename... Args> -void serialize(S& stream, T&& object, Args&&... args) -{ - Ar archive(stream); - archive( cereal::make_nvp(type_name(object), std::forward<T>(object)) ); - - serialize_pack(archive, std::forward<Args>(args)...); -} - -template <typename EXT, typename InAr, typename OutAr> -struct Serializer -{ - template <typename S, typename... T> - static void serialize_in(S& stream, T&... object) - { - serialize<InAr>(stream, object...); - } - - template <typename S, typename... T> - static void serialize_out(S& stream, T&&... object) - { - serialize<OutAr>(stream, std::forward<T>(object)...); - } - - template <typename... T> - static void save(std::string filename, T&&... o) - { - const std::string ext = serialization::extension(filename); - - if (ext != EXT::value) filename += EXT::value; - - std::ofstream os(filename); - serialize_out(os, std::forward<T>(o)...); - } - - template <typename... T> - static void load(std::string filename, T&... o) - { - const std::string ext = serialization::extension(filename); - - if (ext != EXT::value) filename += EXT::value; - - std::ifstream is(filename); - serialize_in(is, o...); - } -}; - -using SerializerBin = Serializer<Extensions::BIN, - cereal::BinaryInputArchive, - cereal::BinaryOutputArchive>; - -using SerializerXML = Serializer<Extensions::XML, - cereal::XMLInputArchive, - cereal::XMLOutputArchive>; - -using SerializerJSON = Serializer<Extensions::JSON, - cereal::JSONInputArchive, - cereal::JSONOutputArchive>; - -} /* namespace serialization */ - -template <typename... T> -void save(const std::string& filename, T&&... o) -throw(std::runtime_error) -{ - const std::string ext = serialization::extension(filename); - - if (ext == serialization::Extensions::BIN::value) - { - serialization::SerializerBin::save(filename, std::forward<T>(o)...); - } - else if (ext == serialization::Extensions::JSON::value) - { - serialization::SerializerJSON::save(filename, std::forward<T>(o)...); - } - else if (ext == serialization::Extensions::XML::value) - { - serialization::SerializerXML::save(filename, std::forward<T>(o)...); - } - else if (ext == "") // falback is json - { - serialization::SerializerJSON::save(filename, std::forward<T>(o)...); - } - else - { - throw std::runtime_error("Unknown file extension : " + filename); - } -} - -template <typename... T> -void load(const std::string& filename, T&... o) -{ - const std::string ext = serialization::extension(filename); - - if (ext == serialization::Extensions::BIN::value) - { - serialization::SerializerBin::load(filename, o...); - } - else if (ext == serialization::Extensions::XML::value) - { - serialization::SerializerXML::load(filename, o...); - } - else if (ext == serialization::Extensions::JSON::value) - { - serialization::SerializerJSON::load(filename, o...); - } - else if (ext == "") // falback is json - { - serialization::SerializerJSON::load(filename, o...); - } - else - { - throw std::runtime_error("Unknown file extension : " + filename); - } -} - -} /* namespace wolf */ - -#endif /* _WOLF_SERIALIZATION_CEREAL_IO_H_ */ diff --git a/serialization/cereal/serialization_eigen_core.h b/serialization/cereal/serialization_eigen_core.h deleted file mode 100644 index 8fb5b9b0c..000000000 --- a/serialization/cereal/serialization_eigen_core.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_EIGEN_H_ -#define _WOLF_IO_CEREAL_EIGEN_H_ - -// Wolf includes -#include <Eigen/Dense> -#include <cereal/cereal.hpp> - -namespace cereal { - -/** - * @brief Save Eigen::Matrix<...> to text based archives - */ -template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -inline typename std::enable_if<!traits::is_output_serializable<BinaryData<_Scalar>, Archive>::value, -void>::type save(Archive& ar, - const Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& mat) -{ - decltype(mat.rows()) rows = mat.rows(); - decltype(mat.cols()) cols = mat.cols(); - - ar(cereal::make_nvp("rows", rows)); - ar(cereal::make_nvp("cols", cols)); - - /// @todo find out something - std::cerr << "Saving Eigen type to text-based archive is NOT supported !\n"; -} - -/** - * @brief Save Eigen::Matrix<...> to binary based archives - */ -template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -inline typename std::enable_if<traits::is_output_serializable<BinaryData<_Scalar>, Archive>::value, -void>::type save(Archive& ar, - const Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& mat) -{ - decltype(mat.rows()) rows = mat.rows(); - decltype(mat.cols()) cols = mat.cols(); - - ar(rows); - ar(cols); - - ar(binary_data(mat.data(), static_cast<std::size_t>(rows * cols * sizeof(_Scalar)))); -} - -/** - * @brief Load compile-time sized Eigen::Matrix from text based archives - */ -template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -inline typename std::enable_if<!traits::is_input_serializable<BinaryData<_Scalar>, Archive>::value and - _Rows != Eigen::Dynamic and _Cols != Eigen::Dynamic, -void>::type load(Archive& ar, - Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& mat) -{ - decltype(mat.rows()) rows; - decltype(mat.cols()) cols; - - ar(cereal::make_nvp("rows", rows)); - ar(cereal::make_nvp("cols", cols)); - - /// @todo find out something - std::cerr << "Saving Eigen type to text-based archive is NOT supported !\n"; -} - -/** - * @brief Load dynamic sized Eigen::Matrix from text based archives - */ -template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -inline typename std::enable_if<!traits::is_input_serializable<BinaryData<_Scalar>, Archive>::value and - (_Rows == Eigen::Dynamic or _Cols == Eigen::Dynamic), -void>::type load(Archive& ar, - Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& mat) -{ - decltype(mat.rows()) rows; - decltype(mat.cols()) cols; - - ar(cereal::make_nvp("rows", rows)); - ar(cereal::make_nvp("cols", cols)); - - /// @todo find out something - std::cerr << "Saving Eigen type to text-based archive is NOT supported !\n"; - - //mat.resize(rows, cols); -} - -/** - * @brief Load compile-time sized Eigen::Matrix from binary based archives - */ -template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -inline typename std::enable_if<traits::is_input_serializable<BinaryData<_Scalar>, Archive>::value and - _Rows != Eigen::Dynamic and _Cols != Eigen::Dynamic, -void>::type load(Archive& ar, - Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& mat) -{ - decltype(mat.rows()) rows; - decltype(mat.cols()) cols; - - ar(rows); - ar(cols); - - ar(binary_data(mat.data(), static_cast<std::size_t>(rows * cols * sizeof(_Scalar)))); -} - -/** - * @brief Load dynamic sized Eigen::Matrix from binary based archives - */ -template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -inline typename std::enable_if<traits::is_input_serializable<BinaryData<_Scalar>, Archive>::value and - (_Rows == Eigen::Dynamic or _Cols == Eigen::Dynamic), -void>::type load(Archive& ar, - Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& mat) -{ - decltype(mat.rows()) rows; - decltype(mat.cols()) cols; - - ar(rows); - ar(cols); - - mat.resize(rows, cols); - - ar(binary_data(mat.data(), static_cast<std::size_t>(rows * cols * sizeof(_Scalar)))); -} - -} // namespace cereal - -#endif /* _WOLF_IO_CEREAL_EIGEN_H_ */ diff --git a/serialization/cereal/serialization_eigen_geometry.h b/serialization/cereal/serialization_eigen_geometry.h deleted file mode 100644 index f5d3ac61f..000000000 --- a/serialization/cereal/serialization_eigen_geometry.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_EIGEN_GEOMETRY_H_ -#define _WOLF_IO_CEREAL_EIGEN_GEOMETRY_H_ - -// Wolf includes -#include <Eigen/Geometry> - -#include "serialization_eigen_core.h" - -namespace cereal { - -template<class Archive, typename _Scalar, int _Dim, int _Mode, int _Options> -inline void save(Archive& ar, - const Eigen::Transform<_Scalar, _Dim, _Mode, _Options>& t) -{ - save(ar, t.matrix()); -} - -template<class Archive, typename _Scalar, int _Dim, int _Mode, int _Options> -inline void load(Archive& ar, - Eigen::Transform<_Scalar, _Dim, _Mode, _Options>& t) -{ - load(ar, t.matrix()); -} - -template<class Archive, typename _Scalar> -void serialize(Archive & ar, - Eigen::Quaternion<_Scalar>& q, - const std::uint32_t /*version*/) -{ - ar(cereal::make_nvp("w", q.w())); - ar(cereal::make_nvp("x", q.x())); - ar(cereal::make_nvp("y", q.y())); - ar(cereal::make_nvp("z", q.z())); -} - -} // namespace cereal - -#endif /* _WOLF_IO_CEREAL_EIGEN_GEOMETRY_H_ */ diff --git a/serialization/cereal/serialization_eigen_sparse.h b/serialization/cereal/serialization_eigen_sparse.h deleted file mode 100644 index 9039b6920..000000000 --- a/serialization/cereal/serialization_eigen_sparse.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_EIGEN_GEOMETRY_H_ -#define _WOLF_IO_CEREAL_EIGEN_GEOMETRY_H_ - -// Wolf includes -#include <Eigen/Sparse> - -#include "serialization_eigen_core.h" -#include <cereal/types/vector.hpp> - -namespace cereal { - -template<class Archive, typename Scalar, typename Index> -inline void save(Archive& ar, - const Eigen::Triplet<Scalar, Index>& t) -{ - ar(cereal::make_nvp("row", t.row())); - ar(cereal::make_nvp("col", t.col())); - ar(cereal::make_nvp("value", t.value())); -} - -template<class Archive, typename Scalar, typename Index> -inline void load(Archive& ar, - Eigen::Triplet<Scalar, Index>& t) -{ - Index row, col; - Scalar value; - - ar(cereal::make_nvp("row", row)); - ar(cereal::make_nvp("col", col)); - ar(cereal::make_nvp("value", value)); - - t = Eigen::Triplet<Scalar, Index>(row, col, value); -} - -template <class Archive, typename _Scalar, int _Options, typename _Index> -void save(Archive& ar, - const Eigen::SparseMatrix<_Scalar, _Options, _Index>& m) -{ - _Index inner_size = m.innerSize(); - _Index outer_size = m.outerSize(); - - using Triplet = Eigen::Triplet<_Scalar>; - std::vector<Triplet> triplets; - - for (_Index i=0; i < outer_size; ++i) - for (typename Eigen::SparseMatrix<_Scalar, _Options, _Index>::InnerIterator it(m,i); it; ++it) - triplets.emplace_back( it.row(), it.col(), it.value() ); - - ar(cereal::make_nvp("inner_size", inner_size)); - ar(cereal::make_nvp("outer_size", outer_size)); - ar(cereal::make_nvp("triplets", triplets)); -} - -template <class Archive, typename _Scalar, int _Options, typename _Index> -void load(Archive& ar, - Eigen::SparseMatrix<_Scalar, _Options, _Index>& m) -{ - _Index inner_size; - _Index outer_size; - - ar(cereal::make_nvp("inner_size", inner_size)); - ar(cereal::make_nvp("outer_size", outer_size)); - - _Index rows = (m.IsRowMajor)? outer_size : inner_size; - _Index cols = (m.IsRowMajor)? inner_size : outer_size; - - m.resize(rows, cols); - - using Triplet = Eigen::Triplet<_Scalar>; - std::vector<Triplet> triplets; - - ar(cereal::make_nvp("triplets", triplets)); - - m.setFromTriplets(triplets.begin(), triplets.end()); -} - -} // namespace cereal - -#endif /* _WOLF_IO_CEREAL_EIGEN_GEOMETRY_H_ */ diff --git a/serialization/cereal/serialization_local_parametrization_base.h b/serialization/cereal/serialization_local_parametrization_base.h deleted file mode 100644 index b43c35673..000000000 --- a/serialization/cereal/serialization_local_parametrization_base.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_H_ -#define _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_H_ - -#include "core/state_block/local_parametrization_base.h" - -#include <cereal/cereal.hpp> -#include <cereal/types/polymorphic.hpp> - -namespace cereal { - -// Since classes deriving from LocalParametrizationBase -// have default constructor calling the non-default -// LocalParametrizationBase constructor with pre-defined -// arguments, there is nothing to save here. -template<class Archive> -inline void serialize( - Archive& /*ar*/, - wolf::LocalParametrizationBase& /*lpb*/, - std::uint32_t const /*file_version*/) -{ - // -} - -} //namespace cereal - -#endif /* _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_H_ */ diff --git a/serialization/cereal/serialization_local_parametrization_homogeneous.h b/serialization/cereal/serialization_local_parametrization_homogeneous.h deleted file mode 100644 index 9fcc656d5..000000000 --- a/serialization/cereal/serialization_local_parametrization_homogeneous.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_HOMOGENEOUS_H_ -#define _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_HOMOGENEOUS_H_ - -#include "core/local_parametrization_homogeneous.h" - -#include "serialization_local_parametrization_base.h" - -#include <cereal/cereal.hpp> - -CEREAL_REGISTER_TYPE_WITH_NAME(wolf::LocalParametrizationHomogeneous, - "LocalParametrizationHomogeneous"); - -namespace cereal { - -template<class Archive> -inline void serialize( - Archive& ar, - wolf::LocalParametrizationHomogeneous& lp, - std::uint32_t const /*file_version*/) -{ - ar( cereal::make_nvp("LocalParametrizationBase", - cereal::base_class<wolf::LocalParametrizationBase>(&lp)) ); -} - -} //namespace cereal - -#endif /* _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_HOMOGENEOUS_H_ */ diff --git a/serialization/cereal/serialization_local_parametrization_quaternion.h b/serialization/cereal/serialization_local_parametrization_quaternion.h deleted file mode 100644 index 66fe30a36..000000000 --- a/serialization/cereal/serialization_local_parametrization_quaternion.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ -#define WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ - -#include "core/local_parametrization_quaternion.h" - -#include "serialization_local_parametrization_base.h" - -#include <cereal/cereal.hpp> - -CEREAL_REGISTER_TYPE_WITH_NAME(wolf::LocalParametrizationQuaternion<wolf::DQ_LOCAL>, - "wolf_LocalParametrizationQuaternion_DQ_LOCAL") - -CEREAL_REGISTER_TYPE_WITH_NAME(wolf::LocalParametrizationQuaternion<wolf::DQ_GLOBAL>, - "wolf_LocalParametrizationQuaternion_DQ_GLOBAL") - -namespace cereal { - -template<class Archive, unsigned int DeltaReference> -inline void serialize( - Archive &ar, - wolf::LocalParametrizationQuaternion<DeltaReference> &lp, - const unsigned int /*file_version*/) -{ - ar( cereal::make_nvp("LocalParametrizationBase", - cereal::base_class<wolf::LocalParametrizationBase>(&lp)) ); -} - -} //namespace boost - -#endif /* WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ */ diff --git a/serialization/cereal/serialization_node_base.h b/serialization/cereal/serialization_node_base.h deleted file mode 100644 index a2c592d69..000000000 --- a/serialization/cereal/serialization_node_base.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_NODE_BASE_H_ -#define _WOLF_IO_CEREAL_NODE_BASE_H_ - -// Wolf includes -#include "core/node_base.h" - -#include <cereal/cereal.hpp> -#include <cereal/types/polymorphic.hpp> - -namespace wolf { - -struct NodeBase::Serializer { - - template <class Archive> - static void serialize(Archive& ar, NodeBase& o, std::uint32_t const /*version*/) - { - ar( cereal::make_nvp("node_class_", o.node_category_) ); - ar( cereal::make_nvp("node_type_", o.node_type_) ); - ar( cereal::make_nvp("node_name_", o.node_name_) ); - ar( cereal::make_nvp("node_id_", o.node_id_) ); - -// ar( cereal::make_nvp("problem_ptr_", o.problem_ptr_) ); - - // Not sure what to do with this guy ... - //ar( cereal::make_nvp("node_id_count_", o.node_id_count_) ); - } - - template <class Archive> - static void load_and_construct( Archive& ar, cereal::construct<wolf::NodeBase>& construct, - std::uint32_t const /*version*/ ) - { - decltype(std::declval<wolf::NodeBase>().getCategory()) nb_class; - decltype(std::declval<wolf::NodeBase>().getType()) nb_type; - decltype(std::declval<wolf::NodeBase>().getName()) nb_name; - - ar( cereal::make_nvp("node_class_", nb_class) ); - ar( cereal::make_nvp("node_type_", nb_type) ); - ar( cereal::make_nvp("node_name_", nb_name) ); - - construct( nb_class, nb_type, nb_name ); - - ar( cereal::make_nvp("node_id_", construct->node_id_) ); - -// ar( cereal::make_nvp("problem_ptr_", construct->problem_ptr_) ); - - // Not sure what to do with this guy ... - //ar( cereal::make_nvp("node_id_count_", construct->node_id_count_) ); - } -}; - -} // namespace wolf - -namespace cereal { - -/// @note No default constructor thus the need -/// for these specializations -template <> -struct LoadAndConstruct<wolf::NodeBase> -{ - template <class Archive> - static void load_and_construct( Archive& ar, - cereal::construct<wolf::NodeBase>& construct, - std::uint32_t const version ) - { - wolf::NodeBase::Serializer::load_and_construct(ar, construct, version); - } -}; - -template <class Archive> -void serialize(Archive& ar, wolf::NodeBase& o, std::uint32_t const version) -{ - wolf::NodeBase::Serializer::serialize(ar, o, version); -} - -} // namespace cereal - -#endif /* _WOLF_IO_CEREAL_NODE_BASE_H_ */ diff --git a/serialization/cereal/serialization_processor_odom2d_params.h b/serialization/cereal/serialization_processor_odom2d_params.h deleted file mode 100644 index dc0416b94..000000000 --- a/serialization/cereal/serialization_processor_odom2d_params.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM2D_PARAMS_H_ -#define _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM2D_PARAMS_H_ - -// Wolf includes -#include "core/processor/processor_odom_2D.h" -#include "serialization_processor_params_base.h" - -namespace cereal { - -template <class Archive> -void serialize(Archive& ar, wolf::ProcessorParamsOdom2D& o, - std::uint32_t const /*version*/) -{ - ar( cereal::make_nvp("ProcessorParamsBase", - cereal::base_class<wolf::ProcessorParamsBase>(&o)) ); - - ar( cereal::make_nvp("cov_det_th_", o.cov_det) ); - ar( cereal::make_nvp("dist_traveled_th_", o.dist_traveled_th_) ); - ar( cereal::make_nvp("elapsed_time_th_", o.elapsed_time_th_) ); - ar( cereal::make_nvp("theta_traveled_th_", o.theta_traveled_th_) ); - ar( cereal::make_nvp("unmeasured_perturbation_std_", - o.unmeasured_perturbation_std) ); -} - -} // namespace cereal - -CEREAL_REGISTER_TYPE_WITH_NAME(wolf::ProcessorParamsOdom2D, "ProcessorParamsOdom2D") - -#endif /* _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_ */ diff --git a/serialization/cereal/serialization_processor_odom3d_params.h b/serialization/cereal/serialization_processor_odom3d_params.h deleted file mode 100644 index d2fd7c077..000000000 --- a/serialization/cereal/serialization_processor_odom3d_params.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_ -#define _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_ - -// Wolf includes -#include "core/processor/processor_odom_3D.h" -#include "serialization_processor_params_base.h" - -namespace cereal { - -template <class Archive> -void serialize(Archive& ar, wolf::ProcessorParamsOdom3D& o, - std::uint32_t const /*version*/) -{ - ar( cereal::make_nvp("ProcessorParamsBase", - cereal::base_class<wolf::ProcessorParamsBase>(&o)) ); - - ar( cereal::make_nvp("angle_turned", o.angle_turned) ); - ar( cereal::make_nvp("dist_traveled", o.dist_traveled) ); - ar( cereal::make_nvp("max_buff_length", o.max_buff_length) ); - ar( cereal::make_nvp("max_time_span", o.max_time_span) ); -} - -} // namespace cereal - -CEREAL_REGISTER_TYPE_WITH_NAME(wolf::ProcessorParamsOdom3D, "ProcessorOdom3DParams") - -#endif /* _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_ */ diff --git a/serialization/cereal/serialization_processor_params_base.h b/serialization/cereal/serialization_processor_params_base.h deleted file mode 100644 index 03ea158c0..000000000 --- a/serialization/cereal/serialization_processor_params_base.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _WOLF_SERIALIZATION_CEREAL_PROCESSOR_PARAM_BASE_H_ -#define _WOLF_SERIALIZATION_CEREAL_PROCESSOR_PARAM_BASE_H_ - -// Wolf includes -#include "core/processor/processor_base.h" - -#include <cereal/cereal.hpp> -#include <cereal/types/polymorphic.hpp> - -namespace cereal { - -template <class Archive> -void serialize(Archive& ar, wolf::ProcessorParamsBase& o, - std::uint32_t const /*version*/) -{ - ar( cereal::make_nvp("type", o.type) ); - ar( cereal::make_nvp("name", o.name) ); -} - -} // namespace cereal - -#endif /* _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_ */ diff --git a/serialization/cereal/serialization_sensor_intrinsic_base.h b/serialization/cereal/serialization_sensor_intrinsic_base.h deleted file mode 100644 index 86b2a9b48..000000000 --- a/serialization/cereal/serialization_sensor_intrinsic_base.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_ -#define _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_ - -// Wolf includes -#include "core/sensor/sensor_base.h" - -#include <cereal/cereal.hpp> -#include <cereal/types/polymorphic.hpp> - -namespace cereal { - -template <class Archive> -void serialize(Archive& ar, wolf::IntrinsicsBase& o, - std::uint32_t const /*version*/) -{ - ar( cereal::make_nvp("type", o.type) ); - ar( cereal::make_nvp("name", o.name) ); -} - -} // namespace cereal - -// No need to register base -//CEREAL_REGISTER_TYPE_WITH_NAME(wolf::IntrinsicsBase, "IntrinsicsBase"); - -#endif /* _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_ */ diff --git a/serialization/cereal/serialization_sensor_odom2d_intrinsic.h b/serialization/cereal/serialization_sensor_odom2d_intrinsic.h deleted file mode 100644 index 17d4160b3..000000000 --- a/serialization/cereal/serialization_sensor_odom2d_intrinsic.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _WOLF_SERIALIZATION_CEREAL_SENSOR_ODOM2D_INTRINSIC_H_ -#define _WOLF_SERIALIZATION_CEREAL_SENSOR_ODOM2D_INTRINSIC_H_ - -// Wolf includes -#include "core/sensor/sensor_odom_2D.h" - -#include "serialization_sensor_intrinsic_base.h" - -namespace cereal { - -template <class Archive> -void serialize(Archive& ar, wolf::IntrinsicsOdom2D& o, - std::uint32_t const /*version*/) -{ - ar( cereal::make_nvp("IntrinsicsBase", - cereal::base_class<wolf::IntrinsicsBase>(&o)) ); - - ar( cereal::make_nvp("k_disp_to_disp", o.k_disp_to_disp) ); - ar( cereal::make_nvp("k_rot_to_rot", o.k_rot_to_rot) ); -} - -} // namespace cereal - -CEREAL_REGISTER_TYPE_WITH_NAME(wolf::IntrinsicsOdom2D, "IntrinsicsOdom2D") - -#endif /* _WOLF_SERIALIZATION_CEREAL_SENSOR_ODOM2D_INTRINSIC_H_ */ diff --git a/serialization/cereal/serialization_time_stamp.h b/serialization/cereal/serialization_time_stamp.h deleted file mode 100644 index f0c978d36..000000000 --- a/serialization/cereal/serialization_time_stamp.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _WOLF_IO_CEREAL_TIME_STAMP_H_ -#define _WOLF_IO_CEREAL_TIME_STAMP_H_ - -// Wolf includes -#include "core/time_stamp.h" - -#include <cereal/cereal.hpp> - -namespace cereal { - -/// @note serialization versionning raise -/// a compile error here... -template <class Archive> -void save(Archive& ar, const wolf::TimeStamp& o/*, std::uint32_t const version*/) -{ - ar( cereal::make_nvp("value", o.get()) ); -} - -template <class Archive> -void load(Archive& ar, wolf::TimeStamp& o/*, std::uint32_t const version*/) -{ - auto val = o.get(); - - ar( cereal::make_nvp("value", val) ); - - o.set(val); -} - -} // namespace cereal - -#endif /* _WOLF_IO_CEREAL_TIME_STAMP_H_ */ diff --git a/test/serialization/CMakeLists.txt b/test/serialization/CMakeLists.txt deleted file mode 100644 index 6902132bd..000000000 --- a/test/serialization/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# cereal -IF(cereal_FOUND) - add_subdirectory(cereal) -ENDIF(cereal_FOUND) diff --git a/test/serialization/cereal/CMakeLists.txt b/test/serialization/cereal/CMakeLists.txt deleted file mode 100644 index 733a36e25..000000000 --- a/test/serialization/cereal/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -# NodeBase serialization class test -wolf_add_gtest(gtest_cereal_serialization_node_base gtest_serialization_node_base.cpp) -target_link_libraries(gtest_cereal_serialization_node_base ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_local_parametrization - gtest_serialization_local_parametrization.cpp) -target_link_libraries(gtest_cereal_serialization_local_parametrization ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_sensor_intrinsic_base - gtest_serialization_sensor_intrinsic_base.cpp) -target_link_libraries(gtest_cereal_serialization_sensor_intrinsic_base ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_sensor_odom2d_intrinsic - gtest_serialization_sensor_odom2d_intrinsic.cpp) -target_link_libraries(gtest_cereal_serialization_sensor_odom2d_intrinsic ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_save_load - gtest_serialization_save_load.cpp) -target_link_libraries(gtest_cereal_serialization_save_load ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_processor_odom3d_params - gtest_serialization_processor_odom3d_params.cpp) -target_link_libraries(gtest_cereal_serialization_processor_odom3d_params ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_processor_odom2d_params - gtest_serialization_processor_odom2d_params.cpp) -target_link_libraries(gtest_cereal_serialization_processor_odom2d_params ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_time_stamp - gtest_serialization_time_stamp.cpp) -target_link_libraries(gtest_cereal_serialization_time_stamp ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_eigen_core - gtest_serialization_eigen_core.cpp) -target_link_libraries(gtest_cereal_serialization_eigen_core ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_eigen_geometry - gtest_serialization_eigen_geometry.cpp) -target_link_libraries(gtest_cereal_serialization_eigen_geometry ${PROJECT_NAME}) - -wolf_add_gtest(gtest_cereal_serialization_eigen_sparse - gtest_serialization_eigen_sparse.cpp) -target_link_libraries(gtest_cereal_serialization_eigen_sparse ${PROJECT_NAME}) diff --git a/test/serialization/cereal/gtest_serialization_eigen_core.cpp b/test/serialization/cereal/gtest_serialization_eigen_core.cpp deleted file mode 100644 index 28859dd7a..000000000 --- a/test/serialization/cereal/gtest_serialization_eigen_core.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_eigen_core.h" - -#include "../../../serialization/cereal/io.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationEigen : public testing::Test -{ -public: - - WolfTestCerealSerializationEigen() - { - nb_ = f_mat_t::Random(); - - dnb_ = d_mat_t::Random(10, 10); - } - - const std::string path_to_io = "/tmp/"; - const std::string filename = "serialization_eigen"; - - const std::vector<std::string> exts = {".bin"/*, ".xml", ".json"*/}; - - using f_mat_t = Eigen::Matrix<double, 5, 5>; - - using d_mat_t = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>; - - f_mat_t nb_; - - d_mat_t dnb_; -}; - -TEST_F(WolfTestCerealSerializationEigen, - CerealSerializationEigenFixedMat) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename + ext; - - ASSERT_NO_THROW( wolf::save( full_path, nb_ ) ) - << "Failed on saving " << full_path; - - WolfTestCerealSerializationEigen::f_mat_t nb_load; - - ASSERT_NO_THROW( wolf::load( full_path, nb_load ) ) - << "Failed on loading " << full_path; - - EXPECT_EQ(nb_load, nb_) << full_path; - } - - PRINTF("All good at " - "WolfTestCerealSerializationEigen::" - "CerealSerializationEigenFixedMat !\n"); -} - -TEST_F(WolfTestCerealSerializationEigen, - CerealSerializationEigenDynamicMat) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename + ext; - - ASSERT_NO_THROW( wolf::save( full_path, dnb_ ) ) - << "Failed on saving " << full_path; - - WolfTestCerealSerializationEigen::d_mat_t dnb_load; - - ASSERT_NO_THROW( wolf::load( full_path, dnb_load ) ) - << "Failed on loading " << full_path; - - EXPECT_EQ(dnb_load, dnb_) << full_path; - } - - PRINTF("All good at " - "WolfTestCerealSerializationEigen::" - "CerealSerializationEigenDynamicMat !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_eigen_geometry.cpp b/test/serialization/cereal/gtest_serialization_eigen_geometry.cpp deleted file mode 100644 index 87cafb4d5..000000000 --- a/test/serialization/cereal/gtest_serialization_eigen_geometry.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "core/common/wolf.h" -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_eigen_geometry.h" - -#include "../../../serialization/cereal/io.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationEigenGeo : public testing::Test -{ -public: - - WolfTestCerealSerializationEigenGeo() - { - iso_2d_ = Eigen::Isometry2d(Eigen::Rotation2Dd(0.17)); - iso_2d_.translation() << 0.5, 1.8; - - q_d_ = Eigen::Vector4d().setRandom().normalized(); - - iso_3d_ = Eigen::Isometry3d(q_d_); - iso_3d_.translation() << -7.245, +3.88, 0.0001; - } - - const std::string path_to_io = "/tmp/"; - const std::string filename = "serialization_eigen_geo"; - - const std::vector<std::string> exts = {".bin"/*, ".xml", ".json"*/}; - - Eigen::Isometry2d iso_2d_; - Eigen::Isometry3d iso_3d_; - Eigen::Quaterniond q_d_; -}; - -TEST_F(WolfTestCerealSerializationEigenGeo, - CerealSerializationEigenIso2d) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename + ext; - - ASSERT_NO_THROW( wolf::save( full_path, iso_2d_, iso_3d_, q_d_) ) - << "Failed on saving " << full_path; - - Eigen::Isometry2d iso_2d_loaded; - Eigen::Isometry3d iso_3d_loaded; - Eigen::Quaterniond q_d_loaded; - - ASSERT_NO_THROW( wolf::load( full_path, iso_2d_loaded, iso_3d_loaded, q_d_loaded) ) - << "Failed on loading " << full_path; - - ASSERT_MATRIX_APPROX(iso_2d_.matrix(), iso_2d_loaded.matrix(), wolf::Constants::EPS); - ASSERT_MATRIX_APPROX(iso_3d_.matrix(), iso_3d_loaded.matrix(), wolf::Constants::EPS); - ASSERT_MATRIX_APPROX(q_d_.coeffs(), q_d_loaded.coeffs(), wolf::Constants::EPS); - } - - PRINT_TEST_FINISHED; -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_eigen_sparse.cpp b/test/serialization/cereal/gtest_serialization_eigen_sparse.cpp deleted file mode 100644 index 0b803afdd..000000000 --- a/test/serialization/cereal/gtest_serialization_eigen_sparse.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "core/common/wolf.h" -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_eigen_sparse.h" - -#include "../../../serialization/cereal/io.h" - -#include <fstream> - -class WolfTestCerealSerializationEigenSparse : public testing::Test -{ -public: - - using triplet_t = Eigen::Triplet<double>; - using sparse_mat_t = Eigen::SparseMatrix<double>; - - WolfTestCerealSerializationEigenSparse() - { - triplet_list_.reserve(10); - - for(int i=0; i<10; ++i) - triplet_list_.emplace_back(i,i,i*5); - - m_.resize(10, 10); - m_.setFromTriplets(triplet_list_.begin(), triplet_list_.end()); - } - - const std::string path_to_io = "/tmp/"; - const std::string filename_t = "serialization_eigen_triplet"; - const std::string filename_m = "serialization_eigen_sparse"; - - const std::vector<std::string> exts = {".bin", ".xml", ".json"}; - - triplet_t t_ = Eigen::Triplet<double>(1, 2, 5.5); - - std::vector<triplet_t> triplet_list_; - Eigen::SparseMatrix<double> m_; -}; - -TEST_F(WolfTestCerealSerializationEigenSparse, - CerealSerializationEigenTriplet) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename_t + ext; - - ASSERT_NO_THROW( wolf::save( full_path, t_) ) - << "Failed on saving " << full_path; - - triplet_t t; - - ASSERT_NO_THROW( wolf::load( full_path, t) ) - << "Failed on loading " << full_path; - - ASSERT_EQ(t_.row(), t.row()); - ASSERT_EQ(t_.col(), t.col()); - ASSERT_EQ(t_.value(), t.value()); - } - - PRINT_TEST_FINISHED; -} - -TEST_F(WolfTestCerealSerializationEigenSparse, - CerealSerializationEigenSparseMatrix) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename_m + ext; - - ASSERT_NO_THROW( wolf::save( full_path, m_) ) - << "Failed on saving " << full_path; - - sparse_mat_t m; - - ASSERT_NO_THROW( wolf::load( full_path, m) ) - << "Failed on loading " << full_path; - - ASSERT_EQ(m_.rows(), m.rows()); - ASSERT_EQ(m_.cols(), m.cols()); - - std::vector<triplet_t> triplet_list; - triplet_list.reserve(10); - - for (int k=0; k<m.outerSize(); ++k) - for (sparse_mat_t::InnerIterator it(m, k); it; ++it) - { - triplet_list.emplace_back(it.row(), it.col(), it.value()); - } - - ASSERT_EQ(triplet_list_.size(), triplet_list.size()); - - for (int i=0; i<triplet_list_.size(); ++i) - { - ASSERT_EQ(triplet_list_[i].row(), triplet_list[i].row()); - ASSERT_EQ(triplet_list_[i].col(), triplet_list[i].col()); - ASSERT_EQ(triplet_list_[i].value(), triplet_list[i].value()); - } - } - - PRINT_TEST_FINISHED; -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_local_parametrization.cpp b/test/serialization/cereal/gtest_serialization_local_parametrization.cpp deleted file mode 100644 index 3df34a27a..000000000 --- a/test/serialization/cereal/gtest_serialization_local_parametrization.cpp +++ /dev/null @@ -1,571 +0,0 @@ -/* - * gtest_node_base_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_local_parametrization_quaternion.h" -#include "../../../serialization/cereal/serialization_local_parametrization_homogeneous.h" - -#include "../../../serialization/cereal/archives.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -/////////////////////////////////////// -/// LocalParametrizationHomogeneous /// -/////////////////////////////////////// - -const std::string path_to_io = "/tmp/"; - -TEST(TestSerialization, SerializationLocalParametrizationHomogeneousXML) -{ - { - std::ofstream os(path_to_io + "local_parametrization_serialization.xml"); - cereal::XMLOutputArchive archive(os); - - wolf::LocalParametrizationHomogeneous local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_serialization.xml"); - cereal::XMLInputArchive archive(is); - - wolf::LocalParametrizationHomogeneous local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousXML !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationHomogeneousPtrXML) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_ptr_serialization.xml"); - cereal::XMLOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationHomogeneous>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_ptr_serialization.xml"); - cereal::XMLInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationHomogeneous>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousPtrXML !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationHomogeneousJSON) -{ - { - std::ofstream os(path_to_io + "local_parametrization_serialization.json"); - cereal::JSONOutputArchive archive(os); - - wolf::LocalParametrizationHomogeneous local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_serialization.json"); - cereal::JSONInputArchive archive(is); - - wolf::LocalParametrizationHomogeneous local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousJSON !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationHomogeneousPtrJSON) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_ptr_serialization.json"); - cereal::JSONOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationHomogeneous>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_ptr_serialization.json"); - cereal::JSONInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationHomogeneous>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousPtrJSON !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationHomogeneousBIN) -{ - { - std::ofstream os(path_to_io + "local_parametrization_serialization.bin"); - cereal::BinaryOutputArchive archive(os); - - wolf::LocalParametrizationHomogeneous local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_serialization.bin"); - cereal::BinaryInputArchive archive(is); - - wolf::LocalParametrizationHomogeneous local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousBIN !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationHomogeneousPtrBIN) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_ptr_serialization.bin"); - cereal::BinaryOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationHomogeneous>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_ptr_serialization.bin"); - cereal::BinaryInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationHomogeneous>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousPtrBIN !\n"); -} - -////////////////////////////////////// -/// LocalParametrizationQuaternion /// -////////////////////////////////////// - -////////////////////////////////////// -/// LOCAL /// -////////////////////////////////////// - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionXML) -{ - { - std::ofstream os(path_to_io + "local_parametrization_quat_serialization.xml"); - cereal::XMLOutputArchive archive(os); - - wolf::LocalParametrizationQuaternionLocal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quat_serialization.xml"); - cereal::XMLInputArchive archive(is); - - wolf::LocalParametrizationQuaternionLocal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionXML !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionPtrXML) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_quat_ptr_serialization.xml"); - cereal::XMLOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationQuaternionLocal>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quat_ptr_serialization.xml"); - cereal::XMLInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationQuaternionLocal>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionPtrXML !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionJSON) -{ - { - std::ofstream os(path_to_io + "local_parametrization_quat_serialization.json"); - cereal::JSONOutputArchive archive(os); - - wolf::LocalParametrizationQuaternionLocal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quat_serialization.json"); - cereal::JSONInputArchive archive(is); - - wolf::LocalParametrizationQuaternionLocal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionJSON !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionPtrJSON) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_quat_ptr_serialization.json"); - cereal::JSONOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationQuaternionLocal>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quat_ptr_serialization.json"); - cereal::JSONInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationQuaternionLocal>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionPtrJSON !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionBIN) -{ - { - std::ofstream os(path_to_io + "local_parametrization_quat_serialization.bin"); - cereal::BinaryOutputArchive archive(os); - - wolf::LocalParametrizationQuaternionLocal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quat_serialization.bin"); - cereal::BinaryInputArchive archive(is); - - wolf::LocalParametrizationQuaternionLocal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionBIN !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionPtrBIN) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_quat_ptr_serialization.bin"); - cereal::BinaryOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationQuaternionLocal>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quat_ptr_serialization.bin"); - cereal::BinaryInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationQuaternionLocal>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionPtrBIN !\n"); -} - -////////////////////////////////////// -/// GLOBAL /// -////////////////////////////////////// - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalXML) -{ - { - std::ofstream os(path_to_io + "local_parametrization_quatg_serialization.xml"); - cereal::XMLOutputArchive archive(os); - - wolf::LocalParametrizationQuaternionGlobal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quatg_serialization.xml"); - cereal::XMLInputArchive archive(is); - - wolf::LocalParametrizationQuaternionGlobal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalXML !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalPtrXML) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_quatg_ptr_serialization.xml"); - cereal::XMLOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationQuaternionGlobal>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quatg_ptr_serialization.xml"); - cereal::XMLInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationQuaternionGlobal>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalPtrXML !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalJSON) -{ - { - std::ofstream os(path_to_io + "local_parametrization_quatg_serialization.json"); - cereal::JSONOutputArchive archive(os); - - wolf::LocalParametrizationQuaternionGlobal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quatg_serialization.json"); - cereal::JSONInputArchive archive(is); - - wolf::LocalParametrizationQuaternionGlobal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalJSON !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalPtrJSON) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_quatg_ptr_serialization.json"); - cereal::JSONOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationQuaternionGlobal>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quatg_ptr_serialization.json"); - cereal::JSONInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationQuaternionGlobal>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalPtrJSON !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalBIN) -{ - { - std::ofstream os(path_to_io + "local_parametrization_quatg_serialization.bin"); - cereal::BinaryOutputArchive archive(os); - - wolf::LocalParametrizationQuaternionGlobal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quatg_serialization.bin"); - cereal::BinaryInputArchive archive(is); - - wolf::LocalParametrizationQuaternionGlobal local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h.getGlobalSize(), 4); - ASSERT_EQ(local_param_h.getLocalSize(), 3); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalBIN !\n"); -} - -TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalPtrBIN) -{ - using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ; - - { - std::ofstream os(path_to_io + "local_parametrization_quatg_ptr_serialization.bin"); - cereal::BinaryOutputArchive archive(os); - - LocalParametrizationPtr local_param_h = - std::make_shared<wolf::LocalParametrizationQuaternionGlobal>(); - - ASSERT_NO_THROW( archive( local_param_h ) ); - } - - { - std::ifstream is(path_to_io + "local_parametrization_quatg_ptr_serialization.bin"); - cereal::BinaryInputArchive archive(is); - - LocalParametrizationPtr local_param_h; - - ASSERT_NO_THROW( archive( local_param_h ) ); - - ASSERT_EQ(local_param_h->getGlobalSize(), 4); - ASSERT_EQ(local_param_h->getLocalSize(), 3); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::LocalParametrizationQuaternionGlobal>(local_param_h) != nullptr); - } - - PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalPtrBIN !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_node_base.cpp b/test/serialization/cereal/gtest_serialization_node_base.cpp deleted file mode 100644 index 8b6140fe7..000000000 --- a/test/serialization/cereal/gtest_serialization_node_base.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - * gtest_node_base_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_node_base.h" - -#include "../../../serialization/cereal/archives.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationNodeBase : public testing::Test -{ -public: - - WolfTestCerealSerializationNodeBase() /*: - nb(nb_class), - nb_ptr(std::make_shared<wolf::NodeBase>(nb_class))*/ - { - // - } - - const std::string path_to_io = "/tmp/"; - - decltype(std::declval<wolf::NodeBase>().getCategory()) nb_class = "Foo"; - decltype(std::declval<wolf::NodeBase>().getCategory()) nb_type = "Bar"; - decltype(std::declval<wolf::NodeBase>().getCategory()) nb_name = "Dummy"; - - decltype(std::declval<wolf::NodeBase>().nodeId()) id; - -// wolf::NodeBase nb; -// wolf::NodeBasePtr nb_ptr; -}; - -TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBaseXML) -{ - { - // This guy has node_id = 1 - wolf::NodeBase nb(nb_class, nb_type, nb_name); - - id = nb.nodeId(); - - std::ofstream os(path_to_io + "node_base_serialization.xml"); - cereal::XMLOutputArchive xml_archive(os); - - ASSERT_NO_THROW( xml_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "node_base_serialization.xml"); - cereal::XMLInputArchive xml_archive(is); - - // This guy has node_id = 2 - wolf::NodeBase nb("SuperDummy"); - - ASSERT_NO_THROW( xml_archive( nb ) ); - - ASSERT_EQ(nb.getCategory(), nb_class); - ASSERT_EQ(nb.getType(), nb_type); - ASSERT_EQ(nb.getName(), nb_name); - ASSERT_EQ(nb.nodeId(), id); - } - - PRINTF("All good at " - "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBaseXML !\n"); -} - -TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBasePtrXML) -{ - { - // This guy has node_id = 3 - wolf::NodeBasePtr nb = std::make_shared<wolf::NodeBase>(nb_class, nb_type, nb_name); - - id = nb->nodeId(); - - std::ofstream os(path_to_io + "node_base_ptr_serialization.xml"); - cereal::XMLOutputArchive xml_archive(os); - - ASSERT_NO_THROW( xml_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "node_base_ptr_serialization.xml"); - cereal::XMLInputArchive xml_archive(is); - - wolf::NodeBasePtr nb; - - ASSERT_NO_THROW( xml_archive( nb ) ); - - ASSERT_EQ(nb->getCategory(), nb_class); - ASSERT_EQ(nb->getType(), nb_type); - ASSERT_EQ(nb->getName(), nb_name); - ASSERT_EQ(nb->nodeId(), id); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::NodeBase>(nb) != nullptr); - } - - PRINTF("All good at " - "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBasePtrXML !\n"); -} - -TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBaseJSON) -{ - { - wolf::NodeBase nb(nb_class, nb_type, nb_name); - - id = nb.nodeId(); - - std::ofstream os(path_to_io + "node_base_serialization.json"); - cereal::JSONOutputArchive json_archive(os); - - ASSERT_NO_THROW( json_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "node_base_serialization.json"); - cereal::JSONInputArchive json_archive(is); - - wolf::NodeBase blank("This guy has node_id = 1"); - wolf::NodeBase nb("SuperDummy"); - - ASSERT_NO_THROW( json_archive( nb ) ); - - ASSERT_EQ(nb.getCategory(), nb_class); - ASSERT_EQ(nb.getType(), nb_type); - ASSERT_EQ(nb.getName(), nb_name); - ASSERT_EQ(nb.nodeId(), id); - } - - PRINTF("All good at " - "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBaseJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBasePtrJSON) -{ - { - wolf::NodeBasePtr nb = std::make_shared<wolf::NodeBase>(nb_class, nb_type, nb_name); - - id = nb->nodeId(); - - std::ofstream os(path_to_io + "node_base_ptr_serialization.json"); - cereal::JSONOutputArchive json_archive(os); - - ASSERT_NO_THROW( json_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "node_base_ptr_serialization.json"); - cereal::JSONInputArchive json_archive(is); - - wolf::NodeBasePtr nb; - - ASSERT_NO_THROW( json_archive( nb ) ); - - ASSERT_EQ(nb->getCategory(), nb_class); - ASSERT_EQ(nb->getType(), nb_type); - ASSERT_EQ(nb->getName(), nb_name); - ASSERT_EQ(nb->nodeId(), id); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::NodeBase>(nb) != nullptr); - } - - PRINTF("All good at " - "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBasePtrJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBaseBinary) -{ - { - wolf::NodeBase nb(nb_class, nb_type, nb_name); - - id = nb.nodeId(); - - std::ofstream os(path_to_io + "node_base_serialization.bin"); - cereal::BinaryOutputArchive bin_archive(os); - - ASSERT_NO_THROW( bin_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "node_base_serialization.bin"); - cereal::BinaryInputArchive bin_archive(is); - - wolf::NodeBase blank("This guy has node_id = 1"); - wolf::NodeBase nb("SuperDummy"); - - ASSERT_NO_THROW( bin_archive( nb ) ); - - ASSERT_EQ(nb.getCategory(), nb_class); - ASSERT_EQ(nb.getType(), nb_type); - ASSERT_EQ(nb.getName(), nb_name); - ASSERT_EQ(nb.nodeId(), id); - } - - PRINTF("All good at " - "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBaseBinary !\n"); -} - -TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBasePtrBinary) -{ - { - wolf::NodeBasePtr nb = std::make_shared<wolf::NodeBase>(nb_class, nb_type, nb_name); - - id = nb->nodeId(); - - std::ofstream os(path_to_io + "node_base_ptr_serialization.bin"); - cereal::BinaryOutputArchive bin_archive(os); - - ASSERT_NO_THROW( bin_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "node_base_ptr_serialization.bin"); - cereal::BinaryInputArchive bin_archive(is); - - wolf::NodeBasePtr nb; - - ASSERT_NO_THROW( bin_archive( nb ) ); - - ASSERT_EQ(nb->getCategory(), nb_class); - ASSERT_EQ(nb->getType(), nb_type); - ASSERT_EQ(nb->getName(), nb_name); - ASSERT_EQ(nb->nodeId(), id); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::NodeBase>(nb) != nullptr); - } - - PRINTF("All good at " - "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBasePtrBinary !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp b/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp deleted file mode 100644 index 89fbef3d6..000000000 --- a/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_processor_odom2d_params.h" - -#include "../../../serialization/cereal/io.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationProcessorParamsOdom2D : public testing::Test -{ -public: - - WolfTestCerealSerializationProcessorParamsOdom2D() - { - nb_.name = "NAME"; - nb_.type = "ODOM 2D"; - - nb_.dist_traveled_th_ = 0.17; - nb_.theta_traveled_th_ = 0.3; - nb_.cov_det = 0.4; - nb_.elapsed_time_th_ = 1.5; - nb_.unmeasured_perturbation_std = 1e-5; - } - - const std::string path_to_io = "/tmp/"; - const std::string filename = "serialization_processor_odom2d_params"; - const std::string ptr_ext = "_ptr"; - - const std::vector<std::string> exts = {".bin", ".xml", ".json"}; - - wolf::ProcessorParamsOdom2D nb_; -}; - -TEST_F(WolfTestCerealSerializationProcessorParamsOdom2D, - CerealSerializationProcessorParamsOdom2D) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename + ext; - - ASSERT_NO_THROW( wolf::save( full_path, nb_ ) ) - << "Failed on saving " << full_path; - - wolf::ProcessorParamsOdom2D nb_load; - - ASSERT_NO_THROW( wolf::load( full_path, nb_load ) ) - << "Failed on loading " << full_path; - - ASSERT_EQ(nb_load.type, nb_.type) << full_path; - ASSERT_EQ(nb_load.name, nb_.name) << full_path; - ASSERT_EQ(nb_load.dist_traveled_th_, nb_.dist_traveled_th_) << full_path; - ASSERT_EQ(nb_load.theta_traveled_th_, nb_.theta_traveled_th_) << full_path; - ASSERT_EQ(nb_load.cov_det, nb_.cov_det) << full_path; - ASSERT_EQ(nb_load.unmeasured_perturbation_std, - nb_.unmeasured_perturbation_std) << full_path; - - /// Testing BasePtr - - const std::string ptr_full_path = path_to_io + filename + ptr_ext + ext; - - { - wolf::ProcessorParamsBasePtr nb = - std::make_shared<wolf::ProcessorParamsOdom2D>(nb_); - - ASSERT_NO_THROW( wolf::save( ptr_full_path, nb ) ) - << "Failed on saving " << ptr_full_path; - } - - { - wolf::ProcessorParamsBasePtr nb; - - ASSERT_NO_THROW( wolf::load( ptr_full_path, nb ) ) - << "Failed on loading " << ptr_full_path; - - wolf::ProcessorParamsOdom2DPtr nb_cast = - std::dynamic_pointer_cast<wolf::ProcessorParamsOdom2D>(nb); - - ASSERT_TRUE(nb_cast != nullptr) - << "Failed on casting " << ptr_full_path; - - ASSERT_EQ(nb_cast->type, nb_.type) << full_path; - ASSERT_EQ(nb_cast->name, nb_.name) << full_path; - ASSERT_EQ(nb_cast->dist_traveled_th_, nb_.dist_traveled_th_) << full_path; - ASSERT_EQ(nb_cast->theta_traveled_th_, nb_.theta_traveled_th_) << full_path; - ASSERT_EQ(nb_cast->cov_det, nb_.cov_det) << full_path; - ASSERT_EQ(nb_cast->unmeasured_perturbation_std, - nb_.unmeasured_perturbation_std) << full_path; - } - } - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorParamsOdom2D::" - "CerealSerializationProcessorParamsOdom2D !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp b/test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp deleted file mode 100644 index 41b2ca2f1..000000000 --- a/test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_processor_odom3d_params.h" - -#include "../../../serialization/cereal/io.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationProcessorOdom3DParams : public testing::Test -{ -public: - - WolfTestCerealSerializationProcessorOdom3DParams() - { - nb_.name = "NAME"; - //nb_.type = "ODOM 3D"; - - nb_.max_time_span = 1.5; - nb_.max_buff_length = 55.; - nb_.dist_traveled = .25; - nb_.angle_turned = .17; - } - - const std::string path_to_io = "/tmp/"; - - wolf::ProcessorParamsOdom3D nb_; -}; - -TEST_F(WolfTestCerealSerializationProcessorOdom3DParams, - CerealSerializationProcessorOdom3DParamsXML) -{ - const std::string filename(path_to_io + "params_odom3d_serialization.xml"); - - wolf::ProcessorParamsOdom3D nb_save; - nb_save.name = "NAME2"; - //nb_.type = "ODOM 3D"; - - nb_save.max_time_span = 2.5; - nb_save.max_buff_length = 52.; - nb_save.dist_traveled = .24; - nb_save.angle_turned = .18; - - ASSERT_NO_THROW( wolf::save( filename, nb_, nb_save, 10 ) ); - - { - wolf::ProcessorParamsOdom3D nb_load; - - ASSERT_NO_THROW( wolf::load( filename, nb_load ) ); - - ASSERT_EQ(nb_load.type, nb_.type); - ASSERT_EQ(nb_load.name, nb_.name); - ASSERT_EQ(nb_load.max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_load.max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_load.dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_load.angle_turned, nb_.angle_turned); - - wolf::ProcessorParamsOdom3D nb_load0, nb_load1; - int myint; - ASSERT_NO_THROW( wolf::load( filename, nb_load0, nb_load1, myint ) ); - - ASSERT_EQ(nb_load0.type, nb_.type); - ASSERT_EQ(nb_load0.name, nb_.name); - ASSERT_EQ(nb_load0.max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_load0.max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_load0.dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_load0.angle_turned, nb_.angle_turned); - - ASSERT_EQ(nb_load1.type, nb_save.type); - ASSERT_EQ(nb_load1.name, nb_save.name); - ASSERT_EQ(nb_load1.max_time_span, nb_save.max_time_span); - ASSERT_EQ(nb_load1.max_buff_length, nb_save.max_buff_length); - ASSERT_EQ(nb_load1.dist_traveled, nb_save.dist_traveled); - ASSERT_EQ(nb_load1.angle_turned, nb_save.angle_turned); - - ASSERT_EQ(myint, 10); - } - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorOdom3DParams::" - "CerealSerializationProcessorOdom3DParamsXML !\n"); -} - -TEST_F(WolfTestCerealSerializationProcessorOdom3DParams, - CerealSerializationProcessorParamsOdom3DPtrXML) -{ - const std::string filename(path_to_io + "params_odom3d_ptr_serialization.xml"); - - { - wolf::ProcessorParamsBasePtr nb = - std::make_shared<wolf::ProcessorParamsOdom3D>(nb_); - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::ProcessorParamsBasePtr nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - wolf::ProcessorParamsOdom3DPtr nb_cast = - std::dynamic_pointer_cast<wolf::ProcessorParamsOdom3D>(nb); - - ASSERT_TRUE(nb_cast != nullptr); - - ASSERT_EQ(nb_cast->type, nb_.type); - ASSERT_EQ(nb_cast->name, nb_.name); - ASSERT_EQ(nb_cast->max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_cast->max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_cast->dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_cast->angle_turned, nb_.angle_turned); - } - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorOdom3DParams::" - "CerealSerializationProcessorParamsOdom3DPtrXML !\n"); -} - -TEST_F(WolfTestCerealSerializationProcessorOdom3DParams, - CerealSerializationProcessorOdom3DParamsJSON) -{ - const std::string filename(path_to_io + "params_odom3d_serialization.json"); - - ASSERT_NO_THROW( wolf::save( filename, nb_ ) ); - - wolf::ProcessorParamsOdom3D nb_load; - - ASSERT_NO_THROW( wolf::load( filename, nb_load ) ); - - ASSERT_EQ(nb_load.type, nb_.type); - ASSERT_EQ(nb_load.name, nb_.name); - ASSERT_EQ(nb_load.max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_load.max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_load.dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_load.angle_turned, nb_.angle_turned); - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorOdom3DParams::" - "CerealSerializationProcessorOdom3DParamsJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationProcessorOdom3DParams, - CerealSerializationProcessorParamsOdom3DPtrJSON) -{ - const std::string filename(path_to_io + "params_odom3d_ptr_serialization.json"); - - { - wolf::ProcessorParamsBasePtr nb = - std::make_shared<wolf::ProcessorParamsOdom3D>(nb_); - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::ProcessorParamsBasePtr nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - wolf::ProcessorParamsOdom3DPtr nb_cast = - std::dynamic_pointer_cast<wolf::ProcessorParamsOdom3D>(nb); - - ASSERT_TRUE(nb_cast != nullptr); - - ASSERT_EQ(nb_cast->type, nb_.type); - ASSERT_EQ(nb_cast->name, nb_.name); - ASSERT_EQ(nb_cast->max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_cast->max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_cast->dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_cast->angle_turned, nb_.angle_turned); - } - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorOdom3DParams::" - "CerealSerializationProcessorParamsOdom3DPtrJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationProcessorOdom3DParams, - CerealSerializationProcessorOdom3DParamsBinary) -{ - const std::string filename(path_to_io + "params_odom3d_serialization.bin"); - - ASSERT_NO_THROW( wolf::save( filename, nb_ ) ); - - wolf::ProcessorParamsOdom3D nb_load; - - ASSERT_NO_THROW( wolf::load( filename, nb_load ) ); - - ASSERT_EQ(nb_load.type, nb_.type); - ASSERT_EQ(nb_load.name, nb_.name); - ASSERT_EQ(nb_load.max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_load.max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_load.dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_load.angle_turned, nb_.angle_turned); - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorOdom3DParams::" - "CerealSerializationProcessorOdom3DParamsBinary !\n"); -} - -TEST_F(WolfTestCerealSerializationProcessorOdom3DParams, - CerealSerializationProcessorParamsOdom3DPtrBinary) -{ - const std::string filename(path_to_io + "params_odom3d_ptr_serialization.bin"); - - { - wolf::ProcessorParamsBasePtr nb = - std::make_shared<wolf::ProcessorParamsOdom3D>(nb_); - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::ProcessorParamsBasePtr nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - wolf::ProcessorParamsOdom3DPtr nb_cast = - std::dynamic_pointer_cast<wolf::ProcessorParamsOdom3D>(nb); - - ASSERT_TRUE(nb_cast != nullptr); - - ASSERT_EQ(nb_cast->type, nb_.type); - ASSERT_EQ(nb_cast->name, nb_.name); - ASSERT_EQ(nb_cast->max_time_span, nb_.max_time_span); - ASSERT_EQ(nb_cast->max_buff_length, nb_.max_buff_length); - ASSERT_EQ(nb_cast->dist_traveled, nb_.dist_traveled); - ASSERT_EQ(nb_cast->angle_turned, nb_.angle_turned); - } - - PRINTF("All good at " - "WolfTestCerealSerializationProcessorOdom3DParams::" - "CerealSerializationProcessorParamsOdom3DPtrBinary !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_save_load.cpp b/test/serialization/cereal/gtest_serialization_save_load.cpp deleted file mode 100644 index 23241af48..000000000 --- a/test/serialization/cereal/gtest_serialization_save_load.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/io.h" -#include "../../../serialization/cereal/serialization_sensor_odom2d_intrinsic.h" - -#include "../../../serialization/cereal/archives.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -namespace wolf { - -using IntrinsicsOdom2DPtr = std::shared_ptr<IntrinsicsOdom2D>; - -} - -class WolfTestCerealSerializationSaveLoad : public testing::Test -{ -public: - - WolfTestCerealSerializationSaveLoad() - { - // - } - - const std::string path_to_io = "/tmp/"; - - decltype(std::declval<wolf::IntrinsicsOdom2D>().type) nb_type = "TYPE"; - decltype(std::declval<wolf::IntrinsicsOdom2D>().name) nb_name = "NAME"; - decltype(std::declval<wolf::IntrinsicsOdom2D>().k_disp_to_disp) nb_k_disp_to_disp = 0.54; - decltype(std::declval<wolf::IntrinsicsOdom2D>().k_rot_to_rot) nb_k_rot_to_rot = 0.18; -}; - -TEST_F(WolfTestCerealSerializationSaveLoad, CerealSerializationSaveLoadExtension) -{ - const std::string xml = "/test/filename.xml"; - const std::string bin = "/test/filename.bin"; - const std::string json = "/test/filename.json"; - - ASSERT_EQ(wolf::serialization::extension(xml), ".xml"); - ASSERT_EQ(wolf::serialization::extension(bin), ".bin"); - ASSERT_EQ(wolf::serialization::extension(json), ".json"); -} - -TEST_F(WolfTestCerealSerializationSaveLoad, - CerealSerializationSaveLoadXML) -{ - const std::string filename = path_to_io + "save_load_serialization.xml"; - - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_type; - nb.name = nb_name; - nb.k_disp_to_disp = nb_k_disp_to_disp; - nb.k_rot_to_rot = nb_k_rot_to_rot; - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationSaveLoad::" - "CerealSerializationSaveLoadXML !\n"); -} - -TEST_F(WolfTestCerealSerializationSaveLoad, - CerealSerializationSaveLoadJSON) -{ - const std::string filename = path_to_io + "save_load_serialization.json"; - - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_type; - nb.name = nb_name; - nb.k_disp_to_disp = nb_k_disp_to_disp; - nb.k_rot_to_rot = nb_k_rot_to_rot; - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationSaveLoad::" - "CerealSerializationSaveLoadJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationSaveLoad, - CerealSerializationSaveLoadBinary) -{ - const std::string filename = path_to_io + "save_load_serialization.bin"; - - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_type; - nb.name = nb_name; - nb.k_disp_to_disp = nb_k_disp_to_disp; - nb.k_rot_to_rot = nb_k_rot_to_rot; - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationSaveLoad::" - "CerealSerializationSaveLoadBinary !\n"); -} - -TEST_F(WolfTestCerealSerializationSaveLoad, - CerealSerializationSaveLoadNoExt) -{ - const std::string filename = path_to_io + "save_load_serialization_no_ext"; - - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_type; - nb.name = nb_name; - nb.k_disp_to_disp = nb_k_disp_to_disp; - nb.k_rot_to_rot = nb_k_rot_to_rot; - - ASSERT_NO_THROW( wolf::save( filename, nb ) ); - } - - { - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( wolf::load( filename, nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationSaveLoad::" - "CerealSerializationSaveLoadNoExt !\n"); -} - -TEST_F(WolfTestCerealSerializationSaveLoad, - CerealSerializationSaveLoadUnknownExt) -{ - const std::string filename = path_to_io + "save_load_serialization.foo"; - - { - wolf::IntrinsicsOdom2D nb; - - ASSERT_THROW( wolf::save( filename, nb ), std::runtime_error ); - } - - { - wolf::IntrinsicsOdom2D nb; - - ASSERT_THROW( wolf::load( filename, nb ), std::runtime_error ); - } - - PRINTF("All good at " - "WolfTestCerealSerializationSaveLoad::" - "CerealSerializationSaveLoadUnknownExt !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp b/test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp deleted file mode 100644 index a8a67dc19..000000000 --- a/test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - * gtest_intrinsics_base_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_sensor_intrinsic_base.h" - -#include "../../../serialization/cereal/archives.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationIntrinsicsBase : public testing::Test -{ -public: - - WolfTestCerealSerializationIntrinsicsBase() - { - // - } - - const std::string path_to_io = "/tmp/"; - - decltype(std::declval<wolf::IntrinsicsBase>().type) nb_type = "TYPE"; - decltype(std::declval<wolf::IntrinsicsBase>().name) nb_name = "NAME"; -}; - -TEST_F(WolfTestCerealSerializationIntrinsicsBase, - CerealSerializationIntrinsicsBaseXML) -{ - { - wolf::IntrinsicsBase nb; - nb.type = nb_type; - nb.name = nb_name; - - std::ofstream os(path_to_io + "intrinsics_base_serialization.xml"); - cereal::XMLOutputArchive xml_archive(os); - - ASSERT_NO_THROW( xml_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_base_serialization.xml"); - cereal::XMLInputArchive xml_archive(is); - - wolf::IntrinsicsBase nb; - - ASSERT_NO_THROW( xml_archive( nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsBase::" - "CerealSerializationIntrinsicsBaseXML !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsBase, - CerealSerializationIntrinsicsBasePtrXML) -{ - { - wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsBase>(); - nb->name = nb_name; - nb->type = nb_type; - - std::ofstream os(path_to_io + "intrinsics_base_ptr_serialization.xml"); - cereal::XMLOutputArchive xml_archive(os); - - ASSERT_NO_THROW( xml_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_base_ptr_serialization.xml"); - cereal::XMLInputArchive xml_archive(is); - - wolf::IntrinsicsBasePtr nb; - - ASSERT_NO_THROW( xml_archive( nb ) ); - - ASSERT_EQ(nb->type, nb_type); - ASSERT_EQ(nb->name, nb_name); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::IntrinsicsBase>(nb) != nullptr); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsBase::" - "CerealSerializationIntrinsicsBasePtrXML !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsBase, - CerealSerializationIntrinsicsBaseJSON) -{ - { - wolf::IntrinsicsBase nb; - nb.type = nb_type; - nb.name = nb_name; - - std::ofstream os(path_to_io + "intrinsics_base_serialization.json"); - cereal::JSONOutputArchive json_archive(os); - - ASSERT_NO_THROW( json_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_base_serialization.json"); - cereal::JSONInputArchive json_archive(is); - - wolf::IntrinsicsBase nb; - - ASSERT_NO_THROW( json_archive( nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsBase::" - "CerealSerializationIntrinsicsBaseJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsBase, - CerealSerializationIntrinsicsBasePtrJSON) -{ - { - wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsBase>(); - nb->name = nb_name; - nb->type = nb_type; - - std::ofstream os(path_to_io + "intrinsics_base_ptr_serialization.json"); - cereal::JSONOutputArchive json_archive(os); - - ASSERT_NO_THROW( json_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_base_ptr_serialization.json"); - cereal::JSONInputArchive json_archive(is); - - wolf::IntrinsicsBasePtr nb; - - ASSERT_NO_THROW( json_archive( nb ) ); - - ASSERT_EQ(nb->type, nb_type); - ASSERT_EQ(nb->name, nb_name); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::IntrinsicsBase>(nb) != nullptr); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsBase::" - "CerealSerializationIntrinsicsBasePtrJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsBase, - CerealSerializationIntrinsicsBaseBinary) -{ - { - wolf::IntrinsicsBase nb; - nb.type = nb_type; - nb.name = nb_name; - - std::ofstream os(path_to_io + "intrinsics_base_serialization.bin"); - cereal::BinaryOutputArchive bin_archive(os); - - ASSERT_NO_THROW( bin_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_base_serialization.bin"); - cereal::BinaryInputArchive bin_archive(is); - - wolf::IntrinsicsBase nb; - - ASSERT_NO_THROW( bin_archive( nb ) ); - - ASSERT_EQ(nb.type, nb_type); - ASSERT_EQ(nb.name, nb_name); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsBase::" - "CerealSerializationIntrinsicsBaseBinary !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsBase, CerealSerializationIntrinsicsBasePtrBinary) -{ - { - wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsBase>(); - nb->name = nb_name; - nb->type = nb_type; - - std::ofstream os(path_to_io + "intrinsics_base_ptr_serialization.bin"); - cereal::BinaryOutputArchive bin_archive(os); - - ASSERT_NO_THROW( bin_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_base_ptr_serialization.bin"); - cereal::BinaryInputArchive bin_archive(is); - - wolf::IntrinsicsBasePtr nb; - - ASSERT_NO_THROW( bin_archive( nb ) ); - - ASSERT_EQ(nb->type, nb_type); - ASSERT_EQ(nb->name, nb_name); - - ASSERT_TRUE( - std::dynamic_pointer_cast< - wolf::IntrinsicsBase>(nb) != nullptr); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsBase::" - "CerealSerializationIntrinsicsBasePtrBinary !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp b/test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp deleted file mode 100644 index c5891c3d9..000000000 --- a/test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_sensor_odom2d_intrinsic.h" - -#include "../../../serialization/cereal/archives.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -namespace wolf { - -using IntrinsicsOdom2DPtr = std::shared_ptr<IntrinsicsOdom2D>; - -} - -class WolfTestCerealSerializationIntrinsicsOdom2D : public testing::Test -{ -public: - - WolfTestCerealSerializationIntrinsicsOdom2D() - { - nb_.k_disp_to_disp = 0.54; - nb_.k_rot_to_rot = 0.18; - nb_.name = "NAME"; - nb_.type = "TYPE"; - } - - const std::string path_to_io = "/tmp/"; - - wolf::IntrinsicsOdom2D nb_; -}; - -TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, - CerealSerializationIntrinsicsOdom2DXML) -{ - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_.type; - nb.name = nb_.name; - nb.k_disp_to_disp = nb_.k_disp_to_disp; - nb.k_rot_to_rot = nb_.k_rot_to_rot; - - std::ofstream os(path_to_io + "intrinsics_odom2d_serialization.xml"); - cereal::XMLOutputArchive xml_archive(os); - - ASSERT_NO_THROW( xml_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_odom2d_serialization.xml"); - cereal::XMLInputArchive xml_archive(is); - - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( xml_archive( nb ) ); - - ASSERT_EQ(nb.type, nb_.type); - ASSERT_EQ(nb.name, nb_.name); - ASSERT_EQ(nb.k_disp_to_disp, nb_.k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_.k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsOdom2D::" - "CerealSerializationIntrinsicsOdom2DXML !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, - CerealSerializationIntrinsicsOdom2DPtrXML) -{ - { - wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsOdom2D>(nb_); - - std::ofstream os(path_to_io + "intrinsics_odom2d_ptr_serialization.xml"); - cereal::XMLOutputArchive xml_archive(os); - - ASSERT_NO_THROW( xml_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_odom2d_ptr_serialization.xml"); - cereal::XMLInputArchive xml_archive(is); - - wolf::IntrinsicsBasePtr nb; - - ASSERT_NO_THROW( xml_archive( nb ) ); - - wolf::IntrinsicsOdom2DPtr nb_cast = - std::dynamic_pointer_cast<wolf::IntrinsicsOdom2D>(nb); - - ASSERT_TRUE(nb_cast != nullptr); - - ASSERT_EQ(nb_cast->type, nb_.type); - ASSERT_EQ(nb_cast->name, nb_.name); - ASSERT_EQ(nb_cast->k_disp_to_disp, nb_.k_disp_to_disp); - ASSERT_EQ(nb_cast->k_rot_to_rot, nb_.k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsOdom2D::" - "CerealSerializationIntrinsicsOdom2DPtrXML !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, - CerealSerializationIntrinsicsOdom2DJSON) -{ - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_.type; - nb.name = nb_.name; - nb.k_disp_to_disp = nb_.k_disp_to_disp; - nb.k_rot_to_rot = nb_.k_rot_to_rot; - - std::ofstream os(path_to_io + "intrinsics_odom2d_serialization.json"); - cereal::JSONOutputArchive json_archive(os); - - ASSERT_NO_THROW( json_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_odom2d_serialization.json"); - cereal::JSONInputArchive json_archive(is); - - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( json_archive( nb ) ); - - ASSERT_EQ(nb.type, nb_.type); - ASSERT_EQ(nb.name, nb_.name); - ASSERT_EQ(nb.k_disp_to_disp, nb_.k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_.k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsOdom2D::" - "CerealSerializationIntrinsicsOdom2DJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, - CerealSerializationIntrinsicsOdom2DPtrJSON) -{ - { - wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsOdom2D>(nb_); - - std::ofstream os(path_to_io + "intrinsics_odom2d_ptr_serialization.json"); - cereal::JSONOutputArchive json_archive(os); - - ASSERT_NO_THROW( json_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_odom2d_ptr_serialization.json"); - cereal::JSONInputArchive json_archive(is); - - wolf::IntrinsicsBasePtr nb; - - ASSERT_NO_THROW( json_archive( nb ) ); - - wolf::IntrinsicsOdom2DPtr nb_cast = - std::dynamic_pointer_cast<wolf::IntrinsicsOdom2D>(nb); - - ASSERT_TRUE(nb_cast != nullptr); - - ASSERT_EQ(nb_cast->type, nb_.type); - ASSERT_EQ(nb_cast->name, nb_.name); - ASSERT_EQ(nb_cast->k_disp_to_disp, nb_.k_disp_to_disp); - ASSERT_EQ(nb_cast->k_rot_to_rot, nb_.k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsOdom2D::" - "CerealSerializationIntrinsicsOdom2DPtrJSON !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, - CerealSerializationIntrinsicsOdom2DBinary) -{ - { - wolf::IntrinsicsOdom2D nb; - nb.type = nb_.type; - nb.name = nb_.name; - nb.k_disp_to_disp = nb_.k_disp_to_disp; - nb.k_rot_to_rot = nb_.k_rot_to_rot; - - std::ofstream os(path_to_io + "intrinsics_odom2d_serialization.bin"); - cereal::BinaryOutputArchive bin_archive(os); - - ASSERT_NO_THROW( bin_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_odom2d_serialization.bin"); - cereal::BinaryInputArchive bin_archive(is); - - wolf::IntrinsicsOdom2D nb; - - ASSERT_NO_THROW( bin_archive( nb ) ); - - ASSERT_EQ(nb.type, nb_.type); - ASSERT_EQ(nb.name, nb_.name); - ASSERT_EQ(nb.k_disp_to_disp, nb_.k_disp_to_disp); - ASSERT_EQ(nb.k_rot_to_rot, nb_.k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsOdom2D::" - "CerealSerializationIntrinsicsOdom2DBinary !\n"); -} - -TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, CerealSerializationIntrinsicsOdom2DPtrBinary) -{ - { - wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsOdom2D>(nb_); - - std::ofstream os(path_to_io + "intrinsics_odom2d_ptr_serialization.bin"); - cereal::BinaryOutputArchive bin_archive(os); - - ASSERT_NO_THROW( bin_archive( nb ) ); - } - - { - std::ifstream is(path_to_io + "intrinsics_odom2d_ptr_serialization.bin"); - cereal::BinaryInputArchive bin_archive(is); - - wolf::IntrinsicsBasePtr nb; - - ASSERT_NO_THROW( bin_archive( nb ) ); - - wolf::IntrinsicsOdom2DPtr nb_cast = - std::dynamic_pointer_cast<wolf::IntrinsicsOdom2D>(nb); - - ASSERT_TRUE(nb_cast != nullptr); - - ASSERT_EQ(nb_cast->type, nb_.type); - ASSERT_EQ(nb_cast->name, nb_.name); - ASSERT_EQ(nb_cast->k_disp_to_disp, nb_.k_disp_to_disp); - ASSERT_EQ(nb_cast->k_rot_to_rot, nb_.k_rot_to_rot); - } - - PRINTF("All good at " - "WolfTestCerealSerializationIntrinsicsOdom2D::" - "CerealSerializationIntrinsicsOdom2DPtrBinary !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/serialization/cereal/gtest_serialization_time_stamp.cpp b/test/serialization/cereal/gtest_serialization_time_stamp.cpp deleted file mode 100644 index 8dc4cd479..000000000 --- a/test/serialization/cereal/gtest_serialization_time_stamp.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * gtest_intrinsics_odom2d_serialization.cpp - * - * Created on: Jul 16, 2017 - * Author: Jeremie Deray - */ - -#include "../../utils_gtest.h" - -#include "../../../serialization/cereal/serialization_time_stamp.h" - -#include "../../../serialization/cereal/io.h" - -#include <cereal/types/memory.hpp> -#include <fstream> - -class WolfTestCerealSerializationTimeStamp : public testing::Test -{ -public: - - WolfTestCerealSerializationTimeStamp() - { - nb_.setToNow(); - } - - const std::string path_to_io = "/tmp/"; - const std::string filename = "serialization_time_stamp"; - const std::string ptr_ext = "_ptr"; - - const std::vector<std::string> exts = {".bin", ".xml", ".json"}; - - wolf::TimeStamp nb_; -}; - -TEST_F(WolfTestCerealSerializationTimeStamp, - CerealSerializationTimeStamp) -{ - for (const auto ext : exts) - { - const std::string full_path = path_to_io + filename + ext; - - ASSERT_NO_THROW( wolf::save( full_path, nb_ ) ) - << "Failed on saving " << full_path; - - wolf::TimeStamp nb_load; - - ASSERT_NO_THROW( wolf::load( full_path, nb_load ) ) - << "Failed on loading " << full_path; - - ASSERT_EQ(nb_load, nb_) << full_path; - } - - PRINTF("All good at " - "WolfTestCerealSerializationTimeStamp::" - "CerealSerializationTimeStamp !\n"); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} -- GitLab