From d7829995ee0384cbfdfe25f294335ff0168e5a32 Mon Sep 17 00:00:00 2001
From: Joaquim Casals <jcasals@iri.upc.edu>
Date: Thu, 25 Apr 2019 15:28:29 +0200
Subject: [PATCH] Adapted branch to new code organization

---
 CMakeLists.txt                                |  18 +-
 hello_plugin/hello_plugin.cpp                 |  20 +-
 hello_plugin/params_autoconf.cpp              |   6 +-
 hello_wolf/sensor_range_bearing.h             |   2 +-
 include/base/common/wolf.h                    |   2 +-
 include/base/problem/problem.h                |   2 +-
 include/base/processor/processor_base.h       |   2 +-
 include/base/processor/processor_diff_drive.h |   2 +-
 .../processor_frame_nearest_neighbor_filter.h |   2 +-
 include/base/processor/processor_motion.h     |   2 +-
 include/base/processor/processor_odom_2D.h    |   2 +-
 .../base/processor/processor_params_image.h   |   2 +-
 include/base/processor/processor_tracker.h    |   5 +-
 .../processor_tracker_feature_corner.h        |   2 +-
 .../processor_tracker_feature_trifocal.h      |   2 +-
 include/base/sensor/sensor_GPS_fix.h          |   2 +-
 include/base/sensor/sensor_IMU.h              |   2 +-
 include/base/sensor/sensor_camera.h           |   2 +-
 include/base/sensor/sensor_diff_drive.h       |   2 +-
 include/base/sensor/sensor_odom_2D.h          |   2 +-
 include/base/sensor/sensor_odom_3D.h          |   2 +-
 include/base/solver/solver_factory.h          |   2 +-
 include/base/three_D_tools.h                  | 375 ------------------
 include/base/{ => utils}/converter.h          |   0
 include/base/{ => utils}/loader.hpp           |   0
 include/base/{ => utils}/params_server.hpp    |   2 +-
 test/gtest_converter.cpp                      |   2 +-
 test/gtest_param_server.cpp                   |   6 +-
 test/gtest_parser_yaml.cpp                    |   4 +-
 29 files changed, 54 insertions(+), 420 deletions(-)
 delete mode 100644 include/base/three_D_tools.h
 rename include/base/{ => utils}/converter.h (100%)
 rename include/base/{ => utils}/loader.hpp (100%)
 rename include/base/{ => utils}/params_server.hpp (99%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f688e5267..b65f0c839 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -273,6 +273,9 @@ SET(HDRS_UTILS
   include/base/utils/logging.h
   include/base/utils/singleton.h
   include/base/utils/make_unique.h
+  include/base/utils/params_server.hpp
+  include/base/utils/converter.h
+  include/base/utils/loader.hpp
   )
 SET(HDRS_PROBLEM
   include/base/problem/problem.h
@@ -429,15 +432,15 @@ SET(HDRS_DTASSC
   include/base/association/association_nnls.h
   include/base/association/matrix.h
   )
+SET(HDRS_YAML
+  include/base/yaml/parser_yaml.hpp
+  )
 
 
 #SOURCES
 SET(SRCS_PROBLEM
   src/problem/problem.cpp
   )
-SET(HDRS_YAML
-  include/base/yaml/parser_yaml.hpp
-  )
 SET(SRCS_HARDWARE
   src/hardware/hardware_base.cpp
   )
@@ -480,6 +483,7 @@ SET(SRCS_CAPTURE
   src/capture/capture_odom_3D.cpp
   src/capture/capture_velocity.cpp
   src/capture/capture_wheel_joint_position.cpp
+  src/capture/capture_image.cpp
   )
 SET(SRCS_FACTOR
   src/factor/factor_analytic.cpp
@@ -495,6 +499,7 @@ SET(SRCS_FEATURE
   src/feature/feature_odom_2D.cpp
   src/feature/feature_polyline_2D.cpp
   src/feature/feature_pose.cpp
+  src/feature/feature_point_image.cpp
   )
 SET(SRCS_LANDMARK
   src/landmark/landmark_corner_2D.cpp
@@ -614,10 +619,6 @@ IF (vision_utils_FOUND)
     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
@@ -655,7 +656,7 @@ IF(YAMLCPP_FOUND)
     src/yaml/sensor_IMU_yaml.cpp
     )
   IF(laser_scan_utils_FOUND)
-    SET(SRCS ${SRCS_YAML}
+    SET(SRCS_YAML ${SRCS_YAML}
       src/yaml/sensor_laser_2D_yaml.cpp
       )
   ENDIF(laser_scan_utils_FOUND)
@@ -670,6 +671,7 @@ ENDIF(YAMLCPP_FOUND)
 # create the shared library
 ADD_LIBRARY(${PROJECT_NAME} 
   SHARED 
+  ${SRCS}
   ${SRCS_BASE} 
   ${SRCS_CAPTURE}
   ${SRCS_COMMON}
diff --git a/hello_plugin/hello_plugin.cpp b/hello_plugin/hello_plugin.cpp
index fbe3955dc..e02c232a8 100644
--- a/hello_plugin/hello_plugin.cpp
+++ b/hello_plugin/hello_plugin.cpp
@@ -5,17 +5,17 @@
  *      Author: jcasals
  */
 #include "base/sensor/sensor_base.h"
-#include "base/wolf.h"
+#include "base/common/wolf.h"
 // #include "sensor_odom_2D.cpp"
 #include <yaml-cpp/yaml.h>
 #include "base/yaml/parser_yaml.hpp"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 #include "../hello_wolf/capture_range_bearing.h"
 #include "../hello_wolf/feature_range_bearing.h"
 #include "../hello_wolf/factor_range_bearing.h"
 #include "../hello_wolf/landmark_point_2D.h"
-#include "base/loader.hpp"
+#include "base/utils/loader.hpp"
 #include "base/processor/processor_odom_2D.h"
 
 #include "base/solver/solver_factory.h"
@@ -162,11 +162,17 @@ int main(int argc, char** argv) {
     // GET COVARIANCES of all states
     WOLF_TRACE("======== COVARIANCES OF SOLVED PROBLEM =======")
     ceres->computeCovariances(SolverManager::CovarianceBlocksToBeComputed::ALL_MARGINALS);
-    for (auto kf : problem->getTrajectory()->getFrameList())
+    for (auto kf : problem->getTrajectory()->getFrameList()){
         if (kf->isKey())
-            WOLF_TRACE("KF", kf->id(), "_cov = \n", kf->getCovariance());
-    for (auto lmk : problem->getMap()->getLandmarkList())
-        WOLF_TRACE("L", lmk->id(), "_cov = \n", lmk->getCovariance());
+            {
+                Eigen::MatrixXs cov;
+                WOLF_TRACE("KF", kf->id(), "_cov = \n", kf->getCovariance(cov));
+            }
+        for (auto lmk : problem->getMap()->getLandmarkList()) {
+            Eigen::MatrixXs cov;
+            WOLF_TRACE("L", lmk->id(), "_cov = \n", lmk->getCovariance(cov));
+        }
+    }
     std::cout << std::endl;
 
     WOLF_TRACE("======== FINAL PRINT FOR INTERPRETATION =======")
diff --git a/hello_plugin/params_autoconf.cpp b/hello_plugin/params_autoconf.cpp
index 70f562ffc..189bc777f 100644
--- a/hello_plugin/params_autoconf.cpp
+++ b/hello_plugin/params_autoconf.cpp
@@ -5,17 +5,17 @@
  *      Author: jcasals
  */
 #include "base/sensor/sensor_base.h"
-#include "base/wolf.h"
+#include "base/common/wolf.h"
 // #include "sensor_odom_2D.cpp"
 #include <yaml-cpp/yaml.h>
 #include "base/yaml/parser_yaml.hpp"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 #include "../hello_wolf/capture_range_bearing.h"
 #include "../hello_wolf/feature_range_bearing.h"
 #include "../hello_wolf/factor_range_bearing.h"
 #include "../hello_wolf/landmark_point_2D.h"
-#include "base/loader.hpp"
+#include "base/utils/loader.hpp"
 #include "base/processor/processor_odom_2D.h"
 
 #include "base/solver/solver_factory.h"
diff --git a/hello_wolf/sensor_range_bearing.h b/hello_wolf/sensor_range_bearing.h
index 29adf8ae1..5eaebc6b3 100644
--- a/hello_wolf/sensor_range_bearing.h
+++ b/hello_wolf/sensor_range_bearing.h
@@ -9,7 +9,7 @@
 #define HELLO_WOLF_SENSOR_RANGE_BEARING_H_
 
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 namespace wolf
 {
diff --git a/include/base/common/wolf.h b/include/base/common/wolf.h
index c0a9a9a2d..3d5ea9efc 100644
--- a/include/base/common/wolf.h
+++ b/include/base/common/wolf.h
@@ -10,7 +10,7 @@
 
 // Enable project-specific definitions and macros
 #include "internal/config.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/utils/logging.h"
 
 //includes from Eigen lib
diff --git a/include/base/problem/problem.h b/include/base/problem/problem.h
index d79f730cd..156077ec8 100644
--- a/include/base/problem/problem.h
+++ b/include/base/problem/problem.h
@@ -14,7 +14,7 @@ struct ProcessorParamsBase;
 }
 
 //wolf includes
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/sensor/new_sensor_factory.h"
 #include "base/processor/new_processor_factory.h"
 #include "base/common/wolf.h"
diff --git a/include/base/processor/processor_base.h b/include/base/processor/processor_base.h
index aa6aaf7ac..a188d8178 100644
--- a/include/base/processor/processor_base.h
+++ b/include/base/processor/processor_base.h
@@ -7,7 +7,7 @@ class SensorBase;
 }
 
 // Wolf includes
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/common/wolf.h"
 #include "base/common/node_base.h"
 #include "base/common/time_stamp.h"
diff --git a/include/base/processor/processor_diff_drive.h b/include/base/processor/processor_diff_drive.h
index a486c7218..87fc7f6bc 100644
--- a/include/base/processor/processor_diff_drive.h
+++ b/include/base/processor/processor_diff_drive.h
@@ -9,7 +9,7 @@
 #define _WOLF_PROCESSOR_DIFF_DRIVE_H_
 
 #include "base/processor/processor_motion.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/processor/diff_drive_tools.h"
 
 namespace wolf {
diff --git a/include/base/processor/processor_frame_nearest_neighbor_filter.h b/include/base/processor/processor_frame_nearest_neighbor_filter.h
index 619b88b79..219d03864 100644
--- a/include/base/processor/processor_frame_nearest_neighbor_filter.h
+++ b/include/base/processor/processor_frame_nearest_neighbor_filter.h
@@ -3,7 +3,7 @@
 
 // Wolf related headers
 #include "base/processor/processor_loopclosure_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/state_block/state_block.h"
 
 namespace wolf{
diff --git a/include/base/processor/processor_motion.h b/include/base/processor/processor_motion.h
index 805ef9261..7faf2ecc0 100644
--- a/include/base/processor/processor_motion.h
+++ b/include/base/processor/processor_motion.h
@@ -11,7 +11,7 @@
 // Wolf
 #include "base/capture/capture_motion.h"
 #include "base/processor/processor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/common/time_stamp.h"
 
 // std
diff --git a/include/base/processor/processor_odom_2D.h b/include/base/processor/processor_odom_2D.h
index 5f4718c23..5e0eff3a5 100644
--- a/include/base/processor/processor_odom_2D.h
+++ b/include/base/processor/processor_odom_2D.h
@@ -11,7 +11,7 @@
 #include "base/processor/processor_motion.h"
 #include "base/capture/capture_odom_2D.h"
 #include "base/factor/factor_odom_2D.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/math/rotations.h"
 
 namespace wolf {
diff --git a/include/base/processor/processor_params_image.h b/include/base/processor/processor_params_image.h
index 33e92c38e..f493db6ec 100644
--- a/include/base/processor/processor_params_image.h
+++ b/include/base/processor/processor_params_image.h
@@ -4,7 +4,7 @@
 // wolf
 #include "base/processor/processor_tracker_feature.h"
 #include "base/processor/processor_tracker_landmark.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 namespace wolf
 {
diff --git a/include/base/processor/processor_tracker.h b/include/base/processor/processor_tracker.h
index ea414cfff..b583db352 100644
--- a/include/base/processor/processor_tracker.h
+++ b/include/base/processor/processor_tracker.h
@@ -18,13 +18,14 @@ WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTracker);
 struct ProcessorParamsTracker : public ProcessorParamsBase
 {
     unsigned int min_features_for_keyframe; ///< minimum nbr. of features to vote for keyframe
+    int max_new_features;                   ///< maximum nbr. of new features to be processed when adding a keyframe (-1: unlimited. 0: none.)
+
     ProcessorParamsTracker() = default;
     ProcessorParamsTracker(std::string _unique_name, const wolf::paramsServer & _server):
         ProcessorParamsBase(_unique_name, _server)
     {
         min_features_for_keyframe = _server.getParam<unsigned int>(_unique_name + "/min_features_for_keyframe", "1");
-        max_new_features = _server.getParam<unsigned int>(_unique_name + "/max_new_features", "10");
-    }
+        max_new_features = _server.getParam<int>(_unique_name + "/max_new_features", "-1");
     }
 };
 
diff --git a/include/base/processor/processor_tracker_feature_corner.h b/include/base/processor/processor_tracker_feature_corner.h
index 5ab8b2027..a5b7e107f 100644
--- a/include/base/processor/processor_tracker_feature_corner.h
+++ b/include/base/processor/processor_tracker_feature_corner.h
@@ -17,7 +17,7 @@
 #include "base/state_block/state_block.h"
 #include "base/association/association_tree.h"
 #include "base/processor/processor_tracker_feature.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 //laser_scan_utils
 //#include "laser_scan_utils/scan_basics.h"
diff --git a/include/base/processor/processor_tracker_feature_trifocal.h b/include/base/processor/processor_tracker_feature_trifocal.h
index a017004cd..7a71a038f 100644
--- a/include/base/processor/processor_tracker_feature_trifocal.h
+++ b/include/base/processor/processor_tracker_feature_trifocal.h
@@ -4,7 +4,7 @@
 //Wolf includes
 #include "base/processor/processor_tracker_feature.h"
 #include "base/capture/capture_image.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 // Vision utils
 #include <vision_utils.h>
diff --git a/include/base/sensor/sensor_GPS_fix.h b/include/base/sensor/sensor_GPS_fix.h
index dd2e85700..88b2e54d8 100644
--- a/include/base/sensor/sensor_GPS_fix.h
+++ b/include/base/sensor/sensor_GPS_fix.h
@@ -4,7 +4,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 // std includes
 
diff --git a/include/base/sensor/sensor_IMU.h b/include/base/sensor/sensor_IMU.h
index 4ae415566..c9dc9ad4b 100644
--- a/include/base/sensor/sensor_IMU.h
+++ b/include/base/sensor/sensor_IMU.h
@@ -3,7 +3,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include <iostream>
 
 namespace wolf {
diff --git a/include/base/sensor/sensor_camera.h b/include/base/sensor/sensor_camera.h
index 44bd1dd0b..04d2bd8aa 100644
--- a/include/base/sensor/sensor_camera.h
+++ b/include/base/sensor/sensor_camera.h
@@ -3,7 +3,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 namespace wolf
 {
diff --git a/include/base/sensor/sensor_diff_drive.h b/include/base/sensor/sensor_diff_drive.h
index fd0a80110..e84be0627 100644
--- a/include/base/sensor/sensor_diff_drive.h
+++ b/include/base/sensor/sensor_diff_drive.h
@@ -10,7 +10,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 #include "base/processor/diff_drive_tools.h"
 
 namespace wolf {
diff --git a/include/base/sensor/sensor_odom_2D.h b/include/base/sensor/sensor_odom_2D.h
index 934ef2615..92b6bb111 100644
--- a/include/base/sensor/sensor_odom_2D.h
+++ b/include/base/sensor/sensor_odom_2D.h
@@ -3,7 +3,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 namespace wolf {
 
diff --git a/include/base/sensor/sensor_odom_3D.h b/include/base/sensor/sensor_odom_3D.h
index c1128098e..dfa736fe9 100644
--- a/include/base/sensor/sensor_odom_3D.h
+++ b/include/base/sensor/sensor_odom_3D.h
@@ -10,7 +10,7 @@
 
 //wolf includes
 #include "base/sensor/sensor_base.h"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 namespace wolf {
 
diff --git a/include/base/solver/solver_factory.h b/include/base/solver/solver_factory.h
index 5a0ce6417..8d37673fe 100644
--- a/include/base/solver/solver_factory.h
+++ b/include/base/solver/solver_factory.h
@@ -15,7 +15,7 @@ struct IntrinsicsBase;
 }
 
 // wolf
-#include "base/factory.h"
+#include "base/common/factory.h"
 #include "base/solver/solver_manager.h"
 
 namespace wolf
diff --git a/include/base/three_D_tools.h b/include/base/three_D_tools.h
deleted file mode 100644
index 86e2086f6..000000000
--- a/include/base/three_D_tools.h
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * three_D_tools.h
- *
- *  Created on: Mar 15, 2018
- *      Author: jsola
- */
-
-#ifndef THREE_D_TOOLS_H_
-#define THREE_D_TOOLS_H_
-
-#include "base/wolf.h"
-#include "base/rotations.h"
-
-/*
- * The functions in this file are related to manipulations of Delta motion magnitudes used in 3D motion.
- *
- * The Delta is defined as a simple 3D pose with the rotation expressed in quaternion form,
- *     Delta = [Dp, Dq]
- * with
- *     Dp : position delta
- *     Dq : quaternion delta
- *
- * The functions are listed below:
- *
- *   - compose:     Dc = D1 (+) D2
- *   - identity:    I  = Delta at the origin, with Dp = [0,0,0]; Dq = [0,0,0,1], so that D (+) I = I (+) D = D
- *   - inverse:     so that D (+) D.inv = D.inv (+) D = I
- *   - between:     Db = D2 (-) D1 := D1.inv (+) D2, so that D2 = D1 (+) Db
- *   - lift:        go from Delta manifold to tangent space (equivalent to log() in rotations)
- *   - retract:     go from tangent space to delta manifold (equivalent to exp() in rotations)
- *   - plus:        D2 = D1 (+) retract(d)
- *   - diff:        d  = lift( D2 (-) D1 )
- */
-
-namespace wolf
-{
-namespace three_D {
-using namespace Eigen;
-
-template<typename D1, typename D2>
-inline void identity(MatrixBase<D1>& p, QuaternionBase<D2>& q)
-{
-    MatrixSizeCheck<3, 1>::check(p);
-    p = MatrixBase<D1>::Zero(3,1);
-    q = QuaternionBase<D2>::Identity();
-}
-
-template<typename D1, typename D2>
-inline void identity(MatrixBase<D1>& p, MatrixBase<D2>& q)
-{
-    MatrixSizeCheck<3, 1>::check(p);
-    MatrixSizeCheck<4, 1>::check(q);
-    typedef typename D1::Scalar T1;
-    typedef typename D2::Scalar T2;
-    p << T1(0), T1(0), T1(0);
-    q << T2(0), T2(0), T2(0), T2(1);
-}
-
-template<typename T = Scalar>
-inline Matrix<T, 7, 1> identity()
-{
-    Matrix<T, 7, 1> ret;
-    ret<< T(0), T(0), T(0),
-          T(0), T(0), T(0), T(1);
-    return ret;
-}
-
-template<typename D1, typename D2, typename D4, typename D5>
-inline void inverse(const MatrixBase<D1>& dp, const QuaternionBase<D2>& dq,
-                    MatrixBase<D4>& idp, QuaternionBase<D5>& idq)
-{
-    MatrixSizeCheck<3, 1>::check(dp);
-    MatrixSizeCheck<3, 1>::check(idp);
-
-    idp = - dq.conjugate() * dp ;
-    idq =   dq.conjugate() ;
-}
-
-template<typename D1, typename D2>
-inline void inverse(const MatrixBase<D1>& d,
-                    MatrixBase<D2>& id)
-{
-    MatrixSizeCheck<7, 1>::check(d);
-    MatrixSizeCheck<7, 1>::check(id);
-
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dp   ( & d( 0 ) );
-    Map<const Quaternion<typename D1::Scalar> >     dq   ( & d( 3 ) );
-    Map<Matrix<typename D2::Scalar, 3, 1> >         idp  ( & id( 0 ) );
-    Map<Quaternion<typename D2::Scalar> >           idq  ( & id( 3 ) );
-
-    inverse(dp, dq, idp, idq);
-}
-
-template<typename D>
-inline Matrix<typename D::Scalar, 7, 1> inverse(const MatrixBase<D>& d)
-{
-    Matrix<typename D::Scalar, 7, 1> id;
-    inverse(d, id);
-    return id;
-}
-
-template<typename D1, typename D2, typename D4, typename D5, typename D7, typename D8>
-inline void compose(const MatrixBase<D1>& dp1, const QuaternionBase<D2>& dq1,
-                    const MatrixBase<D4>& dp2, const QuaternionBase<D5>& dq2,
-                    MatrixBase<D7>& sum_p, QuaternionBase<D8>& sum_q )
-{
-        MatrixSizeCheck<3, 1>::check(dp1);
-        MatrixSizeCheck<3, 1>::check(dp2);
-        MatrixSizeCheck<3, 1>::check(sum_p);
-
-        sum_p = dp1 + dq1*dp2;
-        sum_q =       dq1*dq2; // dq here to avoid possible aliasing between d1 and sum
-}
-
-template<typename D1, typename D2, typename D3>
-inline void compose(const MatrixBase<D1>& d1,
-                    const MatrixBase<D2>& d2,
-                    MatrixBase<D3>& sum)
-{
-    MatrixSizeCheck<7, 1>::check(d1);
-    MatrixSizeCheck<7, 1>::check(d2);
-    MatrixSizeCheck<7, 1>::check(sum);
-
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dp1    ( & d1( 0 ) );
-    Map<const Quaternion<typename D1::Scalar> >     dq1    ( & d1( 3 ) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   dp2    ( & d2( 0 ) );
-    Map<const Quaternion<typename D2::Scalar> >     dq2    ( & d2( 3 ) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         sum_p  ( & sum( 0 ) );
-    Map<Quaternion<typename D3::Scalar> >           sum_q  ( & sum( 3 ) );
-
-    compose(dp1, dq1, dp2, dq2, sum_p, sum_q);
-}
-
-template<typename D1, typename D2>
-inline Matrix<typename D1::Scalar, 7, 1> compose(const MatrixBase<D1>& d1,
-                                                 const MatrixBase<D2>& d2 )
-{
-    Matrix<typename D1::Scalar, 7, 1>  ret;
-    compose(d1, d2, ret);
-    return ret;
-}
-
-template<typename D1, typename D2, typename D3, typename D4, typename D5>
-inline void compose(const MatrixBase<D1>& d1,
-                    const MatrixBase<D2>& d2,
-                    MatrixBase<D3>& sum,
-                    MatrixBase<D4>& J_sum_d1,
-                    MatrixBase<D5>& J_sum_d2)
-{
-    MatrixSizeCheck<7, 1>::check(d1);
-    MatrixSizeCheck<7, 1>::check(d2);
-    MatrixSizeCheck<7, 1>::check(sum);
-    MatrixSizeCheck< 6, 6>::check(J_sum_d1);
-    MatrixSizeCheck< 6, 6>::check(J_sum_d2);
-
-    // Some useful temporaries
-    Matrix<typename D1::Scalar, 3, 3> dR1 = q2R(d1.segment(3,4)); //dq1.matrix(); // First  Delta, DR
-    Matrix<typename D2::Scalar, 3, 3> dR2 = q2R(d2.segment(3,4)); //dq2.matrix(); // Second delta, dR
-
-    // Jac wrt first delta
-    J_sum_d1.setIdentity();                                     // dDp'/dDp = dDv'/dDv = I
-    J_sum_d1.block(0,3,3,3).noalias() = - dR1 * skew(d2.head(3)) ;     // dDp'/dDo
-    J_sum_d1.block(3,3,3,3) = dR2.transpose();                  // dDo'/dDo
-
-    // Jac wrt second delta
-    J_sum_d2.setIdentity();                                     //
-    J_sum_d2.block(0,0,3,3) = dR1;                              // dDp'/ddp
-    // J_sum_d2.block(3,3,3,3) = Matrix3s::Identity();          // dDo'/ddo = I
-
-    // compose deltas -- done here to avoid aliasing when calling with input `d1` and result `sum` referencing the same variable
-    compose(d1, d2, sum);
-}
-
-template<typename D1, typename D2, typename D4, typename D5, typename D7, typename D8>
-inline void between(const MatrixBase<D1>& dp1, const QuaternionBase<D2>& dq1,
-                    const MatrixBase<D4>& dp2, const QuaternionBase<D5>& dq2,
-                    MatrixBase<D7>& dp12, QuaternionBase<D8>& dq12)
-{
-        MatrixSizeCheck<3, 1>::check(dp1);
-        MatrixSizeCheck<3, 1>::check(dp2);
-        MatrixSizeCheck<3, 1>::check(dp12);
-
-        dp12 = dq1.conjugate() * ( dp2 - dp1 );
-        dq12 = dq1.conjugate() *   dq2;
-}
-
-template<typename D1, typename D2, typename D3>
-inline void between(const MatrixBase<D1>& d1,
-                    const MatrixBase<D2>& d2,
-                    MatrixBase<D3>& d2_minus_d1)
-{
-    MatrixSizeCheck<7, 1>::check(d1);
-    MatrixSizeCheck<7, 1>::check(d2);
-    MatrixSizeCheck<7, 1>::check(d2_minus_d1);
-
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dp1    ( & d1(0) );
-    Map<const Quaternion<typename D1::Scalar> >     dq1    ( & d1(3) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   dp2    ( & d2(0) );
-    Map<const Quaternion<typename D2::Scalar> >     dq2    ( & d2(3) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         dp12 ( & d2_minus_d1(0) );
-    Map<Quaternion<typename D3::Scalar> >           dq12 ( & d2_minus_d1(3) );
-
-    between(dp1, dq1, dp2, dq2, dp12, dq12);
-}
-
-template<typename D1, typename D2>
-inline Matrix<typename D1::Scalar, 7, 1> between(const MatrixBase<D1>& d1,
-                                                 const MatrixBase<D2>& d2 )
-{
-    MatrixSizeCheck<7, 1>::check(d1);
-    MatrixSizeCheck<7, 1>::check(d2);
-    Matrix<typename D1::Scalar, 7, 1> d12;
-    between(d1, d2, d12);
-    return d12;
-}
-
-template<typename Derived>
-Matrix<typename Derived::Scalar, 6, 1> lift(const MatrixBase<Derived>& delta_in)
-{
-    MatrixSizeCheck<7, 1>::check(delta_in);
-
-    Matrix<typename Derived::Scalar, 6, 1> ret;
-
-    Map<const Matrix<typename Derived::Scalar, 3, 1> >   dp_in  ( & delta_in(0) );
-    Map<const Quaternion<typename Derived::Scalar> >     dq_in  ( & delta_in(3) );
-    Map<Matrix<typename Derived::Scalar, 3, 1> >         dp_ret ( & ret(0) );
-    Map<Matrix<typename Derived::Scalar, 3, 1> >         do_ret ( & ret(3) );
-
-    dp_ret = dp_in;
-    do_ret = log_q(dq_in);
-
-    return ret;
-}
-
-template<typename Derived>
-Matrix<typename Derived::Scalar, 7, 1> retract(const MatrixBase<Derived>& d_in)
-{
-    MatrixSizeCheck<6, 1>::check(d_in);
-
-    Matrix<typename Derived::Scalar, 7, 1> ret;
-
-    Map<const Matrix<typename Derived::Scalar, 3, 1> >   dp_in  ( & d_in(0) );
-    Map<const Matrix<typename Derived::Scalar, 3, 1> >   do_in  ( & d_in(3) );
-    Map<Matrix<typename Derived::Scalar, 3, 1> >         dp     ( &  ret(0) );
-    Map<Quaternion<typename Derived::Scalar> >           dq     ( &  ret(3) );
-
-    dp = dp_in;
-    dq = exp_q(do_in);
-
-    return ret;
-}
-
-template<typename D1, typename D2, typename D4, typename D5, typename D7, typename D8>
-inline void plus(const MatrixBase<D1>& dp1, const QuaternionBase<D2>& dq1,
-                 const MatrixBase<D4>& dp2, const MatrixBase<D5>& do2,
-                 MatrixBase<D7>& plus_p, QuaternionBase<D8>& plus_q)
-{
-    MatrixSizeCheck<3, 1>::check(dp1);
-    MatrixSizeCheck<3, 1>::check(dp2);
-    MatrixSizeCheck<3, 1>::check(plus_p);
-    plus_p = dp1 + dp2;
-    plus_q = dq1 * exp_q(do2);
-}
-
-template<typename D1, typename D2, typename D3>
-inline void plus(const MatrixBase<D1>& d1,
-                 const MatrixBase<D2>& d2,
-                 MatrixBase<D3>& d_plus)
-{
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dp1    ( & d1(0) );
-    Map<const Quaternion<typename D1::Scalar> >     dq1    ( & d1(3) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   dp2    ( & d2(0) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   do2    ( & d2(3) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         dp_p ( & d_plus(0) );
-    Map<Quaternion<typename D3::Scalar> >           dq_p ( & d_plus(3) );
-
-    plus(dp1, dq1, dp2, do2, dp_p, dq_p);
-}
-
-template<typename D1, typename D2>
-inline Matrix<typename D1::Scalar, 7, 1> plus(const MatrixBase<D1>& d1,
-                                              const MatrixBase<D2>& d2)
-{
-    Matrix<typename D1::Scalar, 7, 1> d_plus;
-    plus(d1, d2, d_plus);
-    return d_plus;
-}
-
-template<typename D1, typename D2, typename D4, typename D5, typename D7, typename D8>
-inline void diff(const MatrixBase<D1>& dp1, const QuaternionBase<D2>& dq1,
-                 const MatrixBase<D4>& dp2, const QuaternionBase<D5>& dq2,
-                 MatrixBase<D7>& diff_p, MatrixBase<D8>& diff_o )
-{
-        diff_p = dp2 - dp1;
-        diff_o = log_q(dq1.conjugate() * dq2);
-}
-
-template<typename D1, typename D2, typename D4, typename D5, typename D6, typename D7, typename D8, typename D9>
-inline void diff(const MatrixBase<D1>& dp1, const QuaternionBase<D2>& dq1,
-                 const MatrixBase<D4>& dp2, const QuaternionBase<D5>& dq2,
-                 MatrixBase<D6>& diff_p, MatrixBase<D7>& diff_o,
-                 MatrixBase<D8>& J_do_dq1, MatrixBase<D9>& J_do_dq2)
-{
-    diff(dp1, dq1, dp2, dq2, diff_p, diff_o);
-
-    J_do_dq1    = - jac_SO3_left_inv(diff_o);
-    J_do_dq2    =   jac_SO3_right_inv(diff_o);
-}
-
-template<typename D1, typename D2, typename D3>
-inline void diff(const MatrixBase<D1>& d1,
-                 const MatrixBase<D2>& d2,
-                 MatrixBase<D3>& err)
-{
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dp1    ( & d1(0) );
-    Map<const Quaternion<typename D1::Scalar> >     dq1    ( & d1(3) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   dp2    ( & d2(0) );
-    Map<const Quaternion<typename D2::Scalar> >     dq2    ( & d2(3) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         diff_p ( & err(0) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         diff_o ( & err(3) );
-
-    diff(dp1, dq1, dp2, dq2, diff_p, diff_o);
-}
-
-template<typename D1, typename D2, typename D3, typename D4, typename D5>
-inline void diff(const MatrixBase<D1>& d1,
-                 const MatrixBase<D2>& d2,
-                 MatrixBase<D3>& dif,
-                 MatrixBase<D4>& J_diff_d1,
-                 MatrixBase<D5>& J_diff_d2)
-{
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dp1    ( & d1(0) );
-    Map<const Quaternion<typename D1::Scalar> >     dq1    ( & d1(3) );
-    Map<const Matrix<typename D1::Scalar, 3, 1> >   dv1    ( & d1(7) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   dp2    ( & d2(0) );
-    Map<const Quaternion<typename D2::Scalar> >     dq2    ( & d2(3) );
-    Map<const Matrix<typename D2::Scalar, 3, 1> >   dv2    ( & d2(7) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         diff_p ( & dif(0) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         diff_o ( & dif(3) );
-    Map<Matrix<typename D3::Scalar, 3, 1> >         diff_v ( & dif(6) );
-
-    Matrix<typename D4::Scalar, 3, 3> J_do_dq1, J_do_dq2;
-
-    diff(dp1, dq1, dv1, dp2, dq2, dv2, diff_p, diff_o, diff_v, J_do_dq1, J_do_dq2);
-
-    /* d = diff(d1, d2) is
-     *   dp = dp2 - dp1
-     *   do = Log(dq1.conj * dq2)
-     *   dv = dv2 - dv1
-     *
-     * With trivial Jacobians for dp and dv, and:
-     *   J_do_dq1 = - J_l_inv(theta)
-     *   J_do_dq2 =   J_r_inv(theta)
-     */
-
-    J_diff_d1 = - Matrix<typename D4::Scalar, 6, 6>::Identity();// d(p2  - p1) / d(p1) = - Identity
-    J_diff_d1.block(3,3,3,3) = J_do_dq1;       // d(R1.tr*R2) / d(R1) = - J_l_inv(theta)
-
-    J_diff_d2.setIdentity(6,6);                                    // d(R1.tr*R2) / d(R2) =   Identity
-    J_diff_d2.block(3,3,3,3) = J_do_dq2;      // d(R1.tr*R2) / d(R1) =   J_r_inv(theta)
-}
-
-template<typename D1, typename D2>
-inline Matrix<typename D1::Scalar, 6, 1> diff(const MatrixBase<D1>& d1,
-                                              const MatrixBase<D2>& d2)
-{
-    Matrix<typename D1::Scalar, 6, 1> ret;
-    diff(d1, d2, ret);
-    return ret;
-}
-
-} // namespace three_d
-} // namespace wolf
-
-#endif /* THREE_D_TOOLS_H_ */
diff --git a/include/base/converter.h b/include/base/utils/converter.h
similarity index 100%
rename from include/base/converter.h
rename to include/base/utils/converter.h
diff --git a/include/base/loader.hpp b/include/base/utils/loader.hpp
similarity index 100%
rename from include/base/loader.hpp
rename to include/base/utils/loader.hpp
diff --git a/include/base/params_server.hpp b/include/base/utils/params_server.hpp
similarity index 99%
rename from include/base/params_server.hpp
rename to include/base/utils/params_server.hpp
index 55f268d78..186bd8286 100644
--- a/include/base/params_server.hpp
+++ b/include/base/utils/params_server.hpp
@@ -3,7 +3,7 @@
 #include <vector>
 #include <regex>
 #include <map>
-#include "base/converter.h"
+#include "base/utils/converter.h"
 namespace wolf{
 class paramsServer{
     struct ParamsInitSensor{
diff --git a/test/gtest_converter.cpp b/test/gtest_converter.cpp
index 6f821cba2..e594458e9 100644
--- a/test/gtest_converter.cpp
+++ b/test/gtest_converter.cpp
@@ -1,5 +1,5 @@
 #include "utils_gtest.h"
-#include "base/converter.h"
+#include "base/utils/converter.h"
 
 using namespace std;
 using namespace wolf;
diff --git a/test/gtest_param_server.cpp b/test/gtest_param_server.cpp
index a17791973..9b80933a1 100644
--- a/test/gtest_param_server.cpp
+++ b/test/gtest_param_server.cpp
@@ -1,8 +1,8 @@
 #include "utils_gtest.h"
-#include "base/converter.h"
-#include "base/wolf.h"
+#include "base/utils/converter.h"
+#include "base/common/wolf.h"
 #include "base/yaml/parser_yaml.hpp"
-#include "base/params_server.hpp"
+#include "base/utils/params_server.hpp"
 
 using namespace std;
 using namespace wolf;
diff --git a/test/gtest_parser_yaml.cpp b/test/gtest_parser_yaml.cpp
index 437879ad2..006bd5729 100644
--- a/test/gtest_parser_yaml.cpp
+++ b/test/gtest_parser_yaml.cpp
@@ -1,6 +1,6 @@
 #include "utils_gtest.h"
-#include "base/converter.h"
-#include "base/wolf.h"
+#include "base/utils/converter.h"
+#include "base/common/wolf.h"
 #include "base/yaml/parser_yaml.hpp"
 
 using namespace std;
-- 
GitLab