diff --git a/demos/demo_factor_imu.cpp b/demos/demo_factor_imu.cpp
index 36e6bfa52385e37e51a8d1616e3c20640f35b371..f99b44448fb07d337a0319b3bb451560daf19c76 100644
--- a/demos/demo_factor_imu.cpp
+++ b/demos/demo_factor_imu.cpp
@@ -24,7 +24,7 @@ int main(int argc, char** argv)
     bool c0(false), c1(false);// c2(true), c3(true), c4(true);
     // Wolf problem
     ProblemPtr wolf_problem_ptr_ = Problem::create("PQVBB 3D");
-    Eigen::VectorXs IMU_extrinsics(7);
+    Eigen::VectorXd IMU_extrinsics(7);
     IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
     SensorBasePtr sensor_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", IMU_extrinsics, shared_ptr<IntrinsicsBase>());
     wolf_problem_ptr_->installProcessor("IMU", "IMU pre-integrator", "Main IMU", "");
@@ -38,30 +38,30 @@ int main(int argc, char** argv)
 
     // Time and data variables
     TimeStamp t;
-    Eigen::Vector6s data_;
-    Scalar mpu_clock = 0;
+    Eigen::Vector6d data_;
+    double mpu_clock = 0;
 
     t.set(mpu_clock);
 
     // Set the origin
-    Eigen::VectorXs x0(16);
+    Eigen::VectorXd x0(16);
     x0 << 0,0,0,  0,0,0,1,  0,0,0,  0,0,.001,  0,0,.002; // Try some non-zero biases
     wolf_problem_ptr_->getProcessorMotion()->setOrigin(x0, t); //this also creates a keyframe at origin
     wolf_problem_ptr_->getTrajectory()->getFrameList().front()->fix(); //fix the keyframe at origin
 
     TimeStamp ts(0);
-    Eigen::VectorXs origin_state = x0;
+    Eigen::VectorXd origin_state = x0;
     
     // Create one capture to store the IMU data arriving from (sensor / callback / file / etc.)
-    CaptureIMUPtr imu_ptr( std::make_shared<CaptureIMU>(t, sensor_ptr, data_, Eigen::Matrix6s::Identity()) );
+    CaptureIMUPtr imu_ptr( std::make_shared<CaptureIMU>(t, sensor_ptr, data_, Eigen::Matrix6d::Identity()) );
     imu_ptr->setFrame(wolf_problem_ptr_->getTrajectory()->getFrameList().back());
 
     // set variables
     using namespace std;
-    Eigen::VectorXs state_vec;
-    Eigen::VectorXs delta_preint;
+    Eigen::VectorXd state_vec;
+    Eigen::VectorXd delta_preint;
     //FrameIMUPtr last_frame;
-    Eigen::Matrix<wolf::Scalar,9,9> delta_preint_cov;
+    Eigen::Matrix<double,9,9> delta_preint_cov;
 
     //process data
     mpu_clock = 0.001003;
@@ -96,15 +96,15 @@ int main(int argc, char** argv)
 
     FrameIMUPtr ref_frame_ptr(std::static_pointer_cast<FrameIMU>(imu_ptr->getFrame()));
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> expect;
-    Eigen::Vector3s ref_frame_p = ref_frame_ptr->getP()->getVector();
-    Eigen::Quaternions ref_frame_o(ref_frame_ptr->getO()->getVector().data());
-    Eigen::Vector3s ref_frame_v = ref_frame_ptr->getV()->getVector();
-    Eigen::Vector3s current_frame_p = last_frame->getP()->getVector();
-    Eigen::Quaternions current_frame_o(last_frame->getO()->getVector().data());
-    Eigen::Vector3s current_frame_v = last_frame->getV()->getVector();
-    Eigen::Vector3s acc_bias(ref_frame_ptr->getAccBias()->getVector()), gyro_bias(ref_frame_ptr->getGyroBias()->getVector());
-    Eigen::Matrix<wolf::Scalar, 9, 1> residu;
+    Eigen::Matrix<double, 10, 1> expect;
+    Eigen::Vector3d ref_frame_p = ref_frame_ptr->getP()->getVector();
+    Eigen::Quaterniond ref_frame_o(ref_frame_ptr->getO()->getVector().data());
+    Eigen::Vector3d ref_frame_v = ref_frame_ptr->getV()->getVector();
+    Eigen::Vector3d current_frame_p = last_frame->getP()->getVector();
+    Eigen::Quaterniond current_frame_o(last_frame->getO()->getVector().data());
+    Eigen::Vector3d current_frame_v = last_frame->getV()->getVector();
+    Eigen::Vector3d acc_bias(ref_frame_ptr->getAccBias()->getVector()), gyro_bias(ref_frame_ptr->getGyroBias()->getVector());
+    Eigen::Matrix<double, 9, 1> residu;
     residu << 0,0,0,  0,0,0,  0,0,0;
     
     factor_imu->expectation(ref_frame_p, ref_frame_o, ref_frame_v, current_frame_p, current_frame_o, current_frame_v, expect);
@@ -157,15 +157,15 @@ int main(int argc, char** argv)
 
     FrameIMUPtr ref_frame_ptr(std::static_pointer_cast<FrameIMU>(imu_ptr->getFrame()));
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> expect;
-    Eigen::Vector3s ref_frame_p = ref_frame_ptr->getP()->getVector();
-    Eigen::Quaternions ref_frame_o(ref_frame_ptr->getO()->getVector().data());
-    Eigen::Vector3s ref_frame_v = ref_frame_ptr->getV()->getVector();
-    Eigen::Vector3s current_frame_p = last_frame->getP()->getVector();
-    Eigen::Quaternions current_frame_o(last_frame->getO()->getVector().data());
-    Eigen::Vector3s current_frame_v = last_frame->getV()->getVector();
-    Eigen::Vector3s acc_bias(ref_frame_ptr->getAccBias()->getVector()), gyro_bias(ref_frame_ptr->getGyroBias()->getVector());
-    Eigen::Matrix<wolf::Scalar, 9, 1> residu;
+    Eigen::Matrix<double, 10, 1> expect;
+    Eigen::Vector3d ref_frame_p = ref_frame_ptr->getP()->getVector();
+    Eigen::Quaterniond ref_frame_o(ref_frame_ptr->getO()->getVector().data());
+    Eigen::Vector3d ref_frame_v = ref_frame_ptr->getV()->getVector();
+    Eigen::Vector3d current_frame_p = last_frame->getP()->getVector();
+    Eigen::Quaterniond current_frame_o(last_frame->getO()->getVector().data());
+    Eigen::Vector3d current_frame_v = last_frame->getV()->getVector();
+    Eigen::Vector3d acc_bias(ref_frame_ptr->getAccBias()->getVector()), gyro_bias(ref_frame_ptr->getGyroBias()->getVector());
+    Eigen::Matrix<double, 9, 1> residu;
     residu << 0,0,0,  0,0,0,  0,0,0;
     
     factor_imu->expectation(ref_frame_p, ref_frame_o, ref_frame_v, acc_bias, gyro_bias, current_frame_p, current_frame_o, current_frame_v, expect);
@@ -215,15 +215,15 @@ int main(int argc, char** argv)
 
     FrameIMUPtr ref_frame_ptr(std::static_pointer_cast<FrameIMU>(imu_ptr->getFrame()));
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> expect;
-    Eigen::Vector3s ref_frame_p = ref_frame_ptr->getP()->getVector();
-    Eigen::Quaternions ref_frame_o(ref_frame_ptr->getO()->getVector().data());
-    Eigen::Vector3s ref_frame_v = ref_frame_ptr->getV()->getVector();
-    Eigen::Vector3s current_frame_p = last_frame->getP()->getVector();
-    Eigen::Quaternions current_frame_o(last_frame->getO()->getVector().data());
-    Eigen::Vector3s current_frame_v = last_frame->getV()->getVector();
-    Eigen::Vector3s acc_bias(ref_frame_ptr->getAccBias()->getVector()), gyro_bias(ref_frame_ptr->getGyroBias()->getVector());
-    Eigen::Matrix<wolf::Scalar, 9, 1> residu;
+    Eigen::Matrix<double, 10, 1> expect;
+    Eigen::Vector3d ref_frame_p = ref_frame_ptr->getP()->getVector();
+    Eigen::Quaterniond ref_frame_o(ref_frame_ptr->getO()->getVector().data());
+    Eigen::Vector3d ref_frame_v = ref_frame_ptr->getV()->getVector();
+    Eigen::Vector3d current_frame_p = last_frame->getP()->getVector();
+    Eigen::Quaterniond current_frame_o(last_frame->getO()->getVector().data());
+    Eigen::Vector3d current_frame_v = last_frame->getV()->getVector();
+    Eigen::Vector3d acc_bias(ref_frame_ptr->getAccBias()->getVector()), gyro_bias(ref_frame_ptr->getGyroBias()->getVector());
+    Eigen::Matrix<double, 9, 1> residu;
     residu << 0,0,0,  0,0,0,  0,0,0;
     
     factor_imu->expectation(ref_frame_p, ref_frame_o, ref_frame_v, acc_bias, gyro_bias, current_frame_p, current_frame_o, current_frame_v, expect);
@@ -237,7 +237,7 @@ int main(int argc, char** argv)
     }
 
     ///having a look at covariances
-    Eigen::MatrixXs predelta_cov;
+    Eigen::MatrixXd predelta_cov;
     predelta_cov.resize(9,9);
     predelta_cov = wolf_problem_ptr_->getProcessorMotion()->getCurrentDeltaPreintCov();
     //std::cout << "predelta_cov : \n" << predelta_cov << std::endl; 
@@ -247,7 +247,7 @@ int main(int argc, char** argv)
     //FrameBasePtr first_frame = wolf_problem_ptr_->getTrajectory()->getFrameList().front();
     wolf_problem_ptr_->getProcessorMotion()->setOrigin(wolf_problem_ptr_->getTrajectory()->getFrameList().front());
     //SensorBasePtr sensorbase = std::make_shared<SensorBase>("ABSOLUTE POSE", nullptr, nullptr, nullptr, 0);
-    //CapturePosePtr initial_covariance = std::make_shared<CaptureFix>(TimeStamp(0), sensorbase, first_frame->getState().head(7), Eigen::Matrix6s::Identity() * 0.01);
+    //CapturePosePtr initial_covariance = std::make_shared<CaptureFix>(TimeStamp(0), sensorbase, first_frame->getState().head(7), Eigen::Matrix6d::Identity() * 0.01);
     //first_frame->addCapture(initial_covariance);
     //initial_covariance->process();
     //std::cout << "initial covariance: factor " << initial_covariance->getFeatureList().front()->getConstrainedByList().front()->id() << std::endl << initial_covariance->getFeatureList().front()->getMeasurementCovariance() << std::endl;
@@ -261,9 +261,9 @@ int main(int argc, char** argv)
     // SOLVING PROBLEMS
     ceres::Solver::Summary summary_diff;
     std::cout << "solving..." << std::endl;
-    Eigen::VectorXs prev_wolf_state = wolf_problem_ptr_->getTrajectory()->getFrameList().back()->getState();
+    Eigen::VectorXd prev_wolf_state = wolf_problem_ptr_->getTrajectory()->getFrameList().back()->getState();
     summary_diff = ceres_manager_wolf_diff->solve();
-    Eigen::VectorXs post_wolf_state = wolf_problem_ptr_->getTrajectory()->getFrameList().back()->getState();
+    Eigen::VectorXd post_wolf_state = wolf_problem_ptr_->getTrajectory()->getFrameList().back()->getState();
     std::cout << " prev_wolf_state : " << prev_wolf_state.transpose() << "\n post_wolf_state : " << post_wolf_state.transpose() << std::endl;
     //std::cout << summary_wolf_diff.BriefReport() << std::endl;
     std::cout << "solved!" << std::endl;
diff --git a/demos/demo_imuDock.cpp b/demos/demo_imuDock.cpp
index c05fbbf9c4e676c5611c7073b94b9f55385a9267..6c3d190af92ff9606d20ee1bb2cf7a879b2b16fd 100644
--- a/demos/demo_imuDock.cpp
+++ b/demos/demo_imuDock.cpp
@@ -85,17 +85,17 @@ int main(int argc, char** argv)
     #endif
 
     // ___initialize variabes that will be used through the code___
-    Eigen::VectorXs problem_origin(16);
-    Eigen::Vector7s imu_pose((Eigen::Vector7s()<<0,0,0,0,0,0,1).finished()), odom_pose((Eigen::Vector7s()<<0,0,0,0,0,0,1).finished());
+    Eigen::VectorXd problem_origin(16);
+    Eigen::Vector7d imu_pose((Eigen::Vector7d()<<0,0,0,0,0,0,1).finished()), odom_pose((Eigen::Vector7d()<<0,0,0,0,0,0,1).finished());
     problem_origin << 0,0,0, 0,0,0,1, 0,0,0, 0,0,0, 0,0,0;
     
     //Create vectors to store data and time
-    Eigen::Vector6s data_imu, data_odom;
-    Scalar clock;
+    Eigen::Vector6d data_imu, data_odom;
+    double clock;
     TimeStamp ts(0), ts_output(0); //will be used to store the data timestamps and set timestamps in captures
 
     // ___Define expected values___
-    Eigen::Vector7s expected_KF1_pose((Eigen::Vector7s()<<0,0,0,0,0,0,1).finished()), expected_KF2_pose((Eigen::Vector7s()<<0,-0.06,0,0,0,0,11).finished());
+    Eigen::Vector7d expected_KF1_pose((Eigen::Vector7d()<<0,0,0,0,0,0,1).finished()), expected_KF2_pose((Eigen::Vector7d()<<0,-0.06,0,0,0,0,11).finished());
 
     //#################################################### SETTING PROBLEM
     std::string wolf_root = _WOLF_ROOT_DIR;
@@ -121,7 +121,7 @@ int main(int argc, char** argv)
     // ___process IMU and odometry___
 
     //Create captures
-    CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sensorIMU, data_imu, Matrix6s::Identity(), Vector6s::Zero()); //ts is set at 0
+    CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sensorIMU, data_imu, Matrix6d::Identity(), Vector6d::Zero()); //ts is set at 0
     CaptureMotionPtr mot_ptr = std::make_shared<CaptureMotion>(ts, sensorOdom, data_odom, 7, 6, nullptr);
 
     //while we do not reach the end of file, read IMU input (ts, Ax, Ay, Az, Wx, Wy, Wz) and process data through capture
@@ -175,8 +175,8 @@ int main(int argc, char** argv)
     // ___Create needed factors___
 
     //Add Fix3D factor on first KeyFrame (with large covariance except for yaw)
-    Eigen::MatrixXs featureFix_cov(6,6);
-    featureFix_cov = Eigen::MatrixXs::Identity(6,6);
+    Eigen::MatrixXd featureFix_cov(6,6);
+    featureFix_cov = Eigen::MatrixXd::Identity(6,6);
     featureFix_cov.topLeftCorner(3,3) *= 1e-8; // position variances (it's fixed anyway)
     featureFix_cov(3,3) = pow( .02  , 2); // roll variance
     featureFix_cov(4,4) = pow( .02  , 2); // pitch variance
@@ -185,8 +185,8 @@ int main(int argc, char** argv)
     FeatureBasePtr featureFix = cap_fix->addFeature(std::make_shared<FeatureBase>("ODOM 3D", problem_origin.head(7), featureFix_cov));
     FactorFix3DPtr fac_fix = std::static_pointer_cast<FactorPose3D>(featureFix->addFactor(std::make_shared<FactorPose3D>(featureFix)));
 
-    Eigen::MatrixXs featureFixBias_cov(6,6);
-    featureFixBias_cov = Eigen::MatrixXs::Identity(6,6); 
+    Eigen::MatrixXd featureFixBias_cov(6,6);
+    featureFixBias_cov = Eigen::MatrixXd::Identity(6,6); 
     featureFixBias_cov.topLeftCorner(3,3) *= sensorIMU->getAbInitialStdev() * sensorIMU->getAbInitialStdev();
     featureFixBias_cov.bottomRightCorner(3,3) *= sensorIMU->getWbInitialStdev() * sensorIMU->getWbInitialStdev();
     CaptureBasePtr cap_fixbias = KF1->addCapture(std::make_shared<CaptureMotion>(0, nullptr, problem_origin.tail(6), featureFixBias_cov, 6, 6, nullptr));
@@ -228,7 +228,7 @@ int main(int argc, char** argv)
          */
 
         unsigned int time_iter(0);
-        Scalar ms(0.001);
+        double ms(0.001);
         ts_output.set(0);
         while(ts_output.get() < ts.get() + ms)
         {
@@ -248,13 +248,13 @@ int main(int argc, char** argv)
 
     // ___Get standard deviation from covariances___
     #ifdef ADD_KF3
-        Eigen::MatrixXs cov_KF1(16,16), cov_KF2(16,16), cov_KF3(16,16);
+        Eigen::MatrixXd cov_KF1(16,16), cov_KF2(16,16), cov_KF3(16,16);
 
         problem->getFrameCovariance(KF1, cov_KF1);
         problem->getFrameCovariance(KF2, cov_KF2);
         problem->getFrameCovariance(KF3, cov_KF3);
 
-        Eigen::Matrix<wolf::Scalar, 16, 1> stdev_KF1, stdev_KF2, stdev_KF3;
+        Eigen::Matrix<double, 16, 1> stdev_KF1, stdev_KF2, stdev_KF3;
 
         stdev_KF1 = cov_KF1.diagonal().array().sqrt();
         stdev_KF2 = cov_KF2.diagonal().array().sqrt();
@@ -264,12 +264,12 @@ int main(int argc, char** argv)
         WOLF_DEBUG("stdev KF2 : ", stdev_KF2.transpose());
         WOLF_DEBUG("stdev KF3 : ", stdev_KF3.transpose());
     #else
-        Eigen::MatrixXs cov_KF1(16,16), cov_KF2(16,16);
+        Eigen::MatrixXd cov_KF1(16,16), cov_KF2(16,16);
 
         problem->getFrameCovariance(KF1, cov_KF1);
         problem->getFrameCovariance(KF2, cov_KF2);
 
-        Eigen::Matrix<wolf::Scalar, 16, 1> stdev_KF1, stdev_KF2;
+        Eigen::Matrix<double, 16, 1> stdev_KF1, stdev_KF2;
 
         stdev_KF1 = cov_KF1.diagonal().array().sqrt();
         stdev_KF2 = cov_KF2.diagonal().array().sqrt();
diff --git a/demos/demo_imuDock_autoKFs.cpp b/demos/demo_imuDock_autoKFs.cpp
index 039615445807ab6ef9e1dadab7e273135bc650ef..c22345556e017078596b7f813be05fa9474967d4 100644
--- a/demos/demo_imuDock_autoKFs.cpp
+++ b/demos/demo_imuDock_autoKFs.cpp
@@ -91,20 +91,20 @@ int main(int argc, char** argv)
     #endif
 
     // ___initialize variabes that will be used through the code___
-    Eigen::VectorXs problem_origin(16);
-    Eigen::Vector7s imu_pose((Eigen::Vector7s()<<0,0,0,0,0,0,1).finished()), odom_pose((Eigen::Vector7s()<<0,0,0,0,0,0,1).finished());
+    Eigen::VectorXd problem_origin(16);
+    Eigen::Vector7d imu_pose((Eigen::Vector7d()<<0,0,0,0,0,0,1).finished()), odom_pose((Eigen::Vector7d()<<0,0,0,0,0,0,1).finished());
     problem_origin << 0,0,0, 0,0,0,1, 0,0,0, 0,0,0, 0,0,0;
     
     //Create vectors to store data and time
-    Eigen::Vector6s data_imu, data_odom;
-    Scalar clock;
+    Eigen::Vector6d data_imu, data_odom;
+    double clock;
     TimeStamp ts(0), ts_output(0); //will be used to store the data timestamps and set timestamps in captures
 
     // ___Define expected values___
-    Eigen::Vector7s expected_KF1_pose((Eigen::Vector7s()<<0,0,0,0,0,0,1).finished()), expected_KF2_pose((Eigen::Vector7s()<<0,-0.06,0,0,0,0,11).finished());
+    Eigen::Vector7d expected_KF1_pose((Eigen::Vector7d()<<0,0,0,0,0,0,1).finished()), expected_KF2_pose((Eigen::Vector7d()<<0,-0.06,0,0,0,0,11).finished());
 
     #ifdef AUTO_KFs
-        std::array<Scalar, 50> lastms_imuData;
+        std::array<double, 50> lastms_imuData;
     #endif
     //#################################################### SETTING PROBLEM
     std::string wolf_root = _WOLF_ROOT_DIR;
@@ -130,7 +130,7 @@ int main(int argc, char** argv)
     // ___process IMU and odometry___
 
     //Create captures
-    CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sensorIMU, data_imu, Matrix6s::Identity(), Vector6s::Zero()); //ts is set at 0
+    CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sensorIMU, data_imu, Matrix6d::Identity(), Vector6d::Zero()); //ts is set at 0
     CaptureMotionPtr mot_ptr = std::make_shared<CaptureMotion>(ts, sensorOdom, data_odom, 7, 6, nullptr);
 
     //while we do not reach the end of file, read IMU input (ts, Ax, Ay, Az, Wx, Wy, Wz) and process data through capture
@@ -190,8 +190,8 @@ int main(int argc, char** argv)
     // ___Create needed factors___
 
     //Add Fix3D factor on first KeyFrame (with large covariance except for yaw)
-    Eigen::MatrixXs featureFix_cov(6,6);
-    featureFix_cov = Eigen::MatrixXs::Identity(6,6);
+    Eigen::MatrixXd featureFix_cov(6,6);
+    featureFix_cov = Eigen::MatrixXd::Identity(6,6);
     featureFix_cov.topLeftCorner(3,3) *= 1e-8; // position variances (it's fixed anyway)
     featureFix_cov(3,3) = pow( .01  , 2); // roll variance
     featureFix_cov(4,4) = pow( .01  , 2); // pitch variance
@@ -200,8 +200,8 @@ int main(int argc, char** argv)
     FeatureBasePtr featureFix = cap_fix->addFeature(std::make_shared<FeatureBase>("ODOM 3D", problem_origin.head(7), featureFix_cov));
     FactorFix3DPtr fac_fix = std::static_pointer_cast<FactorPose3D>(featureFix->addFactor(std::make_shared<FactorPose3D>(featureFix)));
 
-    Eigen::MatrixXs featureFixBias_cov(6,6);
-    featureFixBias_cov = Eigen::MatrixXs::Identity(6,6); 
+    Eigen::MatrixXd featureFixBias_cov(6,6);
+    featureFixBias_cov = Eigen::MatrixXd::Identity(6,6); 
     featureFixBias_cov.topLeftCorner(3,3) *= sensorIMU->getAbInitialStdev() * sensorIMU->getAbInitialStdev();
     featureFixBias_cov.bottomRightCorner(3,3) *= sensorIMU->getWbInitialStdev() * sensorIMU->getWbInitialStdev();
     CaptureBasePtr cap_fixbias = KF1->addCapture(std::make_shared<CaptureMotion>(0, nullptr, problem_origin.tail(6), featureFixBias_cov, 6, 6, nullptr));
@@ -220,7 +220,7 @@ int main(int argc, char** argv)
         {
             frame_imu->getP()->fix();
             frame_imu->getO()->unfix();
-            frame_imu->getV()->setState((Eigen::Vector3s()<<0,0,0).finished()); //fix all velocties to 0 ()
+            frame_imu->getV()->setState((Eigen::Vector3d()<<0,0,0).finished()); //fix all velocties to 0 ()
             frame_imu->getV()->fix();
             frame_imu->getAccBias()->unfix();
             frame_imu->getGyroBias()->unfix();
@@ -237,7 +237,7 @@ int main(int argc, char** argv)
          */
 
         unsigned int time_iter(0);
-        Scalar ms(0.001);
+        double ms(0.001);
         ts_output.set(0);
         while(ts_output.get() < ts.get() + ms)
         {
@@ -256,8 +256,8 @@ int main(int argc, char** argv)
     //#################################################### RESULTS PART
 
     // ___Get standard deviation from covariances___ and output this in a file
-    Eigen::MatrixXs cov_KF(16,16);
-    Eigen::Matrix<wolf::Scalar, 16, 1> stdev_KF;
+    Eigen::MatrixXd cov_KF(16,16);
+    Eigen::Matrix<double, 16, 1> stdev_KF;
     for(auto frame : trajectory)
     {
         if(frame->isKey())
@@ -296,9 +296,9 @@ int main(int argc, char** argv)
     return 0;
 }
 
-/*Scalar getIMUStdev(Eigen::VectorXs _data) //input argument : whatever will contain the data in the capture
+/*double getIMUStdev(Eigen::VectorXd _data) //input argument : whatever will contain the data in the capture
 {
-    Eigen::Vector6s mean(Eigen::Vector6s::Zero()), stdev(Eigen::Vector6s::Zero());
+    Eigen::Vector6d mean(Eigen::Vector6d::Zero()), stdev(Eigen::Vector6d::Zero());
     unsigned int _data_size(_data.size());
     
     mean = _data.mean()/_data_size;
diff --git a/demos/demo_imuPlateform_Offline.cpp b/demos/demo_imuPlateform_Offline.cpp
index e0e4e4778e91090221d70121bd89907ad3756823..0b98b3e9675c6c0bf0a3ca1c559d4e4fbcc70f02 100644
--- a/demos/demo_imuPlateform_Offline.cpp
+++ b/demos/demo_imuPlateform_Offline.cpp
@@ -70,7 +70,7 @@ int main(int argc, char** argv)
         
     // WOLF PROBLEM
     ProblemPtr wolf_problem_ptr_ = Problem::create("PQVBB 3D");
-    Eigen::VectorXs x_origin(16);
+    Eigen::VectorXd x_origin(16);
     x_origin << 0,0,0,  0,0,0,1,  0,0,0,  0,0,0,  0,0,0; //INITIAL CONDITIONS
     TimeStamp t(0);
 
@@ -82,7 +82,7 @@ int main(int argc, char** argv)
     CeresManager* ceres_manager_wolf_diff = new CeresManager(wolf_problem_ptr_, ceres_options);
 
     // SENSOR + PROCESSOR IMU
-    SensorBasePtr sen0_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_imu.yaml");
+    SensorBasePtr sen0_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_imu.yaml");
     ProcessorIMUParamsPtr prc_imu_params = std::make_shared<ProcessorParamsIMU>();
     prc_imu_params->max_time_span = 10;
     prc_imu_params->max_buff_length = 1000000000; //make it very high so that this condition will not pass
@@ -94,7 +94,7 @@ int main(int argc, char** argv)
     ProcessorIMUPtr processor_ptr_imu = std::static_pointer_cast<ProcessorIMU>(processor_ptr_);
 
     // SENSOR + PROCESSOR ODOM 3D
-    SensorBasePtr sen1_ptr = wolf_problem_ptr_->installSensor("ODOM 3D", "odom", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_odom_3D.yaml");
+    SensorBasePtr sen1_ptr = wolf_problem_ptr_->installSensor("ODOM 3D", "odom", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_odom_3D.yaml");
     ProcessorParamsOdom3DPtr prc_odom3D_params = std::make_shared<ProcessorParamsOdom3D>();
     prc_odom3D_params->max_time_span = 1.9999;
     prc_odom3D_params->max_buff_length = 1000000000; //make it very high so that this condition will not pass
@@ -117,13 +117,13 @@ int main(int argc, char** argv)
     //===================================================== PROCESS DATA
     // PROCESS DATA
 
-    Eigen::Vector6s data_imu, data_odom3D;
+    Eigen::Vector6d data_imu, data_odom3D;
     data_imu << 0,0,-wolf::gravity()(2), 0,0,0;
     data_odom3D << 0,-0.06,0, 0,0,0;
 
-    Scalar input_clock;
+    double input_clock;
     TimeStamp ts(0);
-    wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, Matrix6s::Identity(), Vector6s::Zero());
+    wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, Matrix6d::Identity(), Vector6d::Zero());
     wolf::CaptureMotionPtr mot_ptr = std::make_shared<CaptureMotion>(t, sen_odom3D, data_odom3D, 6, 6, nullptr);
 
     //when we find a IMU timestamp corresponding with this odometry timestamp then we process odometry measurement
@@ -207,10 +207,10 @@ int main(int argc, char** argv)
     wolf_problem_ptr_->print(4,1,1,1);
 
     #ifdef DEBUG_RESULTS
-    Eigen::VectorXs frm_state(16);
-    Eigen::Matrix<wolf::Scalar, 16, 1> cov_stdev;
-    Eigen::MatrixXs covX(16,16);
-    Eigen::MatrixXs cov3(Eigen::Matrix3s::Zero());
+    Eigen::VectorXd frm_state(16);
+    Eigen::Matrix<double, 16, 1> cov_stdev;
+    Eigen::MatrixXd covX(16,16);
+    Eigen::MatrixXd cov3(Eigen::Matrix3d::Zero());
 
     wolf::FrameBasePtrList frame_list = wolf_problem_ptr_->getTrajectory()->getFrameList();
     for(FrameBasePtr frm_ptr : frame_list)
diff --git a/demos/demo_imu_constrained0.cpp b/demos/demo_imu_constrained0.cpp
index 817b08a14a4c71caf9f9e4807c71cc14cc43d78e..cff689aaf16c1e4692c79f27f2becf56827acca3 100644
--- a/demos/demo_imu_constrained0.cpp
+++ b/demos/demo_imu_constrained0.cpp
@@ -85,8 +85,8 @@ int main(int argc, char** argv)
         
     // WOLF PROBLEM
     ProblemPtr wolf_problem_ptr_ = Problem::create("PQVBB 3D");
-    Eigen::VectorXs x_origin(16);
-    Eigen::Vector6s origin_bias;
+    Eigen::VectorXd x_origin(16);
+    Eigen::Vector6d origin_bias;
     x_origin << 0,0,0,  0,0,0,1,  0,0,0,  0,0,0,  0,0,0; //INITIAL CONDITIONS    0.05,0.03,.00,  0.2,-0.05,.00;
     TimeStamp t(0);
 
@@ -103,7 +103,7 @@ int main(int argc, char** argv)
     CeresManager* ceres_manager_wolf_diff = new CeresManager(wolf_problem_ptr_, ceres_options);
 
     // SENSOR + PROCESSOR IMU
-    SensorBasePtr sen0_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_imu.yaml");
+    SensorBasePtr sen0_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_imu.yaml");
     ProcessorIMUParamsPtr prc_imu_params = std::make_shared<ProcessorParamsIMU>();
     prc_imu_params->max_time_span = 10;
     prc_imu_params->max_buff_length = 1000000000; //make it very high so that this condition will not pass
@@ -115,7 +115,7 @@ int main(int argc, char** argv)
     ProcessorIMUPtr processor_ptr_imu = std::static_pointer_cast<ProcessorIMU>(processor_ptr_);
 
     // SENSOR + PROCESSOR ODOM 3D
-    SensorBasePtr sen1_ptr = wolf_problem_ptr_->installSensor("ODOM 3D", "odom", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_odom_3D_HQ.yaml");
+    SensorBasePtr sen1_ptr = wolf_problem_ptr_->installSensor("ODOM 3D", "odom", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_odom_3D_HQ.yaml");
     ProcessorParamsOdom3DPtr prc_odom3D_params = std::make_shared<ProcessorParamsOdom3D>();
     prc_odom3D_params->max_time_span = 20.9999;
     prc_odom3D_params->max_buff_length = 1000000000; //make it very high so that this condition will not pass
@@ -128,7 +128,7 @@ int main(int argc, char** argv)
 
     // reset origin of problem
     t.set(0);
-    Eigen::Matrix<wolf::Scalar, 10, 1> expected_final_state;
+    Eigen::Matrix<double, 10, 1> expected_final_state;
     
     FrameIMUPtr origin_KF = std::static_pointer_cast<FrameIMU>(processor_ptr_imu->setOrigin(x_origin, t));
     processor_ptr_odom3D->setOrigin(origin_KF);
@@ -142,14 +142,14 @@ int main(int argc, char** argv)
     //===================================================== PROCESS DATA
     // PROCESS DATA
 
-    Eigen::Vector6s data_imu, data_odom3D;
+    Eigen::Vector6d data_imu, data_odom3D;
     data_imu << 0,0,-wolf::gravity()(2), 0,0,0;
     data_odom3D << 0,0,0, 0,0,0;
 
-    Scalar input_clock;
+    double input_clock;
     TimeStamp ts(0);
     TimeStamp t_odom(0);
-    wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, Matrix6s::Identity(), Vector6s::Zero());
+    wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, Matrix6d::Identity(), Vector6d::Zero());
     wolf::CaptureMotionPtr mot_ptr = std::make_shared<CaptureMotion>(t, sen_odom3D, data_odom3D, 6, 6, nullptr);
     
     //read first odom data from file
@@ -193,7 +193,7 @@ int main(int argc, char** argv)
             t = ts;
             //std::string report = ceres_manager_wolf_diff->solve(1); //0: nothing, 1: BriefReport, 2: FullReport
         
-            Eigen::VectorXs frm_state(16);
+            Eigen::VectorXd frm_state(16);
             frm_state = origin_KF->getState();
 
             KF0_evolution << std::setprecision(16) << ts.get() << "\t" << frm_state(0) << "\t" << frm_state(1) << "\t" << frm_state(2)
@@ -270,10 +270,10 @@ int main(int argc, char** argv)
     wolf_problem_ptr_->print(4,1,1,1);
 
     #ifdef DEBUG_RESULTS
-    Eigen::VectorXs frm_state(16);
-    Eigen::Matrix<wolf::Scalar, 16, 1> cov_stdev;
-    Eigen::MatrixXs covX(16,16);
-    Eigen::MatrixXs cov3(Eigen::Matrix3s::Zero());
+    Eigen::VectorXd frm_state(16);
+    Eigen::Matrix<double, 16, 1> cov_stdev;
+    Eigen::MatrixXd covX(16,16);
+    Eigen::MatrixXd cov3(Eigen::Matrix3d::Zero());
 
     wolf::FrameBasePtrList frame_list = wolf_problem_ptr_->getTrajectory()->getFrameList();
     for(FrameBasePtr frm_ptr : frame_list)
@@ -308,19 +308,19 @@ int main(int argc, char** argv)
     }
 
     //trials to print all factorIMUs' residuals
-    Eigen::Matrix<wolf::Scalar,15,1> IMU_residuals;
-    Eigen::Vector3s p1(Eigen::Vector3s::Zero());
-    Eigen::Vector4s q1_vec(Eigen::Vector4s::Zero());
-    Eigen::Map<Quaternions> q1(q1_vec.data());
-    Eigen::Vector3s v1(Eigen::Vector3s::Zero());
-    Eigen::Vector3s ab1(Eigen::Vector3s::Zero());
-    Eigen::Vector3s wb1(Eigen::Vector3s::Zero());
-    Eigen::Vector3s p2(Eigen::Vector3s::Zero());
-    Eigen::Vector4s q2_vec(Eigen::Vector4s::Zero());
-    Eigen::Map<Quaternions> q2(q2_vec.data());
-    Eigen::Vector3s v2(Eigen::Vector3s::Zero());
-    Eigen::Vector3s ab2(Eigen::Vector3s::Zero());
-    Eigen::Vector3s wb2(Eigen::Vector3s::Zero());
+    Eigen::Matrix<double,15,1> IMU_residuals;
+    Eigen::Vector3d p1(Eigen::Vector3d::Zero());
+    Eigen::Vector4d q1_vec(Eigen::Vector4d::Zero());
+    Eigen::Map<Quaterniond> q1(q1_vec.data());
+    Eigen::Vector3d v1(Eigen::Vector3d::Zero());
+    Eigen::Vector3d ab1(Eigen::Vector3d::Zero());
+    Eigen::Vector3d wb1(Eigen::Vector3d::Zero());
+    Eigen::Vector3d p2(Eigen::Vector3d::Zero());
+    Eigen::Vector4d q2_vec(Eigen::Vector4d::Zero());
+    Eigen::Map<Quaterniond> q2(q2_vec.data());
+    Eigen::Vector3d v2(Eigen::Vector3d::Zero());
+    Eigen::Vector3d ab2(Eigen::Vector3d::Zero());
+    Eigen::Vector3d wb2(Eigen::Vector3d::Zero());
 
     for(FrameBasePtr frm_ptr : frame_list)
     {
@@ -331,8 +331,8 @@ int main(int argc, char** argv)
             {
                 if(fac_ptr->getTypeId() == FAC_IMU)
                 {
-                    //Eigen::VectorXs prev_KF_state(fac_ptr->getFrameOther()->getState());
-                    //Eigen::VectorXs curr_KF_state(fac_ptr->getFeature()->getFrame()->getState());
+                    //Eigen::VectorXd prev_KF_state(fac_ptr->getFrameOther()->getState());
+                    //Eigen::VectorXd curr_KF_state(fac_ptr->getFeature()->getFrame()->getState());
                     p1      = fac_ptr->getFrameOther()->getP()->getState();
                     q1_vec  = fac_ptr->getFrameOther()->getO()->getState();
                     v1      = fac_ptr->getFrameOther()->getV()->getState();
diff --git a/demos/demo_processor_imu.cpp b/demos/demo_processor_imu.cpp
index ec77aedeee3242daffe10d89c1444fa9ea1bf1f9..e6062abbc6310e580e1623b9c01d851e4184a988 100644
--- a/demos/demo_processor_imu.cpp
+++ b/demos/demo_processor_imu.cpp
@@ -71,16 +71,16 @@ int main(int argc, char** argv)
 
     // Wolf problem
     ProblemPtr problem_ptr_ = Problem::create("PQVBB 3D");
-    Eigen::VectorXs extrinsics(7);
+    Eigen::VectorXd extrinsics(7);
     extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
     SensorBasePtr sensor_ptr = problem_ptr_->installSensor("IMU", "Main IMU", extrinsics, IntrinsicsBasePtr());
     problem_ptr_->installProcessor("IMU", "IMU pre-integrator", "Main IMU", "");
 
     // Time and data variables
     TimeStamp t;
-    Scalar mti_clock, tmp;
-    Eigen::Vector6s data;
-    Eigen::Matrix6s data_cov;
+    double mti_clock, tmp;
+    Eigen::Vector6d data;
+    Eigen::Matrix6d data_cov;
     data_cov.setIdentity();
     data_cov.topLeftCorner(3,3)     *= 0.01;
     data_cov.bottomRightCorner(3,3) *= 0.01;
@@ -91,12 +91,12 @@ int main(int argc, char** argv)
     t.set(mti_clock * 0.0001); // clock in 0,1 ms ticks
 
     // Set the origin
-    Eigen::VectorXs x0(16);
+    Eigen::VectorXd x0(16);
     x0 << 0,0,0,  0,0,0,1,  0,0,0,  0,0,0,  0,0,0; // Try some non-zero biases
     problem_ptr_->getProcessorMotion()->setOrigin(x0, t);
 
     // Create one capture to store the IMU data arriving from (sensor / callback / file / etc.)
-    CaptureIMUPtr imu_ptr = make_shared<CaptureIMU>(t, sensor_ptr, data, data_cov, Vector6s::Zero());
+    CaptureIMUPtr imu_ptr = make_shared<CaptureIMU>(t, sensor_ptr, data, data_cov, Vector6d::Zero());
 
 //    problem_ptr_->print();
 
@@ -137,7 +137,7 @@ int main(int argc, char** argv)
         std::cout << "Integrated delta: " << std::fixed << std::setprecision(3) << std::setw(8)
                 << problem_ptr_->getProcessorMotion()->getMotion().delta_integr_.transpose() << std::endl;
 
-        Eigen::VectorXs x = problem_ptr_->getProcessorMotion()->getCurrentState();
+        Eigen::VectorXd x = problem_ptr_->getProcessorMotion()->getCurrentState();
 
         std::cout << "Integrated state: " << std::fixed << std::setprecision(3) << std::setw(8)
                 << x.head(10).transpose() << std::endl;
@@ -150,9 +150,9 @@ int main(int argc, char** argv)
 //#ifdef DEBUG_RESULTS
         // ----- dump to file -----
 
-        Eigen::VectorXs delta_debug;
-        Eigen::VectorXs delta_integr_debug;
-        Eigen::VectorXs x_debug;
+        Eigen::VectorXd delta_debug;
+        Eigen::VectorXd delta_integr_debug;
+        Eigen::VectorXd x_debug;
         TimeStamp ts;
 
         delta_debug = problem_ptr_->getProcessorMotion()->getMotion().delta_;
diff --git a/demos/demo_processor_imu_jacobians.cpp b/demos/demo_processor_imu_jacobians.cpp
index 988244d1598d3a8a9a1bdebf0144266b6744044b..3555fa9c8f96c337e7375588684cdbb55bd29383 100644
--- a/demos/demo_processor_imu_jacobians.cpp
+++ b/demos/demo_processor_imu_jacobians.cpp
@@ -23,8 +23,8 @@
 
 using namespace wolf;
 
-void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq0, Eigen::Map<Eigen::Quaternions>& _dq0);
-void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq, Eigen::Map<Eigen::Quaternions>& _dq, const int& place );
+void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq0, Eigen::Map<Eigen::Quaterniond>& _dq0);
+void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq, Eigen::Map<Eigen::Quaterniond>& _dq, const int& place );
 
 int main(int argc, char** argv)
 {
@@ -33,20 +33,20 @@ int main(int argc, char** argv)
     std::cout << std::endl << "==================== processor IMU : Checking Jacobians ======================" << std::endl;
 
     TimeStamp t;
-    Eigen::Vector6s data_;
-    wolf::Scalar deg_to_rad = 3.14159265359/180.0;
+    Eigen::Vector6d data_;
+    double deg_to_rad = 3.14159265359/180.0;
     data_ << 10,0.5,3, 100*deg_to_rad,110*deg_to_rad,30*deg_to_rad;
 
     // Wolf problem
     ProblemPtr wolf_problem_ptr_ = Problem::create("PQVBB 3D");
-    Eigen::VectorXs IMU_extrinsics(7);
+    Eigen::VectorXd IMU_extrinsics(7);
     IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
     //SensorBase* sensor_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", IMU_extrinsics, nullptr);
     //wolf_problem_ptr_->installProcessor("IMU", "IMU pre-integrator", "Main IMU", "");
 
     // Set the origin
     t.set(0.0001); // clock in 0,1 ms ticks
-    Eigen::VectorXs x0(16);
+    Eigen::VectorXd x0(16);
     x0 << 0,1,0,   0,0,0,1,  1,0,0,  0,0,.000,  0,0,.000; // P Q V B B
 
     //wolf_problem_ptr_->getProcessorMotion()->setOrigin(x0, t);
@@ -55,18 +55,18 @@ int main(int argc, char** argv)
 
     ProcessorIMU_UnitTester processor_imu;
     //processor_imu.setOrigin(x0, t);
-    wolf::Scalar ddelta_bias = 0.00000001;
-    wolf::Scalar dt = 0.001;
+    double ddelta_bias = 0.00000001;
+    double dt = 0.001;
 
     //defining a random Delta to begin with (not to use Origin point)
-    Eigen::Matrix<wolf::Scalar,10,1> Delta0;
-    Delta0 = Eigen::Matrix<wolf::Scalar,10,1>::Random();
+    Eigen::Matrix<double,10,1> Delta0;
+    Delta0 = Eigen::Matrix<double,10,1>::Random();
     Delta0.head<3>() = Delta0.head<3>()*100;
     Delta0.tail<3>() = Delta0.tail<3>()*10;
-    Eigen::Vector3s ang0, ang;
+    Eigen::Vector3d ang0, ang;
     ang0 << 120.08*deg_to_rad, 12.36*deg_to_rad, 54.32*deg_to_rad; 
     //Delta0 << 0,0,0, 0,0,0,1, 0,0,0;
-    Eigen::Map<Eigen::Quaternions> Delta0_quat(Delta0.data()+3);
+    Eigen::Map<Eigen::Quaterniond> Delta0_quat(Delta0.data()+3);
     Delta0_quat = v2q(ang0);
     Delta0_quat.normalize();
     ang = q2v(Delta0_quat);
@@ -76,11 +76,11 @@ int main(int argc, char** argv)
 
     struct IMU_jac_bias bias_jac = processor_imu.finite_diff_ab(dt, data_, ddelta_bias, Delta0);
 
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL);
-    Eigen::Map<Eigen::Quaternions> dq0(NULL);
-    Eigen::Map<Eigen::Quaternions> Dq_noisy(NULL);
-    Eigen::Map<Eigen::Quaternions> dq_noisy(NULL);
-    Eigen::Map<Eigen::Quaternions> q_in_1(NULL), q_in_2(NULL);
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL);
+    Eigen::Map<Eigen::Quaterniond> dq0(NULL);
+    Eigen::Map<Eigen::Quaterniond> Dq_noisy(NULL);
+    Eigen::Map<Eigen::Quaterniond> dq_noisy(NULL);
+    Eigen::Map<Eigen::Quaterniond> q_in_1(NULL), q_in_2(NULL);
 
     /* IMU_jac_deltas struct form :
     contains vectors of size 7 :
@@ -89,7 +89,7 @@ int main(int argc, char** argv)
                 place 4 : added dw_bx in data         place 5 : added dw_by in data       place 6 : added dw_bz in data
     */
 
-    Eigen::Matrix3s dDp_dab, dDv_dab, dDp_dwb, dDv_dwb, dDq_dab, dDq_dwb;
+    Eigen::Matrix3d dDp_dab, dDv_dab, dDp_dwb, dDv_dwb, dDq_dab, dDq_dwb;
 
     /*
         dDp_dab = [dDp_dab_x, dDp_dab_y, dDp_dab_z]
@@ -115,7 +115,7 @@ int main(int argc, char** argv)
 
      std::cout << "\n input data : \n" << data_ << std::endl;
 
-     new (&q_in_1) Eigen::Map<Eigen::Quaternions>(bias_jac.Delta0_.data() + 3);
+     new (&q_in_1) Eigen::Map<Eigen::Quaterniond>(bias_jac.Delta0_.data() + 3);
      for(int i=0;i<3;i++){
          dDp_dab.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i).head(3) - bias_jac.Delta0_.head(3))/ddelta_bias;
          dDv_dab.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i).tail(3) - bias_jac.Delta0_.tail(3))/ddelta_bias;
@@ -123,10 +123,10 @@ int main(int argc, char** argv)
          dDp_dwb.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i+3).head(3) - bias_jac.Delta0_.head(3))/ddelta_bias;
          dDv_dwb.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i+3).tail(3) - bias_jac.Delta0_.tail(3))/ddelta_bias;
 
-         new (&q_in_2) Eigen::Map<Eigen::Quaternions>(bias_jac.Deltas_noisy_vect_(i).data() + 3);
+         new (&q_in_2) Eigen::Map<Eigen::Quaterniond>(bias_jac.Deltas_noisy_vect_(i).data() + 3);
          dDq_dab.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias;
 
-         new (&q_in_2) Eigen::Map<Eigen::Quaternions>(bias_jac.Deltas_noisy_vect_(i+3).data() + 3);
+         new (&q_in_2) Eigen::Map<Eigen::Quaterniond>(bias_jac.Deltas_noisy_vect_(i+3).data() + 3);
          dDq_dwb.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias;
          //std::cout << "matrix operation result :" << i << "\n" << q_in_1.matrix().transpose() * q_in_2.matrix() << std::endl;
          //std::cout << "matrix operation result to vector :" << i << "\n" << R2v( q_in_1.matrix().transpose() * q_in_2.matrix()) << std::endl;
@@ -261,8 +261,8 @@ int main(int argc, char** argv)
      */
 
      //taking care of noise now 
-    Eigen::Matrix<wolf::Scalar,9,1> Delta_noise;
-    Eigen::Matrix<wolf::Scalar,9,1> delta_noise;
+    Eigen::Matrix<double,9,1> Delta_noise;
+    Eigen::Matrix<double,9,1> delta_noise;
 
     Delta_noise << 0.00000001, 0.00000001, 0.00000001,  0.0001, 0.0001, 0.0001,  0.00000001, 0.00000001, 0.00000001;
     delta_noise << 0.00000001, 0.00000001, 0.00000001,  0.0001, 0.0001, 0.0001,  0.00000001, 0.00000001, 0.00000001;
@@ -277,8 +277,8 @@ int main(int argc, char** argv)
                             7: +dVx, 8: +dVy, 9: +dVz                                                               7: + dvx, 8: +dvy, 9: +dvz
     */
 
-    Eigen::Matrix3s dDp_dP, dDp_dV, dDp_dO, dDv_dP, dDv_dV, dDv_dO, dDo_dP, dDo_dV, dDo_dO;
-    Eigen::Matrix3s dDp_dp, dDp_dv, dDp_do, dDv_dp, dDv_dv, dDv_do, dDo_dp, dDo_dv, dDo_do; 
+    Eigen::Matrix3d dDp_dP, dDp_dV, dDp_dO, dDv_dP, dDv_dV, dDv_dO, dDo_dP, dDo_dV, dDo_dO;
+    Eigen::Matrix3d dDp_dp, dDp_dv, dDp_do, dDv_dp, dDv_dv, dDv_do, dDo_dp, dDo_dv, dDo_do; 
 
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
     
@@ -370,7 +370,7 @@ int main(int argc, char** argv)
         std::cout << "dDo_dO_a - dDo_dO : \n" << deltas_jac.jacobian_delta_preint_.block(3,3,3,3) - dDo_dO <<  "\n" << std::endl;
     }
 
-     Eigen::Matrix3s dDp_dp_a, dDv_dv_a, dDo_do_a;
+     Eigen::Matrix3d dDp_dp_a, dDv_dv_a, dDo_do_a;
      dDp_dp_a = deltas_jac.jacobian_delta_.block(0,0,3,3);
      dDv_dv_a = deltas_jac.jacobian_delta_.block(6,6,3,3);
      dDo_do_a = deltas_jac.jacobian_delta_.block(3,3,3,3);
@@ -404,15 +404,15 @@ int main(int argc, char** argv)
 
 using namespace wolf;
 
-void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq0, Eigen::Map<Eigen::Quaternions>& _dq0){
+void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq0, Eigen::Map<Eigen::Quaterniond>& _dq0){
 
-        new (&_Dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta0_.data() + 3);
-        new (&_dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta0_.data() + 3);
+        new (&_Dq0) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.Delta0_.data() + 3);
+        new (&_dq0) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.delta0_.data() + 3);
 }
 
-void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq, Eigen::Map<Eigen::Quaternions>& _dq, const int& place ){
+void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq, Eigen::Map<Eigen::Quaterniond>& _dq, const int& place ){
     
     assert(place < _jac_delta.Delta_noisy_vect_.size());
-    new (&_Dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
-    new (&_dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta_noisy_vect_(place).data() + 3);
+    new (&_Dq) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
+    new (&_dq) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.delta_noisy_vect_(place).data() + 3);
 }
diff --git a/include/IMU/capture/capture_IMU.h b/include/IMU/capture/capture_IMU.h
index 759b43de0fea48b569328ef9a220c4573d0e8caf..c5c3174f954668ec3aa3ac29e89715f20cc8a7c4 100644
--- a/include/IMU/capture/capture_IMU.h
+++ b/include/IMU/capture/capture_IMU.h
@@ -15,24 +15,24 @@ class CaptureIMU : public CaptureMotion
 
         CaptureIMU(const TimeStamp& _init_ts,
                    SensorBasePtr _sensor_ptr,
-                   const Eigen::Vector6s& _data,
-                   const Eigen::MatrixXs& _data_cov,
+                   const Eigen::Vector6d& _data,
+                   const Eigen::MatrixXd& _data_cov,
                    CaptureBasePtr _capture_origin_ptr = nullptr);
 
         CaptureIMU(const TimeStamp& _init_ts,
                    SensorBasePtr _sensor_ptr,
-                   const Eigen::Vector6s& _data,
-                   const Eigen::MatrixXs& _data_cov,
-                   const Vector6s& _bias,
+                   const Eigen::Vector6d& _data,
+                   const Eigen::MatrixXd& _data_cov,
+                   const Vector6d& _bias,
                    CaptureBasePtr _capture_origin_ptr = nullptr);
 
         virtual ~CaptureIMU();
 
-        virtual VectorXs correctDelta(const VectorXs& _delta, const VectorXs& _delta_error) const override;
+        virtual VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
 
 };
 
-inline Eigen::VectorXs CaptureIMU::correctDelta(const VectorXs& _delta, const VectorXs& _delta_error) const
+inline Eigen::VectorXd CaptureIMU::correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const
 {
     return imu::plus(_delta, _delta_error);
 }
diff --git a/include/IMU/factor/factor_IMU.h b/include/IMU/factor/factor_IMU.h
index 0378abb66e227f4d5de7ac48bb643e0df1ad1f97..d16c866f34a20045ee8be3b045b416992d22a2fe 100644
--- a/include/IMU/factor/factor_IMU.h
+++ b/include/IMU/factor/factor_IMU.h
@@ -45,7 +45,7 @@ class FactorIMU : public FactorAutodiff<FactorIMU, 15, 3, 4, 3, 6, 3, 4, 3, 6>
         /** \brief Estimation error given the states in the wolf tree
          *
          */
-        Eigen::Vector9s error();
+        Eigen::Vector9d error();
 
 
         /** \brief : compute the residual from the state blocks being iterated by the solver. (same as operator())
@@ -54,15 +54,15 @@ class FactorIMU : public FactorAutodiff<FactorIMU, 15, 3, 4, 3, 6, 3, 4, 3, 6>
             -> compares the corrected measurement with the expected one
             -> weights the result with the covariance of the noise (residual = sqrt_info_matrix * err;)
          * params :
-         * Vector3s _p1 : position in imu frame
-         * Vector4s _q1 : orientation quaternion in imu frame
-         * Vector3s _v1 : velocity in imu frame
-         * Vector3s _ab : accelerometer bias in imu frame
-         * Vector3s _wb : gyroscope bias in imu frame
-         * Vector3s _p2 : position in current frame
-         * Vector4s _q2 : orientation quaternion in current frame
-         * Vector3s _v2 : velocity in current frame
-         * Matrix<9,1, Scalar> _res : to retrieve residuals (POV) O is rotation vector... NOT A QUATERNION
+         * Vector3d _p1 : position in imu frame
+         * Vector4d _q1 : orientation quaternion in imu frame
+         * Vector3d _v1 : velocity in imu frame
+         * Vector3d _ab : accelerometer bias in imu frame
+         * Vector3d _wb : gyroscope bias in imu frame
+         * Vector3d _p2 : position in current frame
+         * Vector4d _q2 : orientation quaternion in current frame
+         * Vector3d _v2 : velocity in current frame
+         * Matrix<9,1, double> _res : to retrieve residuals (POV) O is rotation vector... NOT A QUATERNION
         */
         template<typename D1, typename D2, typename D3>
         bool residual(const Eigen::MatrixBase<D1> &     _p1,
@@ -79,13 +79,13 @@ class FactorIMU : public FactorAutodiff<FactorIMU, 15, 3, 4, 3, 6, 3, 4, 3, 6>
 
         /** Function expectation(...)
          * params :
-         * Vector3s _p1 : position in imu frame
-         * Vector4s _q1 : orientation quaternion in imu frame
-         * Vector3s _v1 : velocity in imu frame
-         * Vector3s _p2 : position in current frame
-         * Vector4s _q2 : orientation quaternion in current frame
-         * Vector3s _v2 : velocity in current frame
-         * Scalar   _dt : time interval between the two states
+         * Vector3d _p1 : position in imu frame
+         * Vector4d _q1 : orientation quaternion in imu frame
+         * Vector3d _v1 : velocity in imu frame
+         * Vector3d _p2 : position in current frame
+         * Vector4d _q2 : orientation quaternion in current frame
+         * Vector3d _v2 : velocity in current frame
+         * double   _dt : time interval between the two states
          *          _pe : expected position delta
          *          _qe : expected quaternion delta
          *          _ve : expected velocity delta
@@ -104,28 +104,28 @@ class FactorIMU : public FactorAutodiff<FactorIMU, 15, 3, 4, 3, 6, 3, 4, 3, 6>
 
         /** \brief : return the expected delta given the state blocks in the wolf tree
         */
-        Eigen::VectorXs expectation() const;
+        Eigen::VectorXd expectation() const;
 
     private:
         /// Preintegrated delta
-        Eigen::Vector3s dp_preint_;
-        Eigen::Quaternions dq_preint_;
-        Eigen::Vector3s dv_preint_;
+        Eigen::Vector3d dp_preint_;
+        Eigen::Quaterniond dq_preint_;
+        Eigen::Vector3d dv_preint_;
 
         // Biases used during preintegration
-        Eigen::Vector3s acc_bias_preint_;
-        Eigen::Vector3s gyro_bias_preint_;
+        Eigen::Vector3d acc_bias_preint_;
+        Eigen::Vector3d gyro_bias_preint_;
 
         // Jacobians of preintegrated deltas wrt biases
-        Eigen::Matrix3s dDp_dab_;
-        Eigen::Matrix3s dDv_dab_;
-        Eigen::Matrix3s dDp_dwb_;
-        Eigen::Matrix3s dDv_dwb_;
-        Eigen::Matrix3s dDq_dwb_;
+        Eigen::Matrix3d dDp_dab_;
+        Eigen::Matrix3d dDv_dab_;
+        Eigen::Matrix3d dDp_dwb_;
+        Eigen::Matrix3d dDv_dwb_;
+        Eigen::Matrix3d dDq_dwb_;
 
         /// Metrics
-        const Scalar dt_; ///< delta-time and delta-time-squared between keyframes
-        const Scalar ab_rate_stdev_, wb_rate_stdev_; //stdev for standard_deviation (= sqrt(variance))
+        const double dt_; ///< delta-time and delta-time-squared between keyframes
+        const double ab_rate_stdev_, wb_rate_stdev_; //stdev for standard_deviation (= sqrt(variance))
         
         /** bias covariance and bias residuals
          *
@@ -139,8 +139,8 @@ class FactorIMU : public FactorAutodiff<FactorIMU, 15, 3, 4, 3, 6, 3, 4, 3, 6>
          *
          * same logic for gyroscope bias
          */ 
-        const Eigen::Matrix3s sqrt_A_r_dt_inv;
-        const Eigen::Matrix3s sqrt_W_r_dt_inv;
+        const Eigen::Matrix3d sqrt_A_r_dt_inv;
+        const Eigen::Matrix3d sqrt_W_r_dt_inv;
 
 };
 
@@ -181,8 +181,8 @@ inline FactorIMU::FactorIMU(const FeatureIMUPtr&    _ftr_ptr,
         dt_(_ftr_ptr->getFrame()->getTimeStamp() - _cap_origin_ptr->getTimeStamp()),
         ab_rate_stdev_(std::static_pointer_cast<SensorIMU>(_ftr_ptr->getCapture()->getSensor())->getAbRateStdev()),
         wb_rate_stdev_(std::static_pointer_cast<SensorIMU>(_ftr_ptr->getCapture()->getSensor())->getWbRateStdev()),
-        sqrt_A_r_dt_inv((Eigen::Matrix3s::Identity() * ab_rate_stdev_ * sqrt(dt_)).inverse()),
-        sqrt_W_r_dt_inv((Eigen::Matrix3s::Identity() * wb_rate_stdev_ * sqrt(dt_)).inverse())
+        sqrt_A_r_dt_inv((Eigen::Matrix3d::Identity() * ab_rate_stdev_ * sqrt(dt_)).inverse()),
+        sqrt_W_r_dt_inv((Eigen::Matrix3d::Identity() * wb_rate_stdev_ * sqrt(dt_)).inverse())
 {
     //
 }
@@ -220,26 +220,26 @@ inline bool FactorIMU::operator ()(const T* const _p1,
     return true;
 }
 
-Eigen::Vector9s FactorIMU::error()
+Eigen::Vector9d FactorIMU::error()
 {
-    Vector6s bias = capture_other_ptr_.lock()->getCalibration();
+    Vector6d bias = capture_other_ptr_.lock()->getCalibration();
 
-    Map<const Vector3s > acc_bias(bias.data());
-    Map<const Vector3s > gyro_bias(bias.data() + 3);
+    Map<const Vector3d > acc_bias(bias.data());
+    Map<const Vector3d > gyro_bias(bias.data() + 3);
 
-    Eigen::Vector9s delta_exp = expectation();
+    Eigen::Vector9d delta_exp = expectation();
 
-    Eigen::Vector9s delta_preint = getMeasurement();
+    Eigen::Vector9d delta_preint = getMeasurement();
 
-    Eigen::Vector9s delta_step;
+    Eigen::Vector9d delta_step;
 
     delta_step.head<3>()     = dDp_dab_ * (acc_bias - acc_bias_preint_ ) + dDp_dwb_ * (gyro_bias - gyro_bias_preint_);
     delta_step.segment<3>(3) =                                       dDq_dwb_ * (gyro_bias - gyro_bias_preint_);
     delta_step.tail<3>()     = dDv_dab_ * (acc_bias - acc_bias_preint_ ) + dDv_dwb_ * (gyro_bias - gyro_bias_preint_);
 
-    Eigen::VectorXs delta_corr = imu::plus(delta_preint, delta_step);
+    Eigen::VectorXd delta_corr = imu::plus(delta_preint, delta_step);
 
-    Eigen::Vector9s res = imu::diff(delta_exp, delta_corr);
+    Eigen::Vector9d res = imu::diff(delta_exp, delta_corr);
 
     return res;
 }
@@ -421,26 +421,26 @@ inline bool FactorIMU::residual(const Eigen::MatrixBase<D1> &       _p1,
     return true;
 }
 
-inline Eigen::VectorXs FactorIMU::expectation() const
+inline Eigen::VectorXd FactorIMU::expectation() const
 {
     FrameBasePtr frm_current = getFeature()->getFrame();
     FrameBasePtr frm_previous = getFrameOther();
 
     //get information on current_frame in the FactorIMU
-    const Eigen::Vector3s frame_current_pos    = (frm_current->getP()->getState());
-    const Eigen::Quaternions frame_current_ori   (frm_current->getO()->getState().data());
-    const Eigen::Vector3s frame_current_vel    = (frm_current->getV()->getState());
+    const Eigen::Vector3d frame_current_pos    = (frm_current->getP()->getState());
+    const Eigen::Quaterniond frame_current_ori   (frm_current->getO()->getState().data());
+    const Eigen::Vector3d frame_current_vel    = (frm_current->getV()->getState());
 
     // get info on previous frame in the FactorIMU
-    const Eigen::Vector3s frame_previous_pos   = (frm_previous->getP()->getState());
-    const Eigen::Quaternions frame_previous_ori  (frm_previous->getO()->getState().data());
-    const Eigen::Vector3s frame_previous_vel   = (frm_previous->getV()->getState());
+    const Eigen::Vector3d frame_previous_pos   = (frm_previous->getP()->getState());
+    const Eigen::Quaterniond frame_previous_ori  (frm_previous->getO()->getState().data());
+    const Eigen::Vector3d frame_previous_vel   = (frm_previous->getV()->getState());
 
     // Define results vector and Map bits over it
-    Eigen::Matrix<Scalar, 10, 1> exp;
-    Eigen::Map<Eigen::Matrix<Scalar, 3, 1> >   pe(exp.data()    );
-    Eigen::Map<Eigen::Quaternion<Scalar> >     qe(exp.data() + 3);
-    Eigen::Map<Eigen::Matrix<Scalar, 3, 1> >   ve(exp.data() + 7);
+    Eigen::Matrix<double, 10, 1> exp;
+    Eigen::Map<Eigen::Matrix<double, 3, 1> >   pe(exp.data()    );
+    Eigen::Map<Eigen::Quaternion<double> >     qe(exp.data() + 3);
+    Eigen::Map<Eigen::Matrix<double, 3, 1> >   ve(exp.data() + 7);
 
     expectation(frame_previous_pos, frame_previous_ori, frame_previous_vel,
                 frame_current_pos, frame_current_ori, frame_current_vel,
diff --git a/include/IMU/factor/factor_fix_bias.h b/include/IMU/factor/factor_fix_bias.h
index 876fa5220cd41f5862574f211cec61de8f677bd3..c6dd1090b6a145a2c4fde782a0d59e39df22275a 100644
--- a/include/IMU/factor/factor_fix_bias.h
+++ b/include/IMU/factor/factor_fix_bias.h
@@ -54,20 +54,20 @@ inline bool FactorFixBias::operator ()(const T* const _ab, const T* const _wb, T
     ////////////////////////////////////////////////////////
     // print Jacobian. Uncomment this as you wish (remember to uncomment #include "ceres/jet.h" above):
 //    using ceres::Jet;
-//    Eigen::MatrixXs J(6,6);
-//    J.row(0) = ((Jet<Scalar, 3>)(er(0))).v;
-//    J.row(1) = ((Jet<Scalar, 3>)(er(1))).v;
-//    J.row(2) = ((Jet<Scalar, 3>)(er(2))).v;
-//    J.row(3) = ((Jet<Scalar, 3>)(er(3))).v;
-//    J.row(4) = ((Jet<Scalar, 3>)(er(4))).v;
-//    J.row(5) = ((Jet<Scalar, 3>)(er(5))).v;
-
-//    J.row(0) = ((Jet<Scalar, 3>)(res(0))).v;
-//    J.row(1) = ((Jet<Scalar, 3>)(res(1))).v;
-//    J.row(2) = ((Jet<Scalar, 3>)(res(2))).v;
-//    J.row(3) = ((Jet<Scalar, 3>)(res(3))).v;
-//    J.row(4) = ((Jet<Scalar, 3>)(res(4))).v;
-//    J.row(5) = ((Jet<Scalar, 3>)(res(5))).v;
+//    Eigen::MatrixXd J(6,6);
+//    J.row(0) = ((Jet<double, 3>)(er(0))).v;
+//    J.row(1) = ((Jet<double, 3>)(er(1))).v;
+//    J.row(2) = ((Jet<double, 3>)(er(2))).v;
+//    J.row(3) = ((Jet<double, 3>)(er(3))).v;
+//    J.row(4) = ((Jet<double, 3>)(er(4))).v;
+//    J.row(5) = ((Jet<double, 3>)(er(5))).v;
+
+//    J.row(0) = ((Jet<double, 3>)(res(0))).v;
+//    J.row(1) = ((Jet<double, 3>)(res(1))).v;
+//    J.row(2) = ((Jet<double, 3>)(res(2))).v;
+//    J.row(3) = ((Jet<double, 3>)(res(3))).v;
+//    J.row(4) = ((Jet<double, 3>)(res(4))).v;
+//    J.row(5) = ((Jet<double, 3>)(res(5))).v;
 
 //    if (sizeof(er(0)) != sizeof(double))
 //    {
diff --git a/include/IMU/feature/feature_IMU.h b/include/IMU/feature/feature_IMU.h
index 2413fd551980df7286d9e99a9bf944a1a116d324..6497213dc85c6996930208a48d64b479152c34a8 100644
--- a/include/IMU/feature/feature_IMU.h
+++ b/include/IMU/feature/feature_IMU.h
@@ -26,10 +26,10 @@ class FeatureIMU : public FeatureBase
          * \param gyro_bias gyroscope bias of origin frame
          * \param _cap_imu_ptr pointer to parent CaptureMotion
          */
-        FeatureIMU(const Eigen::VectorXs& _delta_preintegrated,
-                   const Eigen::MatrixXs& _delta_preintegrated_covariance,
-                   const Eigen::Vector6s& _bias,
-                   const Eigen::Matrix<Scalar,9,6>& _dD_db_jacobians,
+        FeatureIMU(const Eigen::VectorXd& _delta_preintegrated,
+                   const Eigen::MatrixXd& _delta_preintegrated_covariance,
+                   const Eigen::Vector6d& _bias,
+                   const Eigen::Matrix<double,9,6>& _dD_db_jacobians,
                    CaptureMotionPtr _cap_imu_ptr = nullptr);
 
         /** \brief Constructor from capture pointer
@@ -40,33 +40,33 @@ class FeatureIMU : public FeatureBase
 
         virtual ~FeatureIMU();
 
-        const Eigen::Vector3s&              getAccBiasPreint()  const;
-        const Eigen::Vector3s&              getGyroBiasPreint() const;
-        const Eigen::Matrix<Scalar, 9, 6>&  getJacobianBias()   const;
+        const Eigen::Vector3d&              getAccBiasPreint()  const;
+        const Eigen::Vector3d&              getGyroBiasPreint() const;
+        const Eigen::Matrix<double, 9, 6>&  getJacobianBias()   const;
 
     private:
 
         // Used biases
-        Eigen::Vector3s acc_bias_preint_;       ///< Acceleration bias used for delta preintegration
-        Eigen::Vector3s gyro_bias_preint_;      ///< Gyrometer bias used for delta preintegration
+        Eigen::Vector3d acc_bias_preint_;       ///< Acceleration bias used for delta preintegration
+        Eigen::Vector3d gyro_bias_preint_;      ///< Gyrometer bias used for delta preintegration
 
-        Eigen::Matrix<Scalar, 9, 6> jacobian_bias_;
+        Eigen::Matrix<double, 9, 6> jacobian_bias_;
 
     public:
       EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
 };
 
-inline const Eigen::Vector3s& FeatureIMU::getAccBiasPreint() const
+inline const Eigen::Vector3d& FeatureIMU::getAccBiasPreint() const
 {
     return acc_bias_preint_;
 }
 
-inline const Eigen::Vector3s& FeatureIMU::getGyroBiasPreint() const
+inline const Eigen::Vector3d& FeatureIMU::getGyroBiasPreint() const
 {
     return gyro_bias_preint_;
 }
 
-inline const Eigen::Matrix<Scalar, 9, 6>& FeatureIMU::getJacobianBias() const
+inline const Eigen::Matrix<double, 9, 6>& FeatureIMU::getJacobianBias() const
 {
     return jacobian_bias_;
 }
diff --git a/include/IMU/math/IMU_tools.h b/include/IMU/math/IMU_tools.h
index 2a599e9477ad9387f93522dd33f73bad2b96f3e1..76a6f5cef00e14e8035204e4f0bd9a4f9e4622a5 100644
--- a/include/IMU/math/IMU_tools.h
+++ b/include/IMU/math/IMU_tools.h
@@ -64,7 +64,7 @@ inline void identity(MatrixBase<D1>& p, MatrixBase<D2>& q, MatrixBase<D3>& v)
     v << T3(0), T3(0), T3(0);
 }
 
-template<typename T = Scalar>
+template<typename T = double>
 inline Matrix<T, 10, 1> identity()
 {
     Matrix<T, 10, 1> ret;
@@ -188,7 +188,7 @@ inline void compose(const MatrixBase<D1>& d1,
     // 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(0,6,3,3) = Matrix3s::Identity() * dt;        // dDp'/dDv = I*dt
+    J_sum_d1.block(0,6,3,3) = Matrix3d::Identity() * dt;        // dDp'/dDv = I*dt
     J_sum_d1.block(3,3,3,3) = dR2.transpose();                  // dDo'/dDo
     J_sum_d1.block(6,3,3,3).noalias() = - dR1 * skew(d2.tail(3)) ;     // dDv'/dDo
 
@@ -196,7 +196,7 @@ inline void compose(const MatrixBase<D1>& d1,
     J_sum_d2.setIdentity();                                     //
     J_sum_d2.block(0,0,3,3) = dR1;                              // dDp'/ddp
     J_sum_d2.block(6,6,3,3) = dR1;                              // dDv'/ddv
-    // J_sum_d2.block(3,3,3,3) = Matrix3s::Identity();          // dDo'/ddo = I
+    // J_sum_d2.block(3,3,3,3) = Matrix3d::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, dt, sum);
diff --git a/include/IMU/processor/processor_IMU.h b/include/IMU/processor/processor_IMU.h
index c12188537456673f664ee62d41bfd1520033d083..7a6a7f9a168c9fb4bb11586f4a4e8a39d7b1c6b6 100644
--- a/include/IMU/processor/processor_IMU.h
+++ b/include/IMU/processor/processor_IMU.h
@@ -39,36 +39,36 @@ class ProcessorIMU : public ProcessorMotion{
         static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params);
 
     protected:
-        virtual void computeCurrentDelta(const Eigen::VectorXs& _data,
-                                         const Eigen::MatrixXs& _data_cov,
-                                         const Eigen::VectorXs& _calib,
-                                         const Scalar _dt,
-                                         Eigen::VectorXs& _delta,
-                                         Eigen::MatrixXs& _delta_cov,
-                                         Eigen::MatrixXs& _jacobian_calib) const override;
-        virtual void deltaPlusDelta(const Eigen::VectorXs& _delta_preint,
-                                    const Eigen::VectorXs& _delta,
-                                    const Scalar _dt,
-                                    Eigen::VectorXs& _delta_preint_plus_delta) const override;
-        virtual void deltaPlusDelta(const Eigen::VectorXs& _delta_preint,
-                                    const Eigen::VectorXs& _delta,
-                                    const Scalar _dt,
-                                    Eigen::VectorXs& _delta_preint_plus_delta,
-                                    Eigen::MatrixXs& _jacobian_delta_preint,
-                                    Eigen::MatrixXs& _jacobian_delta) const override;
-        virtual void statePlusDelta(const Eigen::VectorXs& _x,
-                                const Eigen::VectorXs& _delta,
-                                const Scalar _dt,
-                                Eigen::VectorXs& _x_plus_delta ) const override;
-        virtual Eigen::VectorXs deltaZero() const override;
+        virtual void computeCurrentDelta(const Eigen::VectorXd& _data,
+                                         const Eigen::MatrixXd& _data_cov,
+                                         const Eigen::VectorXd& _calib,
+                                         const double _dt,
+                                         Eigen::VectorXd& _delta,
+                                         Eigen::MatrixXd& _delta_cov,
+                                         Eigen::MatrixXd& _jacobian_calib) const override;
+        virtual void deltaPlusDelta(const Eigen::VectorXd& _delta_preint,
+                                    const Eigen::VectorXd& _delta,
+                                    const double _dt,
+                                    Eigen::VectorXd& _delta_preint_plus_delta) const override;
+        virtual void deltaPlusDelta(const Eigen::VectorXd& _delta_preint,
+                                    const Eigen::VectorXd& _delta,
+                                    const double _dt,
+                                    Eigen::VectorXd& _delta_preint_plus_delta,
+                                    Eigen::MatrixXd& _jacobian_delta_preint,
+                                    Eigen::MatrixXd& _jacobian_delta) const override;
+        virtual void statePlusDelta(const Eigen::VectorXd& _x,
+                                const Eigen::VectorXd& _delta,
+                                const double _dt,
+                                Eigen::VectorXd& _x_plus_delta ) const override;
+        virtual Eigen::VectorXd deltaZero() const override;
         virtual bool voteForKeyFrame() const override;
         virtual CaptureMotionPtr emplaceCapture(const FrameBasePtr& _frame_own,
                                                 const SensorBasePtr& _sensor,
                                                 const TimeStamp& _ts,
-                                                const VectorXs& _data,
-                                                const MatrixXs& _data_cov,
-                                                const VectorXs& _calib,
-                                                const VectorXs& _calib_preint,
+                                                const VectorXd& _data,
+                                                const MatrixXd& _data_cov,
+                                                const VectorXd& _calib,
+                                                const VectorXd& _calib_preint,
                                                 const CaptureBasePtr& _capture_origin) override;
         virtual FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_motion) override;
         virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion,
@@ -76,7 +76,7 @@ class ProcessorIMU : public ProcessorMotion{
 
     protected:
         ProcessorParamsIMUPtr params_motion_IMU_;
-        Eigen::Matrix<Scalar, 9, 9> unmeasured_perturbation_cov_;
+        Eigen::Matrix<double, 9, 9> unmeasured_perturbation_cov_;
 
 };
 
@@ -88,9 +88,9 @@ class ProcessorIMU : public ProcessorMotion{
 
 namespace wolf{
 
-inline Eigen::VectorXs ProcessorIMU::deltaZero() const
+inline Eigen::VectorXd ProcessorIMU::deltaZero() const
 {
-    return (Eigen::VectorXs(10) << 0,0,0,  0,0,0,1,  0,0,0 ).finished(); // p, q, v
+    return (Eigen::VectorXd(10) << 0,0,0,  0,0,0,1,  0,0,0 ).finished(); // p, q, v
 }
 
 } // namespace wolf
diff --git a/include/IMU/sensor/sensor_IMU.h b/include/IMU/sensor/sensor_IMU.h
index d592ac88d5480b28d4d82cce187754ec3cc8f0f6..c5da4386a10bc06e40609f16eba9ee9d31fef084 100644
--- a/include/IMU/sensor/sensor_IMU.h
+++ b/include/IMU/sensor/sensor_IMU.h
@@ -14,16 +14,16 @@ WOLF_STRUCT_PTR_TYPEDEFS(IntrinsicsIMU);
 struct IntrinsicsIMU : public IntrinsicsBase
 {
         //noise std dev
-        Scalar w_noise = 0.001; //standard deviation of Gyroscope noise (same for all the axis) in rad/sec/ sqrt(s)
-        Scalar a_noise = 0.04; //standard deviation of Acceleration noise (same for all the axis) in m/s2/sqrt(s)
+        double w_noise = 0.001; //standard deviation of Gyroscope noise (same for all the axis) in rad/sec/ sqrt(s)
+        double a_noise = 0.04; //standard deviation of Acceleration noise (same for all the axis) in m/s2/sqrt(s)
 
         //Initial biases std dev
-        Scalar ab_initial_stdev = 0.01; //accelerometer micro_g/sec
-        Scalar wb_initial_stdev = 0.01; //gyroscope rad/sec
+        double ab_initial_stdev = 0.01; //accelerometer micro_g/sec
+        double wb_initial_stdev = 0.01; //gyroscope rad/sec
 
         // bias rate of change std dev
-        Scalar ab_rate_stdev = 0.00001;
-        Scalar wb_rate_stdev = 0.00001;
+        double ab_rate_stdev = 0.00001;
+        double wb_rate_stdev = 0.00001;
 
         virtual ~IntrinsicsIMU() = default;
     IntrinsicsIMU()
@@ -33,12 +33,12 @@ struct IntrinsicsIMU : public IntrinsicsBase
     IntrinsicsIMU(std::string _unique_name, const ParamsServer& _server):
         IntrinsicsBase(_unique_name, _server)
     {
-        w_noise             = _server.getParam<Scalar>(_unique_name + "/w_noise");
-        a_noise             = _server.getParam<Scalar>(_unique_name + "/a_noise");
-        ab_initial_stdev    = _server.getParam<Scalar>(_unique_name + "/ab_initial_stdev");
-        wb_initial_stdev    = _server.getParam<Scalar>(_unique_name + "/wb_initial_stdev");
-        ab_rate_stdev       = _server.getParam<Scalar>(_unique_name + "/ab_rate_stdev");
-        wb_rate_stdev       = _server.getParam<Scalar>(_unique_name + "/wb_rate_stdev");
+        w_noise             = _server.getParam<double>(_unique_name + "/w_noise");
+        a_noise             = _server.getParam<double>(_unique_name + "/a_noise");
+        ab_initial_stdev    = _server.getParam<double>(_unique_name + "/ab_initial_stdev");
+        wb_initial_stdev    = _server.getParam<double>(_unique_name + "/wb_initial_stdev");
+        ab_rate_stdev       = _server.getParam<double>(_unique_name + "/ab_rate_stdev");
+        wb_rate_stdev       = _server.getParam<double>(_unique_name + "/wb_rate_stdev");
     }
     std::string print() const
     {
@@ -58,60 +58,60 @@ class SensorIMU : public SensorBase
 {
 
     protected:
-        Scalar a_noise; //Power Spectral Density (same for all the axis) in micro_g/ sqrt(Hz)
-        Scalar w_noise; //Rate Noise Spectral Density (same for all the axis) in deg/sec/ sqrt(Hz)
+        double a_noise; //Power Spectral Density (same for all the axis) in micro_g/ sqrt(Hz)
+        double w_noise; //Rate Noise Spectral Density (same for all the axis) in deg/sec/ sqrt(Hz)
 
         //This is a trial to factor how much can the bias change in 1 sec at most
-        Scalar ab_initial_stdev; //accelerometer m/sec^s
-        Scalar wb_initial_stdev; //gyroscope rad/sec
-        Scalar ab_rate_stdev;    //accelerometer m/sec^2 / sqrt(sec)
-        Scalar wb_rate_stdev;    //gyroscope rad/sec / sqrt(sec)
+        double ab_initial_stdev; //accelerometer m/sec^s
+        double wb_initial_stdev; //gyroscope rad/sec
+        double ab_rate_stdev;    //accelerometer m/sec^2 / sqrt(sec)
+        double wb_rate_stdev;    //gyroscope rad/sec / sqrt(sec)
 
     public:
 
-        SensorIMU(const Eigen::VectorXs& _extrinsics, const IntrinsicsIMU& _params);
-        SensorIMU(const Eigen::VectorXs& _extrinsics, IntrinsicsIMUPtr _params);
+        SensorIMU(const Eigen::VectorXd& _extrinsics, const IntrinsicsIMU& _params);
+        SensorIMU(const Eigen::VectorXd& _extrinsics, IntrinsicsIMUPtr _params);
 
-        Scalar getGyroNoise() const;
-        Scalar getAccelNoise() const;
-        Scalar getWbInitialStdev() const;
-        Scalar getAbInitialStdev() const;
-        Scalar getWbRateStdev() const;
-        Scalar getAbRateStdev() const;
+        double getGyroNoise() const;
+        double getAccelNoise() const;
+        double getWbInitialStdev() const;
+        double getAbInitialStdev() const;
+        double getWbRateStdev() const;
+        double getAbRateStdev() const;
 
         virtual ~SensorIMU();
 
     public:
-        static SensorBasePtr create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_pq, const IntrinsicsBasePtr _intrinsics = nullptr);
+        static SensorBasePtr create(const std::string& _unique_name, const Eigen::VectorXd& _extrinsics_pq, const IntrinsicsBasePtr _intrinsics = nullptr);
 
 };
 
-inline Scalar SensorIMU::getGyroNoise() const
+inline double SensorIMU::getGyroNoise() const
 {
     return w_noise;
 }
 
-inline Scalar SensorIMU::getAccelNoise() const
+inline double SensorIMU::getAccelNoise() const
 {
     return a_noise;
 }
 
-inline Scalar SensorIMU::getWbInitialStdev() const
+inline double SensorIMU::getWbInitialStdev() const
 {
     return wb_initial_stdev;
 }
 
-inline Scalar SensorIMU::getAbInitialStdev() const
+inline double SensorIMU::getAbInitialStdev() const
 {
     return ab_initial_stdev;
 }
 
-inline Scalar SensorIMU::getWbRateStdev() const
+inline double SensorIMU::getWbRateStdev() const
 {
     return wb_rate_stdev;
 }
 
-inline Scalar SensorIMU::getAbRateStdev() const
+inline double SensorIMU::getAbRateStdev() const
 {
     return ab_rate_stdev;
 }
diff --git a/src/capture/capture_IMU.cpp b/src/capture/capture_IMU.cpp
index 23874f1833dac6f1b3c8f92d80751443d684c13a..45ee308845f81dc4e5d0d973085bfb0a0a25217b 100644
--- a/src/capture/capture_IMU.cpp
+++ b/src/capture/capture_IMU.cpp
@@ -6,8 +6,8 @@ namespace wolf {
 
 CaptureIMU::CaptureIMU(const TimeStamp& _init_ts,
                        SensorBasePtr _sensor_ptr,
-                       const Eigen::Vector6s& _acc_gyro_data,
-                       const Eigen::MatrixXs& _data_cov,
+                       const Eigen::Vector6d& _acc_gyro_data,
+                       const Eigen::MatrixXd& _data_cov,
                        CaptureBasePtr _capture_origin_ptr) :
                 CaptureMotion("IMU", _init_ts, _sensor_ptr, _acc_gyro_data, _data_cov, 10, 9, _capture_origin_ptr, nullptr, nullptr, std::make_shared<StateBlock>(6, false))
 {
@@ -16,9 +16,9 @@ CaptureIMU::CaptureIMU(const TimeStamp& _init_ts,
 
 CaptureIMU::CaptureIMU(const TimeStamp& _init_ts,
                        SensorBasePtr _sensor_ptr,
-                       const Eigen::Vector6s& _acc_gyro_data,
-                       const Eigen::MatrixXs& _data_cov,
-                       const Vector6s& _bias,
+                       const Eigen::Vector6d& _acc_gyro_data,
+                       const Eigen::MatrixXd& _data_cov,
+                       const Vector6d& _bias,
                        CaptureBasePtr _capture_origin_ptr) :
                 CaptureMotion("IMU", _init_ts, _sensor_ptr, _acc_gyro_data, _data_cov, 10, 9, _capture_origin_ptr, nullptr, nullptr, std::make_shared<StateBlock>(_bias, false))
 {
diff --git a/src/feature/feature_IMU.cpp b/src/feature/feature_IMU.cpp
index ee8d115e2f68b3babb7612b6748132d4ac4d6abc..e1a2961348c92abc2ce241ca2fe02d2efbdccec7 100644
--- a/src/feature/feature_IMU.cpp
+++ b/src/feature/feature_IMU.cpp
@@ -2,10 +2,10 @@
 
 namespace wolf {
 
-FeatureIMU::FeatureIMU(const Eigen::VectorXs& _delta_preintegrated,
-                       const Eigen::MatrixXs& _delta_preintegrated_covariance,
-                       const Eigen::Vector6s& _bias,
-                       const Eigen::Matrix<Scalar,9,6>& _dD_db_jacobians,
+FeatureIMU::FeatureIMU(const Eigen::VectorXd& _delta_preintegrated,
+                       const Eigen::MatrixXd& _delta_preintegrated_covariance,
+                       const Eigen::Vector6d& _bias,
+                       const Eigen::Matrix<double,9,6>& _dD_db_jacobians,
                        CaptureMotionPtr _cap_imu_ptr) :
     FeatureBase("IMU", _delta_preintegrated, _delta_preintegrated_covariance),
     acc_bias_preint_(_bias.head<3>()),
diff --git a/src/feature/feature_apriltag.cpp b/src/feature/feature_apriltag.cpp
index 18cb89cdf9813a5112b0aa3b7769834f1318fdaf..8a18da8d07b5fec1d6c231846516dd4057d24bd2 100644
--- a/src/feature/feature_apriltag.cpp
+++ b/src/feature/feature_apriltag.cpp
@@ -3,12 +3,12 @@
 
 namespace wolf {
 
-FeatureApriltag::FeatureApriltag(const Eigen::Vector7s & _measurement,
-                                 const Eigen::Matrix6s & _meas_uncertainty,
+FeatureApriltag::FeatureApriltag(const Eigen::Vector7d & _measurement,
+                                 const Eigen::Matrix6d & _meas_uncertainty,
                                  const int _tag_id,
                                  const apriltag_detection_t & _det,
-                                 Scalar _rep_error1,
-                                 Scalar _rep_error2,
+                                 double _rep_error1,
+                                 double _rep_error2,
                                  bool _use_rotation,
                                  UncertaintyType _uncertainty_type) :
     FeatureBase("APRILTAG", _measurement, _meas_uncertainty, _uncertainty_type),
@@ -33,7 +33,7 @@ FeatureApriltag::~FeatureApriltag()
     //
 }
 
-Scalar FeatureApriltag::getTagId() const
+double FeatureApriltag::getTagId() const
 {
     return tag_id_;
 }
@@ -48,12 +48,12 @@ const std::vector<cv::Point2d>& FeatureApriltag::getTagCorners() const
     return tag_corners_;
 }
 
-Scalar FeatureApriltag::getRepError1() const
+double FeatureApriltag::getRepError1() const
 {
     return rep_error1_;
 }
 
-Scalar FeatureApriltag::getRepError2() const
+double FeatureApriltag::getRepError2() const
 {
     return rep_error2_;
 }
diff --git a/src/landmark/landmark_apriltag.cpp b/src/landmark/landmark_apriltag.cpp
index 193c979b275c3e2c4a9202b90347ef376ac1f3d2..dd7112a9da75ea391820cb931ab7c8a94a3143cd 100644
--- a/src/landmark/landmark_apriltag.cpp
+++ b/src/landmark/landmark_apriltag.cpp
@@ -6,12 +6,12 @@
 
 namespace wolf {
 
-LandmarkApriltag::LandmarkApriltag(Eigen::Vector7s& pose, const int& _tagid, const Scalar& _tag_width) :
+LandmarkApriltag::LandmarkApriltag(Eigen::Vector7d& pose, const int& _tagid, const double& _tag_width) :
 	LandmarkBase("APRILTAG", std::make_shared<StateBlock>(pose.head(3)), std::make_shared<StateQuaternion>(pose.tail(4))),
 	tag_id_(_tagid),
 	tag_width_(_tag_width)
 {
-  	setDescriptor(Eigen::VectorXs::Constant(1,_tagid)); //change tagid to int ? do not use descriptor vector ?
+  	setDescriptor(Eigen::VectorXd::Constant(1,_tagid)); //change tagid to int ? do not use descriptor vector ?
     setId(_tagid); // overwrite lmk ID to match tag_id.
 }
 
@@ -21,7 +21,7 @@ LandmarkApriltag::~LandmarkApriltag()
 }
 
 
-Scalar LandmarkApriltag::getTagWidth() const
+double LandmarkApriltag::getTagWidth() const
 {
     return tag_width_;
 }
@@ -39,26 +39,26 @@ LandmarkBasePtr LandmarkApriltag::create(const YAML::Node& _lmk_node)
     // Parse YAML node with lmk info and data
     unsigned int    id                      = _lmk_node["id"]                   .as<unsigned int>();
     unsigned int    tag_id                  = _lmk_node["tag id"]               .as<unsigned int>();
-    Scalar          tag_width               = _lmk_node["tag width"]            .as<Scalar>();
-    Eigen::Vector3s pos                     = _lmk_node["position"]             .as<Eigen::Vector3s>();
+    double          tag_width               = _lmk_node["tag width"]            .as<double>();
+    Eigen::Vector3d pos                     = _lmk_node["position"]             .as<Eigen::Vector3d>();
     bool            pos_fixed               = _lmk_node["position fixed"]       .as<bool>();
-    Eigen::Vector4s vquat;
+    Eigen::Vector4d vquat;
     if (_lmk_node["orientation"].size() == 3)
     {
         // we have been given 3 Euler angles in degrees
-        Eigen::Vector3s   euler = M_TORAD * ( _lmk_node["orientation"]          .as<Eigen::Vector3s>() );
-        Eigen::Matrix3s       R = e2R(euler);
-        Eigen::Quaternions quat = R2q(R);
+        Eigen::Vector3d   euler = M_TORAD * ( _lmk_node["orientation"]          .as<Eigen::Vector3d>() );
+        Eigen::Matrix3d       R = e2R(euler);
+        Eigen::Quaterniond quat = R2q(R);
         vquat                   = quat.coeffs();
     }
     else if (_lmk_node["orientation"].size() == 4)
     {
         // we have been given a quaternion
-        vquat                               = _lmk_node["orientation"]          .as<Eigen::Vector4s>();
+        vquat                               = _lmk_node["orientation"]          .as<Eigen::Vector4d>();
     }
     bool            ori_fixed               = _lmk_node["orientation fixed"]    .as<bool>();
 
-    Eigen::Vector7s pose; pose << pos, vquat;
+    Eigen::Vector7d pose; pose << pos, vquat;
 
     // Create a new landmark
     LandmarkApriltagPtr lmk_ptr = std::make_shared<LandmarkApriltag>(pose, tag_id, tag_width);
diff --git a/src/processor/processor_IMU.cpp b/src/processor/processor_IMU.cpp
index a410afaaf843756d75efbc53d073c8bb6fe41de7..46ad0928cb51f068c91a04c849ee5c47f5a5ffe5 100644
--- a/src/processor/processor_IMU.cpp
+++ b/src/processor/processor_IMU.cpp
@@ -13,7 +13,7 @@ ProcessorIMU::ProcessorIMU(ProcessorParamsIMUPtr _params_motion_IMU) :
     jacobian_delta_preint_.setIdentity(9,9);                                    // dDp'/dDp, dDv'/dDv, all zeros
     jacobian_delta_.setIdentity(9,9);                                           //
     jacobian_calib_.setZero(9,6);
-    unmeasured_perturbation_cov_ = pow(params_motion_IMU_->unmeasured_perturbation_std, 2.0) * Eigen::Matrix<Scalar, 9, 9>::Identity();
+    unmeasured_perturbation_cov_ = pow(params_motion_IMU_->unmeasured_perturbation_std, 2.0) * Eigen::Matrix<double, 9, 9>::Identity();
 }
 
 ProcessorIMU::~ProcessorIMU()
@@ -47,7 +47,7 @@ bool ProcessorIMU::voteForKeyFrame() const
         return true;
     }
     // angle turned
-    Scalar angle = 2.0 * asin(delta_integrated_.segment(3,3).norm());
+    double angle = 2.0 * asin(delta_integrated_.segment(3,3).norm());
     if (angle > params_motion_IMU_->angle_turned)
     {
         WOLF_DEBUG( "PM: vote: angle turned" );
@@ -61,10 +61,10 @@ bool ProcessorIMU::voteForKeyFrame() const
 CaptureMotionPtr ProcessorIMU::emplaceCapture(const FrameBasePtr& _frame_own,
                                               const SensorBasePtr& _sensor,
                                               const TimeStamp& _ts,
-                                              const VectorXs& _data,
-                                              const MatrixXs& _data_cov,
-                                              const VectorXs& _calib,
-                                              const VectorXs& _calib_preint,
+                                              const VectorXd& _data,
+                                              const MatrixXd& _data_cov,
+                                              const VectorXd& _calib,
+                                              const VectorXd& _calib_preint,
                                               const CaptureBasePtr& _capture_origin)
 {
     auto cap_motion = std::static_pointer_cast<CaptureMotion>(CaptureBase::emplace<CaptureIMU>(_frame_own,
@@ -99,18 +99,18 @@ FactorBasePtr ProcessorIMU::emplaceFactor(FeatureBasePtr _feature_motion, Captur
     return fac_imu;
 }
 
-void ProcessorIMU::computeCurrentDelta(const Eigen::VectorXs& _data,
-                                       const Eigen::MatrixXs& _data_cov,
-                                       const Eigen::VectorXs& _calib,
-                                       const Scalar _dt,
-                                       Eigen::VectorXs& _delta,
-                                       Eigen::MatrixXs& _delta_cov,
-                                       Eigen::MatrixXs& _jac_delta_calib) const
+void ProcessorIMU::computeCurrentDelta(const Eigen::VectorXd& _data,
+                                       const Eigen::MatrixXd& _data_cov,
+                                       const Eigen::VectorXd& _calib,
+                                       const double _dt,
+                                       Eigen::VectorXd& _delta,
+                                       Eigen::MatrixXd& _delta_cov,
+                                       Eigen::MatrixXd& _jac_delta_calib) const
 {
     assert(_data.size() == data_size_ && "Wrong data size!");
 
     using namespace Eigen;
-    Matrix<Scalar, 9, 6> jac_delta_data;
+    Matrix<double, 9, 6> jac_delta_data;
 
     /*
      * We have the following computing pipeline:
@@ -141,10 +141,10 @@ void ProcessorIMU::computeCurrentDelta(const Eigen::VectorXs& _data,
 
 }
 
-void ProcessorIMU::deltaPlusDelta(const Eigen::VectorXs& _delta_preint,
-                                  const Eigen::VectorXs& _delta,
-                                  const Scalar _dt,
-                                  Eigen::VectorXs& _delta_preint_plus_delta) const
+void ProcessorIMU::deltaPlusDelta(const Eigen::VectorXd& _delta_preint,
+                                  const Eigen::VectorXd& _delta,
+                                  const double _dt,
+                                  Eigen::VectorXd& _delta_preint_plus_delta) const
 {
     /* MATHS according to Sola-16
      * Dp' = Dp + Dv*dt + 1/2*Dq*(a-a_b)*dt^2    = Dp + Dv*dt + Dq*dp   if  dp = 1/2*(a-a_b)*dt^2
@@ -156,10 +156,10 @@ void ProcessorIMU::deltaPlusDelta(const Eigen::VectorXs& _delta_preint,
     _delta_preint_plus_delta = imu::compose(_delta_preint, _delta, _dt);
 }
 
-void ProcessorIMU::statePlusDelta(const Eigen::VectorXs& _x,
-                                  const Eigen::VectorXs& _delta,
-                                  const Scalar _dt,
-                                  Eigen::VectorXs& _x_plus_delta) const
+void ProcessorIMU::statePlusDelta(const Eigen::VectorXd& _x,
+                                  const Eigen::VectorXd& _delta,
+                                  const double _dt,
+                                  Eigen::VectorXd& _x_plus_delta) const
 {
     assert(_x.size() == 10 && "Wrong _x vector size");
     assert(_delta.size() == 10 && "Wrong _delta vector size");
@@ -169,12 +169,12 @@ void ProcessorIMU::statePlusDelta(const Eigen::VectorXs& _x,
     _x_plus_delta = imu::composeOverState(_x, _delta, _dt);
 }
 
-void ProcessorIMU::deltaPlusDelta(const Eigen::VectorXs& _delta_preint,
-                                  const Eigen::VectorXs& _delta,
-                                  const Scalar _dt,
-                                  Eigen::VectorXs& _delta_preint_plus_delta,
-                                  Eigen::MatrixXs& _jacobian_delta_preint,
-                                  Eigen::MatrixXs& _jacobian_delta) const
+void ProcessorIMU::deltaPlusDelta(const Eigen::VectorXd& _delta_preint,
+                                  const Eigen::VectorXd& _delta,
+                                  const double _dt,
+                                  Eigen::VectorXd& _delta_preint_plus_delta,
+                                  Eigen::MatrixXd& _jacobian_delta_preint,
+                                  Eigen::MatrixXd& _jacobian_delta) const
 {
     /*
      * Expression of the delta integration step, D' = D (+) d:
diff --git a/src/processor/processor_tracker_landmark_apriltag.cpp b/src/processor/processor_tracker_landmark_apriltag.cpp
index 59e481187f838ee3d3687b44b56c27633b3ca105..148a1bedcf39e695a14b9a48191eeafb21de97c2 100644
--- a/src/processor/processor_tracker_landmark_apriltag.cpp
+++ b/src/processor/processor_tracker_landmark_apriltag.cpp
@@ -143,16 +143,16 @@ void ProcessorTrackerLandmarkApriltag::preProcess()
         zarray_get(detections, i, &det);
 
         int    tag_id     = det->id;
-        Scalar tag_width  = getTagWidth(tag_id);   // tag width in meters
+        double tag_width  = getTagWidth(tag_id);   // tag width in meters
 
-        Eigen::Isometry3ds c_M_t;
+        Eigen::Isometry3d c_M_t;
         bool use_rotation = true;
         //////////////////
         // IPPE (Infinitesimal Plane-based Pose Estimation)
         //////////////////
-        Eigen::Isometry3ds M_ippe1, M_ippe2, M_april, M_PnP;
-        Scalar rep_error1;
-        Scalar rep_error2;
+        Eigen::Isometry3d M_ippe1, M_ippe2, M_april, M_PnP;
+        double rep_error1;
+        double rep_error2;
         ippePoseEstimation(det, cv_K_, tag_width, M_ippe1, rep_error1, M_ippe2, rep_error2);
         // If not so sure about whether we have the right solution or not, do not create a feature
         use_rotation = ((rep_error2 / rep_error1 > ippe_min_ratio_) && rep_error1 < ippe_max_rep_error_);
@@ -160,19 +160,19 @@ void ProcessorTrackerLandmarkApriltag::preProcess()
         c_M_t = M_ippe1;
 
         // set the measured pose vector
-        Eigen::Vector3s translation ( c_M_t.translation() ); // translation vector in apriltag meters
-        Eigen::Vector7s pose;
+        Eigen::Vector3d translation ( c_M_t.translation() ); // translation vector in apriltag meters
+        Eigen::Vector7d pose;
         pose << translation, R2q(c_M_t.linear()).coeffs();
 
         // compute the covariance
-        // Eigen::Matrix6s cov = getVarVec().asDiagonal() ;  // fixed dummy covariance
-        Eigen::Matrix6s info = computeInformation(translation, c_M_t.linear(), K_, tag_width, std_pix_);  // Lie jacobians covariance
+        // Eigen::Matrix6d cov = getVarVec().asDiagonal() ;  // fixed dummy covariance
+        Eigen::Matrix6d info = computeInformation(translation, c_M_t.linear(), K_, tag_width, std_pix_);  // Lie jacobians covariance
 
         if (!use_rotation){
             // Put a very high covariance on angles measurements (low info matrix)
-            info.bottomLeftCorner(3,3) = Eigen::Matrix3s::Zero();
-            info.topRightCorner(3,3)    = Eigen::Matrix3s::Zero();
-            info.bottomRightCorner(3,3) = 0.0001 * Eigen::Matrix3s::Identity();
+            info.bottomLeftCorner(3,3) = Eigen::Matrix3d::Zero();
+            info.topRightCorner(3,3)    = Eigen::Matrix3d::Zero();
+            info.bottomRightCorner(3,3) = 0.0001 * Eigen::Matrix3d::Identity();
         }
 
         // add to detected features list
@@ -183,7 +183,7 @@ void ProcessorTrackerLandmarkApriltag::preProcess()
     apriltag_detections_destroy(detections);
 }
 
-void ProcessorTrackerLandmarkApriltag::ippePoseEstimation(apriltag_detection_t *_det, cv::Mat_<Scalar> _K, double _tag_width,
+void ProcessorTrackerLandmarkApriltag::ippePoseEstimation(apriltag_detection_t *_det, cv::Mat_<double> _K, double _tag_width,
                             Eigen::Isometry3d &_M1,
                             double &_rep_error1,
                             Eigen::Isometry3d &_M2,
@@ -200,7 +200,7 @@ void ProcessorTrackerLandmarkApriltag::ippePoseEstimation(apriltag_detection_t *
     // Same order as the 2D corners (anti clockwise, looking at the tag).
     // Looking at the tag, the reference frame is
     // X = Right, Y = Down, Z = Inside the plane
-    Scalar s = _tag_width/2;
+    double s = _tag_width/2;
     obj_pts.emplace_back(-s,  s, 0); // bottom left
     obj_pts.emplace_back( s,  s, 0); // bottom right
     obj_pts.emplace_back( s, -s, 0); // top right
@@ -220,15 +220,15 @@ void ProcessorTrackerLandmarkApriltag::ippePoseEstimation(apriltag_detection_t *
     // Puts the result in a Eigen affine Transform
     cv::Matx33d rmat1;
     cv::Rodrigues(rvec1, rmat1);
-    Eigen::Matrix3s R_eigen1; cv2eigen(rmat1, R_eigen1);
-    Eigen::Vector3s t_eigen1; cv2eigen(tvec1, t_eigen1);
+    Eigen::Matrix3d R_eigen1; cv2eigen(rmat1, R_eigen1);
+    Eigen::Vector3d t_eigen1; cv2eigen(tvec1, t_eigen1);
     _M1.matrix().block(0,0,3,3) = R_eigen1;
     _M1.matrix().block(0,3,3,1) = t_eigen1;
 
     cv::Matx33d rmat2;
     cv::Rodrigues(rvec2, rmat2);
-    Eigen::Matrix3s R_eigen2; cv2eigen(rmat2, R_eigen2);
-    Eigen::Vector3s t_eigen2; cv2eigen(tvec2, t_eigen2);
+    Eigen::Matrix3d R_eigen2; cv2eigen(rmat2, R_eigen2);
+    Eigen::Vector3d t_eigen2; cv2eigen(tvec2, t_eigen2);
     _M2.matrix().block(0,0,3,3) = R_eigen2;
     _M2.matrix().block(0,3,3,1) = t_eigen2;
 }
@@ -256,27 +256,27 @@ FactorBasePtr ProcessorTrackerLandmarkApriltag::createFactor(FeatureBasePtr _fea
 LandmarkBasePtr ProcessorTrackerLandmarkApriltag::createLandmark(FeatureBasePtr _feature_ptr)
 {
     // world to rob
-    Vector3s pos = getLast()->getFrame()->getP()->getState();
-    Quaternions quat (getLast()->getFrame()->getO()->getState().data());
-    Eigen::Isometry3ds w_M_r = Eigen::Translation<Scalar,3>(pos.head(3)) * quat;
+    Vector3d pos = getLast()->getFrame()->getP()->getState();
+    Quaterniond quat (getLast()->getFrame()->getO()->getState().data());
+    Eigen::Isometry3d w_M_r = Eigen::Translation<double,3>(pos.head(3)) * quat;
 
     // rob to camera
     pos = getSensor()->getP()->getState();
     quat.coeffs() = getSensor()->getO()->getState();
-    Eigen::Isometry3ds r_M_c = Eigen::Translation<Scalar,3>(pos.head(3)) * quat;
+    Eigen::Isometry3d r_M_c = Eigen::Translation<double,3>(pos.head(3)) * quat;
 
     // camera to lmk (tag)
     pos = _feature_ptr->getMeasurement().head(3);
     quat.coeffs() = _feature_ptr->getMeasurement().tail(4);
-    Eigen::Isometry3ds c_M_t   = Eigen::Translation<Scalar,3>(pos) * quat;
+    Eigen::Isometry3d c_M_t   = Eigen::Translation<double,3>(pos) * quat;
 
     // world to lmk (tag)
-    Eigen::Isometry3ds w_M_t = w_M_r * r_M_c * c_M_t;
+    Eigen::Isometry3d w_M_t = w_M_r * r_M_c * c_M_t;
 
     // make 7-vector for lmk (tag) pose
     pos  = w_M_t.translation();
     quat = w_M_t.linear();
-    Vector7s w_pose_t;
+    Vector7d w_pose_t;
     w_pose_t << pos, quat.coeffs();
 
     FeatureApriltagPtr feat_april = std::static_pointer_cast<FeatureApriltag>(_feature_ptr);
@@ -356,7 +356,7 @@ bool ProcessorTrackerLandmarkApriltag::voteForKeyFrame()
     else{
         enough_info = true;
     }
-    Scalar dt_incoming_origin = getIncoming()->getTimeStamp().get() - getOrigin()->getTimeStamp().get();
+    double dt_incoming_origin = getIncoming()->getTimeStamp().get() - getOrigin()->getTimeStamp().get();
     bool more_than_min_time_vote = dt_incoming_origin > min_time_vote_; 
 
     // Possible decision factors
@@ -383,7 +383,7 @@ unsigned int ProcessorTrackerLandmarkApriltag::findLandmarks(const LandmarkBaseP
             if(std::static_pointer_cast<LandmarkApriltag>(landmark_in_ptr)->getTagId() == tag_id)
             {
                 _feature_list_out.push_back(feature_in_image);
-                Scalar score(1.0);
+                double score(1.0);
                 LandmarkMatchPtr matched_landmark = std::make_shared<LandmarkMatch>(landmark_in_ptr, score); //TODO: smarter score
                 _feature_landmark_correspondences.emplace ( feature_in_image, matched_landmark );
                 break;
@@ -394,7 +394,7 @@ unsigned int ProcessorTrackerLandmarkApriltag::findLandmarks(const LandmarkBaseP
     return _feature_list_out.size();
 }
 
-wolf::Scalar ProcessorTrackerLandmarkApriltag::getTagWidth(int _id) const
+double ProcessorTrackerLandmarkApriltag::getTagWidth(int _id) const
 {
     if (tag_widths_.find(_id) != tag_widths_.end())
         return tag_widths_.at(_id);
@@ -402,34 +402,34 @@ wolf::Scalar ProcessorTrackerLandmarkApriltag::getTagWidth(int _id) const
         return tag_width_default_;
 }
 
-Eigen::Vector6s ProcessorTrackerLandmarkApriltag::getVarVec()
+Eigen::Vector6d ProcessorTrackerLandmarkApriltag::getVarVec()
 {
-    Eigen::Vector6s var_vec;
+    Eigen::Vector6d var_vec;
     var_vec << std_xy_*std_xy_, std_xy_*std_xy_, std_z_*std_z_, std_rpy_*std_rpy_, std_rpy_*std_rpy_, std_rpy_*std_rpy_;
 
     return var_vec;
 }
 
-Eigen::Matrix6s ProcessorTrackerLandmarkApriltag::computeInformation(Eigen::Vector3s const &t, Eigen::Matrix3s const &R, Eigen::Matrix3s const &K, Scalar const &tag_width, double const &sig_q)
+Eigen::Matrix6d ProcessorTrackerLandmarkApriltag::computeInformation(Eigen::Vector3d const &t, Eigen::Matrix3d const &R, Eigen::Matrix3d const &K, double const &tag_width, double const &sig_q)
 {
     // Same order as the 2D corners (anti clockwise, looking at the tag).
     // Looking at the tag, the reference frame is
     // X = Right, Y = Down, Z = Inside the plane
-    Scalar s = tag_width/2;
-    Eigen::Vector3s p1; p1 << -s,  s, 0; // bottom left
-    Eigen::Vector3s p2; p2 <<  s,  s, 0; // bottom right
-    Eigen::Vector3s p3; p3 <<  s, -s, 0; // top right
-    Eigen::Vector3s p4; p4 << -s, -s, 0; // top left
-    std::vector<Eigen::Vector3s> pvec = {p1, p2, p3, p4};
-    std::vector<Eigen::Vector2s> proj_pix_vec; proj_pix_vec.resize(4);
+    double s = tag_width/2;
+    Eigen::Vector3d p1; p1 << -s,  s, 0; // bottom left
+    Eigen::Vector3d p2; p2 <<  s,  s, 0; // bottom right
+    Eigen::Vector3d p3; p3 <<  s, -s, 0; // top right
+    Eigen::Vector3d p4; p4 << -s, -s, 0; // top left
+    std::vector<Eigen::Vector3d> pvec = {p1, p2, p3, p4};
+    std::vector<Eigen::Vector2d> proj_pix_vec; proj_pix_vec.resize(4);
 
     // Initialize jacobian matrices
-    Eigen::Matrix<Scalar, 8, 6> J_u_TR = Eigen::Matrix<Scalar, 8, 6>::Zero();  // 2N x 6 jac
-    Eigen::Vector3s h;
-    Eigen::Matrix3s J_h_T, J_h_R;
-    Eigen::Vector2s eu;  // 2D pixel coord, not needed
-    Eigen::Matrix<Scalar, 3, 6> J_h_TR;
-    Eigen::Matrix<Scalar, 2, 3> J_u_h;
+    Eigen::Matrix<double, 8, 6> J_u_TR = Eigen::Matrix<double, 8, 6>::Zero();  // 2N x 6 jac
+    Eigen::Vector3d h;
+    Eigen::Matrix3d J_h_T, J_h_R;
+    Eigen::Vector2d eu;  // 2D pixel coord, not needed
+    Eigen::Matrix<double, 3, 6> J_h_TR;
+    Eigen::Matrix<double, 2, 3> J_u_h;
     for (int i=0; i < pvec.size(); i++){
         // Pinhole projection to non normalized homogeneous coordinates in pixels (along with jacobians)
         pinholeHomogeneous(K, t, R, pvec[i], h, J_h_T, J_h_R);
@@ -443,22 +443,22 @@ Eigen::Matrix6s ProcessorTrackerLandmarkApriltag::computeInformation(Eigen::Vect
     }
 
     // Pixel uncertainty covariance matrix
-    Eigen::Matrix<Scalar, 8, 8> pixel_cov = pow(sig_q, 2) * Eigen::Matrix<Scalar, 8, 8>::Identity();
+    Eigen::Matrix<double, 8, 8> pixel_cov = pow(sig_q, 2) * Eigen::Matrix<double, 8, 8>::Identity();
     // 6 x 6 translation|rotation information matrix computed with covariance propagation formula (inverted)
-    Eigen::Matrix6s transformation_info  = (J_u_TR.transpose() * pixel_cov.inverse() * J_u_TR);  // Wolf jac
+    Eigen::Matrix6d transformation_info  = (J_u_TR.transpose() * pixel_cov.inverse() * J_u_TR);  // Wolf jac
 
     return transformation_info;
 
 }
 
-void ProcessorTrackerLandmarkApriltag::pinholeHomogeneous(Eigen::Matrix3s const & K, Eigen::Vector3s const & t,
-                                                          Eigen::Matrix3s const & R, Eigen::Vector3s const & p,
-                                                          Eigen::Vector3s &h, Eigen::Matrix3s &J_h_T, Eigen::Matrix3s &J_h_R)
+void ProcessorTrackerLandmarkApriltag::pinholeHomogeneous(Eigen::Matrix3d const & K, Eigen::Vector3d const & t,
+                                                          Eigen::Matrix3d const & R, Eigen::Vector3d const & p,
+                                                          Eigen::Vector3d &h, Eigen::Matrix3d &J_h_T, Eigen::Matrix3d &J_h_R)
 {
     // Pinhole projection + jacobians
     h =  K * (t + R * p);
     J_h_T = K;
-    Eigen::Matrix3s p_hat;
+    Eigen::Matrix3d p_hat;
     p_hat << 0, -p(2), p(1),
              p(2), 0, -p(0),
             -p(1), p(0), 0;
@@ -481,7 +481,7 @@ void ProcessorTrackerLandmarkApriltag::configure(SensorBasePtr _sensor)
     sen_cam_ptr->useRectifiedImages();
 
     // get camera intrinsic parameters
-    Eigen::Vector4s k(_sensor->getIntrinsic()->getState()); //[cx cy fx fy]
+    Eigen::Vector4d k(_sensor->getIntrinsic()->getState()); //[cx cy fx fy]
 
     // Intrinsic matrices for opencv and eigen:
 
@@ -513,9 +513,9 @@ void ProcessorTrackerLandmarkApriltag::resetDerived()
         {
 
             FrameBasePtr ori_frame = getOrigin()->getFrame();
-            Eigen::Vector1s dist_meas; dist_meas << 0.0;
+            Eigen::Vector1d dist_meas; dist_meas << 0.0;
             double dist_std = 0.5;
-            Eigen::Matrix1s cov0(dist_std*dist_std);
+            Eigen::Matrix1d cov0(dist_std*dist_std);
 
             CaptureBasePtr capt3D = std::make_shared<CaptureBase>("Dist", getLast()->getTimeStamp());
             getLast()->getFrame()->addCapture(capt3D);
@@ -550,8 +550,8 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
     // (getOrigin() != nullptr)
 
     // Retrieve camera extrinsics
-    Eigen::Quaternions last_q_cam(getSensor()->getO()->getState().data());
-    Eigen::Isometry3ds last_M_cam = Eigen::Translation3ds(getSensor()->getP()->getState()) * last_q_cam;
+    Eigen::Quaterniond last_q_cam(getSensor()->getO()->getState().data());
+    Eigen::Isometry3d last_M_cam = Eigen::Translation3d(getSensor()->getP()->getState()) * last_q_cam;
 
     // get features list of KF linked to origin capture and last capture
     FeatureBasePtrList ori_feature_list = getOrigin()->getFeatureList();
@@ -564,7 +564,7 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
     }
     
     // Among landmarks detected in origin and last, find the one that has the smallest error ratio (best confidence)
-    Scalar lowest_ration = 1;  // rep_error1/rep_error2 cannot be higher than 1
+    double lowest_ration = 1;  // rep_error1/rep_error2 cannot be higher than 1
     FeatureApriltagPtr best_feature;
     bool useable_feature = false;
     for (auto it_last = last_feature_list.begin(); it_last != last_feature_list.end(); it_last++){
@@ -572,7 +572,7 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
         for (auto it_ori = ori_feature_list.begin(); it_ori != ori_feature_list.end(); it_ori++){
             FeatureApriltagPtr ori_feat_ptr =  std::static_pointer_cast<FeatureApriltag>(*it_ori);
             if (ori_feat_ptr->getTagId() == last_feat_ptr->getTagId()){
-                Scalar ratio = ori_feat_ptr->getRepError1() / ori_feat_ptr->getRepError2();
+                double ratio = ori_feat_ptr->getRepError1() / ori_feat_ptr->getRepError2();
                 //if (ratio < lowest_ration){
                 if (last_feat_ptr->getUserotation() && (ratio < lowest_ration)){
                     useable_feature = true;
@@ -591,12 +591,12 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
     
     // std::cout << "Best feature id after: " << best_feature->getTagId() << std::endl;
     // Retrieve cam to landmark transform
-    Eigen::Vector7s cam_pose_lmk = best_feature->getMeasurement();
-    Eigen::Quaternions cam_q_lmk(cam_pose_lmk.segment<4>(3).data());
-    Eigen::Isometry3ds cam_M_lmk = Eigen::Translation3ds(cam_pose_lmk.head(3)) * cam_q_lmk;
+    Eigen::Vector7d cam_pose_lmk = best_feature->getMeasurement();
+    Eigen::Quaterniond cam_q_lmk(cam_pose_lmk.segment<4>(3).data());
+    Eigen::Isometry3d cam_M_lmk = Eigen::Translation3d(cam_pose_lmk.head(3)) * cam_q_lmk;
     
     // Get corresponding landmarks in origin/last landmark list
-    Eigen::Isometry3ds w_M_lmk;
+    Eigen::Isometry3d w_M_lmk;
     LandmarkBasePtrList lmk_list = getProblem()->getMap()->getLandmarkList();
     // Iterate in reverse order because landmark detected in last are at the end of the list (while still landmarks to discovers)
     for (std::list<LandmarkBasePtr>::reverse_iterator it_lmk = lmk_list.rbegin(); it_lmk != lmk_list.rend(); ++it_lmk){
@@ -607,18 +607,18 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
         }
     
         if (lmk_ptr->getTagId() == best_feature->getTagId()){
-            Eigen::Vector3s w_t_lmk = lmk_ptr->getP()->getState();
-            Eigen::Quaternions w_q_lmk(lmk_ptr->getO()->getState().data());
-            w_M_lmk = Eigen::Translation<Scalar,3>(w_t_lmk) * w_q_lmk;
+            Eigen::Vector3d w_t_lmk = lmk_ptr->getP()->getState();
+            Eigen::Quaterniond w_q_lmk(lmk_ptr->getO()->getState().data());
+            w_M_lmk = Eigen::Translation<double,3>(w_t_lmk) * w_q_lmk;
         }
     }
 
     // Compute last frame estimate
-    Eigen::Isometry3ds w_M_last = w_M_lmk * (last_M_cam * cam_M_lmk).inverse();
+    Eigen::Isometry3d w_M_last = w_M_lmk * (last_M_cam * cam_M_lmk).inverse();
 
     // Use the w_M_last to overide last key frame state estimation and keyframe estimation
-    Eigen::Vector3s pos_last  = w_M_last.translation();
-    Eigen::Quaternions quat_last(w_M_last.linear());
+    Eigen::Vector3d pos_last  = w_M_last.translation();
+    Eigen::Quaterniond quat_last(w_M_last.linear());
     getLast()->getFrame()->getP()->setState(pos_last);
     getLast()->getFrame()->getO()->setState(quat_last.coeffs());
 
@@ -631,10 +631,10 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
     for (auto it_feat = new_features_last_.begin(); it_feat != new_features_last_.end(); it_feat++){
         FeatureApriltagPtr new_feature_last = std::static_pointer_cast<FeatureApriltag>(*it_feat);
        
-        Eigen::Vector7s cam_pose_lmk = new_feature_last->getMeasurement();
-        Eigen::Quaternions cam_q_lmk(cam_pose_lmk.segment<4>(3).data());
-        Eigen::Isometry3ds cam_M_lmk_new = Eigen::Translation3ds(cam_pose_lmk.head(3)) * cam_q_lmk;
-        Eigen::Isometry3ds w_M_lmk =  w_M_last * last_M_cam * cam_M_lmk_new;
+        Eigen::Vector7d cam_pose_lmk = new_feature_last->getMeasurement();
+        Eigen::Quaterniond cam_q_lmk(cam_pose_lmk.segment<4>(3).data());
+        Eigen::Isometry3d cam_M_lmk_new = Eigen::Translation3d(cam_pose_lmk.head(3)) * cam_q_lmk;
+        Eigen::Isometry3d w_M_lmk =  w_M_last * last_M_cam * cam_M_lmk_new;
 
         for (auto it_lmk = new_landmarks_.begin(); it_lmk != new_landmarks_.end(); ++it_lmk){
             LandmarkApriltagPtr lmk_ptr = std::dynamic_pointer_cast<LandmarkApriltag>(*it_lmk);
@@ -642,8 +642,8 @@ void ProcessorTrackerLandmarkApriltag::reestimateLastFrame(){
                 continue;
             }
             if (lmk_ptr->getTagId() == new_feature_last->getTagId()){
-                Eigen::Vector3s pos_lmk_last  = w_M_lmk.translation();
-                Eigen::Quaternions quat_lmk_last(w_M_lmk.linear());
+                Eigen::Vector3d pos_lmk_last  = w_M_lmk.translation();
+                Eigen::Quaterniond quat_lmk_last(w_M_lmk.linear());
                 lmk_ptr->getP()->setState(pos_lmk_last);
                 lmk_ptr->getO()->setState(quat_lmk_last.coeffs());
                 break;
diff --git a/src/sensor/sensor_IMU.cpp b/src/sensor/sensor_IMU.cpp
index 33cd3e16ec62bfec0d656f376227405ab43f735c..4418283ea29e2d0be1f1d99083e2e712a7a1f845 100644
--- a/src/sensor/sensor_IMU.cpp
+++ b/src/sensor/sensor_IMU.cpp
@@ -4,14 +4,14 @@
 
 namespace wolf {
 
-SensorIMU::SensorIMU(const Eigen::VectorXs& _extrinsics, IntrinsicsIMUPtr _params) :
+SensorIMU::SensorIMU(const Eigen::VectorXd& _extrinsics, IntrinsicsIMUPtr _params) :
         SensorIMU(_extrinsics, *_params)
 {
     //
 }
 
-SensorIMU::SensorIMU(const Eigen::VectorXs& _extrinsics, const IntrinsicsIMU& _params) :
-        SensorBase("IMU", std::make_shared<StateBlock>(_extrinsics.head(3), true), std::make_shared<StateQuaternion>(_extrinsics.tail(4), true), std::make_shared<StateBlock>(6, false, nullptr), (Eigen::Vector6s()<<_params.a_noise,_params.a_noise,_params.a_noise,_params.w_noise,_params.w_noise,_params.w_noise).finished(), false, true),
+SensorIMU::SensorIMU(const Eigen::VectorXd& _extrinsics, const IntrinsicsIMU& _params) :
+        SensorBase("IMU", std::make_shared<StateBlock>(_extrinsics.head(3), true), std::make_shared<StateQuaternion>(_extrinsics.tail(4), true), std::make_shared<StateBlock>(6, false, nullptr), (Eigen::Vector6d()<<_params.a_noise,_params.a_noise,_params.a_noise,_params.w_noise,_params.w_noise,_params.w_noise).finished(), false, true),
         a_noise(_params.a_noise),
         w_noise(_params.w_noise),
         ab_initial_stdev(_params.ab_initial_stdev),
@@ -28,7 +28,7 @@ SensorIMU::~SensorIMU()
 }
 
 // Define the factory method
-SensorBasePtr SensorIMU::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_pq,
+SensorBasePtr SensorIMU::create(const std::string& _unique_name, const Eigen::VectorXd& _extrinsics_pq,
                               const IntrinsicsBasePtr _intrinsics)
 {
     // decode extrinsics vector
diff --git a/src/solver_suitesparse/solver_manager.cpp b/src/solver_suitesparse/solver_manager.cpp
index 05d89142a35cc740c69c29712565d132d69fbe93..805307fcd4ba78aee0b7d73ceba8a700c67a59cf 100644
--- a/src/solver_suitesparse/solver_manager.cpp
+++ b/src/solver_suitesparse/solver_manager.cpp
@@ -61,7 +61,7 @@ void SolverManager::update(const WolfProblemPtr _problem_ptr)
 
 void SolverManager::addFactor(FactorBasePtr _corr_ptr)
 {
-	//TODO MatrixXs J; Vector e;
+	//TODO MatrixXd J; Vector e;
     // getResidualsAndJacobian(_corr_ptr, J, e);
     // solverQR->addFactor(_corr_ptr, J, e);
 
diff --git a/src/yaml/processor_IMU_yaml.cpp b/src/yaml/processor_IMU_yaml.cpp
index a0ed780179c2e4d6bfc1f194be857dcbc9bc3b3e..c077e9e0f1a13cdf2a4a3dee513e5f476e8848cc 100644
--- a/src/yaml/processor_IMU_yaml.cpp
+++ b/src/yaml/processor_IMU_yaml.cpp
@@ -29,13 +29,13 @@ static ProcessorParamsBasePtr createProcessorIMUParams(const std::string & _file
         YAML::Node kf_vote = config["keyframe_vote"];
 
         ProcessorParamsIMUPtr params = std::make_shared<ProcessorParamsIMU>();
-        params->time_tolerance = config["time_tolerance"]           .as<Scalar>();
-        params->unmeasured_perturbation_std = config["unmeasured_perturbation_std"].as<Scalar>();
+        params->time_tolerance = config["time_tolerance"]           .as<double>();
+        params->unmeasured_perturbation_std = config["unmeasured_perturbation_std"].as<double>();
 
-        params->max_time_span       = kf_vote["max_time_span"]      .as<Scalar>();
+        params->max_time_span       = kf_vote["max_time_span"]      .as<double>();
         params->max_buff_length     = kf_vote["max_buff_length"]    .as<SizeEigen>();
-        params->dist_traveled       = kf_vote["dist_traveled"]      .as<Scalar>();
-        params->angle_turned        = kf_vote["angle_turned"]       .as<Scalar>();
+        params->dist_traveled       = kf_vote["dist_traveled"]      .as<double>();
+        params->angle_turned        = kf_vote["angle_turned"]       .as<double>();
         params->voting_active       = kf_vote["voting_active"]      .as<bool>();
         params->voting_aux_active   = kf_vote["voting_aux_active"]  .as<bool>();
         return params;
diff --git a/src/yaml/sensor_IMU_yaml.cpp b/src/yaml/sensor_IMU_yaml.cpp
index 0d6d4c5d49ffa98f7db71aac0a174826a07264c1..af5314497dc7e5ce3b22f066b61cf44411d386d0 100644
--- a/src/yaml/sensor_IMU_yaml.cpp
+++ b/src/yaml/sensor_IMU_yaml.cpp
@@ -32,12 +32,12 @@ static IntrinsicsBasePtr createIntrinsicsIMU(const std::string & _filename_dot_y
 
         IntrinsicsIMUPtr params = std::make_shared<IntrinsicsIMU>();
 
-        params->a_noise             = variances["a_noise"]          .as<Scalar>();
-        params->w_noise             = variances["w_noise"]          .as<Scalar>();
-        params->ab_initial_stdev    = variances["ab_initial_stdev"] .as<Scalar>();
-        params->wb_initial_stdev    = variances["wb_initial_stdev"] .as<Scalar>();
-        params->ab_rate_stdev       = variances["ab_rate_stdev"]    .as<Scalar>();
-        params->wb_rate_stdev       = variances["wb_rate_stdev"]    .as<Scalar>();
+        params->a_noise             = variances["a_noise"]          .as<double>();
+        params->w_noise             = variances["w_noise"]          .as<double>();
+        params->ab_initial_stdev    = variances["ab_initial_stdev"] .as<double>();
+        params->wb_initial_stdev    = variances["wb_initial_stdev"] .as<double>();
+        params->ab_rate_stdev       = variances["ab_rate_stdev"]    .as<double>();
+        params->wb_rate_stdev       = variances["wb_rate_stdev"]    .as<double>();
 
         return params;
     }
diff --git a/test/gtest_IMU.cpp b/test/gtest_IMU.cpp
index 2e06cb01420ae2c8d3aed65d9c7ea47bf1808e1b..8f94c7a247931523f7dd264efbeb64e09148e097 100644
--- a/test/gtest_IMU.cpp
+++ b/test/gtest_IMU.cpp
@@ -42,44 +42,44 @@ class Process_Factor_IMU : public testing::Test
 
         // time
         TimeStamp           t0, t;
-        Scalar              dt, DT;
+        double              dt, DT;
         int                 num_integrations;
 
         // initial state
-        VectorXs            x0;                                 // initial state
-        Vector3s            p0, v0;                             // initial pos and vel
-        Quaternions         q0, q;                              // initial and current orientations
-        Matrix<Scalar,9,9>  P0;                                 // initial state covariance
+        VectorXd            x0;                                 // initial state
+        Vector3d            p0, v0;                             // initial pos and vel
+        Quaterniond         q0, q;                              // initial and current orientations
+        Matrix<double,9,9>  P0;                                 // initial state covariance
 
         // bias
-        Vector6s            bias_real, bias_preint, bias_null;  // real, pre-int and zero biases.
-        Vector6s            bias_0, bias_1;                     // optimized bias at KF's 0 and 1
+        Vector6d            bias_real, bias_preint, bias_null;  // real, pre-int and zero biases.
+        Vector6d            bias_0, bias_1;                     // optimized bias at KF's 0 and 1
 
         // input
-        Matrix<Scalar, 6, Dynamic> motion;                      // Motion in IMU frame. Each column is a motion step. If just one column, then the number of steps is defined in num_integrations
-        Matrix<Scalar, 3, Dynamic> a, w;                        // True acc and angvel in IMU frame. Each column is a motion step. Used to create motion with `motion << a,w;`
-        Vector6s            data;                               // IMU data. It's the motion with gravity and bias. See imu::motion2data().
+        Matrix<double, 6, Dynamic> motion;                      // Motion in IMU frame. Each column is a motion step. If just one column, then the number of steps is defined in num_integrations
+        Matrix<double, 3, Dynamic> a, w;                        // True acc and angvel in IMU frame. Each column is a motion step. Used to create motion with `motion << a,w;`
+        Vector6d            data;                               // IMU data. It's the motion with gravity and bias. See imu::motion2data().
 
         // Deltas and states (exact, integrated, corrected, solved, etc)
-        VectorXs        D_exact,         x1_exact;          // exact or ground truth
-        VectorXs        D_preint_imu,    x1_preint_imu;     // preintegrated with imu_tools
-        VectorXs        D_corrected_imu, x1_corrected_imu;  // corrected with imu_tools
-        VectorXs        D_preint,        x1_preint;         // preintegrated with processor_imu
-        VectorXs        D_corrected,     x1_corrected;      // corrected with processor_imu
-        VectorXs        D_optim,         x1_optim;          // optimized using factor_imu
-        VectorXs        D_optim_imu,     x1_optim_imu;      // corrected with imu_tools using optimized bias
-        VectorXs                         x0_optim;          // optimized using factor_imu
+        VectorXd        D_exact,         x1_exact;          // exact or ground truth
+        VectorXd        D_preint_imu,    x1_preint_imu;     // preintegrated with imu_tools
+        VectorXd        D_corrected_imu, x1_corrected_imu;  // corrected with imu_tools
+        VectorXd        D_preint,        x1_preint;         // preintegrated with processor_imu
+        VectorXd        D_corrected,     x1_corrected;      // corrected with processor_imu
+        VectorXd        D_optim,         x1_optim;          // optimized using factor_imu
+        VectorXd        D_optim_imu,     x1_optim_imu;      // corrected with imu_tools using optimized bias
+        VectorXd                         x0_optim;          // optimized using factor_imu
 
         // Trajectory buffer of correction Jacobians
-        std::vector<MatrixXs> Buf_Jac_preint_prc;
+        std::vector<MatrixXd> Buf_Jac_preint_prc;
 
         // Trajectory matrices
-        MatrixXs Trj_D_exact, Trj_D_preint_imu, Trj_D_preint_prc, Trj_D_corrected_imu, Trj_D_corrected_prc;
-        MatrixXs Trj_x_exact, Trj_x_preint_imu, Trj_x_preint_prc, Trj_x_corrected_imu, Trj_x_corrected_prc;
+        MatrixXd Trj_D_exact, Trj_D_preint_imu, Trj_D_preint_prc, Trj_D_corrected_imu, Trj_D_corrected_prc;
+        MatrixXd Trj_x_exact, Trj_x_preint_imu, Trj_x_preint_prc, Trj_x_corrected_imu, Trj_x_corrected_prc;
 
         // Delta correction Jacobian and step
-        Matrix<Scalar,9,6>  J_D_bias;                           // Jacobian of pre-integrated delta w
-        Vector9s            step;
+        Matrix<double,9,6>  J_D_bias;                           // Jacobian of pre-integrated delta w
+        Vector9d            step;
 
         // Flags for fixing/unfixing state blocks
         bool                p0_fixed, q0_fixed, v0_fixed;
@@ -97,7 +97,7 @@ class Process_Factor_IMU : public testing::Test
             ceres_manager = make_shared<CeresManager>(problem, ceres_options);
 
             // SENSOR + PROCESSOR IMU
-            SensorBasePtr       sensor = problem->installSensor   ("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+            SensorBasePtr       sensor = problem->installSensor   ("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
             ProcessorBasePtr processor = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
             sensor_imu    = static_pointer_cast<SensorIMU>   (sensor);
             processor_imu = static_pointer_cast<ProcessorIMU>(processor);
@@ -126,16 +126,16 @@ class Process_Factor_IMU : public testing::Test
          *   Delta: the preintegrated delta
          *   J_D_b_ptr: a pointer to the Jacobian of Delta wrt bias. Defaults to nullptr.
          */
-        static void integrateOneStep(const VectorXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, Quaternions& q_real, VectorXs& Delta, Matrix<Scalar, 9, 6>* J_D_b_ptr = nullptr)
+        static void integrateOneStep(const VectorXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt, Quaterniond& q_real, VectorXd& Delta, Matrix<double, 9, 6>* J_D_b_ptr = nullptr)
         {
-            VectorXs delta(10), data(6);
-            VectorXs Delta_plus(10);
-            Matrix<Scalar, 9, 6> J_d_d, J_D_b, J_d_b;
-            Matrix<Scalar, 9, 9> J_D_D, J_D_d;
+            VectorXd delta(10), data(6);
+            VectorXd Delta_plus(10);
+            Matrix<double, 9, 6> J_d_d, J_D_b, J_d_b;
+            Matrix<double, 9, 9> J_D_D, J_D_d;
 
             data                = imu::motion2data(motion, q_real, bias_real);
             q_real              = q_real*exp_q(motion.tail(3)*dt);
-            Vector6s body       = data - bias_preint;
+            Vector6d body       = data - bias_preint;
             if (J_D_b_ptr == nullptr)
             {
                 delta           = imu::body2delta(body, dt);
@@ -163,11 +163,11 @@ class Process_Factor_IMU : public testing::Test
          * Output:
          *   return: the preintegrated delta
          */
-        static VectorXs integrateDelta(int N, const Quaternions& q0, const VectorXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt)
+        static VectorXd integrateDelta(int N, const Quaterniond& q0, const VectorXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt)
         {
-            VectorXs    Delta(10);
+            VectorXd    Delta(10);
             Delta       = imu::identity();
-            Quaternions q(q0);
+            Quaterniond q(q0);
             for (int n = 0; n < N; n++)
             {
                 integrateOneStep(motion, bias_real, bias_preint, dt, q, Delta);
@@ -186,10 +186,10 @@ class Process_Factor_IMU : public testing::Test
          *   J_D_b: the Jacobian of the preintegrated delta wrt the bias
          *   return: the preintegrated delta
          */
-        static VectorXs integrateDelta(int N, const Quaternions& q0, const VectorXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, Matrix<Scalar, 9, 6>& J_D_b)
+        static VectorXd integrateDelta(int N, const Quaterniond& q0, const VectorXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt, Matrix<double, 9, 6>& J_D_b)
         {
-            VectorXs    Delta(10);
-            Quaternions q;
+            VectorXd    Delta(10);
+            Quaterniond q;
 
             Delta   = imu::identity();
             J_D_b   .setZero();
@@ -211,10 +211,10 @@ class Process_Factor_IMU : public testing::Test
          *   J_D_b: the Jacobian of the preintegrated delta wrt the bias
          *   return: the preintegrated delta
          */
-        static VectorXs integrateDelta(const Quaternions& q0, const MatrixXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, Matrix<Scalar, 9, 6>& J_D_b)
+        static VectorXd integrateDelta(const Quaterniond& q0, const MatrixXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt, Matrix<double, 9, 6>& J_D_b)
         {
-            VectorXs    Delta(10);
-            Quaternions q;
+            VectorXd    Delta(10);
+            Quaterniond q;
 
             Delta   = imu::identity();
             J_D_b   .setZero();
@@ -236,18 +236,18 @@ class Process_Factor_IMU : public testing::Test
          *   J_D_b: the Jacobian of the preintegrated delta wrt the bias
          *   return: the preintegrated delta
          */
-        static MotionBuffer integrateDeltaTrajectory(const Quaternions& q0, const MatrixXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, Matrix<Scalar, 9, 6>& J_D_b)
+        static MotionBuffer integrateDeltaTrajectory(const Quaterniond& q0, const MatrixXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt, Matrix<double, 9, 6>& J_D_b)
         {
             MotionBuffer trajectory;
-            VectorXs    Delta(10);
-            MatrixXs    M9(9,9), M6(6,6), J9(9,9), J96(9,6), V10(10,1), V6(6,1);
-            Quaternions q;
+            VectorXd    Delta(10);
+            MatrixXd    M9(9,9), M6(6,6), J9(9,9), J96(9,6), V10(10,1), V6(6,1);
+            Quaterniond q;
 
             Delta   = imu::identity();
             J_D_b   .setZero();
             q       = q0;
             TimeStamp t(0);
-            trajectory.get().emplace_back(t, Vector6s::Zero(), M6, VectorXs::Zero(10), M9, imu::identity(), M9, J9, J9, MatrixXs::Zero(9,6));
+            trajectory.get().emplace_back(t, Vector6d::Zero(), M6, VectorXd::Zero(10), M9, imu::identity(), M9, J9, J9, MatrixXd::Zero(9,6));
             for (int n = 0; n < motion.cols(); n++)
             {
                 t += dt;
@@ -257,9 +257,9 @@ class Process_Factor_IMU : public testing::Test
             return trajectory;
         }
 
-        MotionBuffer integrateWithProcessor(int N, const TimeStamp& t0, const Quaternions q0, const MatrixXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, VectorXs& D_preint, VectorXs& D_corrected)
+        MotionBuffer integrateWithProcessor(int N, const TimeStamp& t0, const Quaterniond q0, const MatrixXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt, VectorXd& D_preint, VectorXd& D_corrected)
         {
-            Vector6s      motion_now;
+            Vector6d      motion_now;
             data        = imu::motion2data(motion.col(0), q0, bias_real);
             capture_imu = make_shared<CaptureIMU>(t0, sensor_imu, data, sensor_imu->getNoiseCov());
             q           = q0;
@@ -367,7 +367,7 @@ class Process_Factor_IMU : public testing::Test
 
             // Build exact trajectories
             int col = 0;
-            Scalar Dt = 0;
+            double Dt = 0;
             for (auto m : Buf_exact.get())
             {
                 Trj_D_exact.col(col) = m.delta_integr_;
@@ -394,7 +394,7 @@ class Process_Factor_IMU : public testing::Test
                 Trj_x_preint_imu.col(col) = imu::composeOverState(x0, Trj_D_preint_imu.col(col).eval(), Dt );
 
                 // corrected
-                VectorXs step                = m.jacobian_calib_ * (bias_real - bias_preint);
+                VectorXd step                = m.jacobian_calib_ * (bias_real - bias_preint);
                 Trj_D_corrected_imu.col(col) = imu::plus(m.delta_integr_, step) ;
                 Trj_x_corrected_imu.col(col) = imu::composeOverState(x0, Trj_D_corrected_imu.col(col).eval(), Dt );
                 Dt += dt;
@@ -426,7 +426,7 @@ class Process_Factor_IMU : public testing::Test
                 Trj_x_preint_prc.col(col) = imu::composeOverState(x0, Trj_D_preint_prc.col(col).eval(), Dt );
 
                 // corrected
-                VectorXs step                = m.jacobian_calib_ * (bias_real - bias_preint);
+                VectorXd step                = m.jacobian_calib_ * (bias_real - bias_preint);
                 Trj_D_corrected_prc.col(col) = imu::plus(m.delta_integr_, step) ;
                 Trj_x_corrected_prc.col(col) = imu::composeOverState(x0, Trj_D_corrected_prc.col(col).eval(), Dt );
 
@@ -457,26 +457,26 @@ class Process_Factor_IMU : public testing::Test
             // This perturbs states to estimate around the exact value, then assigns to the keyframe
             // Perturbations are applied only if the state block is unfixed
 
-            VectorXs x_pert(10);
+            VectorXd x_pert(10);
 
             // KF 0
             x_pert = x0;
             if (!p0_fixed)
-                x_pert.head(3)      += Vector3s::Random() * 0.01;
+                x_pert.head(3)      += Vector3d::Random() * 0.01;
             if (!q0_fixed)
-                x_pert.segment(3,4) = (Quaternions(x_pert.data() + 3) * exp_q(Vector3s::Random() * 0.01)).coeffs().normalized();
+                x_pert.segment(3,4) = (Quaterniond(x_pert.data() + 3) * exp_q(Vector3d::Random() * 0.01)).coeffs().normalized();
             if (!v0_fixed)
-                x_pert.tail(3)      += Vector3s::Random() * 0.01;
+                x_pert.tail(3)      += Vector3d::Random() * 0.01;
             KF_0->setState(x_pert);
 
             // KF 1
             x_pert = x1_exact;
             if (!p1_fixed)
-                x_pert.head(3)      += Vector3s::Random() * 0.01;
+                x_pert.head(3)      += Vector3d::Random() * 0.01;
             if (!q1_fixed)
-                x_pert.segment(3,4) = (Quaternions(x_pert.data() + 3) * exp_q(Vector3s::Random() * 0.01)).coeffs().normalized();
+                x_pert.segment(3,4) = (Quaterniond(x_pert.data() + 3) * exp_q(Vector3d::Random() * 0.01)).coeffs().normalized();
             if (!v1_fixed)
-                x_pert.tail(3)      += Vector3s::Random() * 0.01;
+                x_pert.tail(3)      += Vector3d::Random() * 0.01;
             KF_1->setState(x_pert);
         }
 
@@ -489,7 +489,7 @@ class Process_Factor_IMU : public testing::Test
             problem->keyFrameCallback(KF, nullptr, dt/2);
 
             // Process IMU for the callback to take effect
-            data = Vector6s::Zero();
+            data = Vector6d::Zero();
             capture_imu = make_shared<CaptureIMU>(t+dt, sensor_imu, data, sensor_imu->getNoiseCov());
             sensor_imu->process(capture_imu);
 
@@ -603,7 +603,7 @@ class Process_Factor_IMU_ODO : public Process_Factor_IMU
             // ===================================== ODO
             string wolf_root = _WOLF_IMU_ROOT_DIR;
 
-            SensorBasePtr    sensor     = problem->installSensor   ("ODOM 3D", "Odometer", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml"   );
+            SensorBasePtr    sensor     = problem->installSensor   ("ODOM 3D", "Odometer", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml"   );
             ProcessorBasePtr processor  = problem->installProcessor("ODOM 3D", "Odometer", "Odometer"                            , wolf_root + "/demos/processor_odom_3D.yaml");
 
             sensor_odo      = static_pointer_cast<SensorOdom3D>(sensor);
@@ -619,11 +619,11 @@ class Process_Factor_IMU_ODO : public Process_Factor_IMU
             Process_Factor_IMU::integrateAll();
 
             // ===================================== ODO
-            Vector6s    data;
-            Vector3s    p1  = x1_exact.head(3);
-            Quaternions q1   (x1_exact.data() + 3);
-            Vector3s    dp  =        q0.conjugate() * (p1 - p0);
-            Vector3s    dth = log_q( q0.conjugate() *  q1     );
+            Vector6d    data;
+            Vector3d    p1  = x1_exact.head(3);
+            Quaterniond q1   (x1_exact.data() + 3);
+            Vector3d    dp  =        q0.conjugate() * (p1 - p0);
+            Vector3d    dth = log_q( q0.conjugate() *  q1     );
             data           << dp, dth;
 
             CaptureOdom3DPtr capture_odo = make_shared<CaptureOdom3D>(t, sensor_odo, data, sensor_odo->getNoiseCov());
@@ -637,11 +637,11 @@ class Process_Factor_IMU_ODO : public Process_Factor_IMU
             Process_Factor_IMU::integrateAllTrajectories();
 
             // ===================================== ODO
-            Vector6s    data;
-            Vector3s    p1  = x1_exact.head(3);
-            Quaternions q1   (x1_exact.data() + 3);
-            Vector3s    dp  =        q0.conjugate() * (p1 - p0);
-            Vector3s    dth = log_q( q0.conjugate() *  q1     );
+            Vector6d    data;
+            Vector3d    p1  = x1_exact.head(3);
+            Quaterniond q1   (x1_exact.data() + 3);
+            Vector3d    dp  =        q0.conjugate() * (p1 - p0);
+            Vector3d    dth = log_q( q0.conjugate() *  q1     );
             data           << dp, dth;
 
             CaptureOdom3DPtr capture_odo = make_shared<CaptureOdom3D>(t, sensor_odo, data, sensor_odo->getNoiseCov());
@@ -656,7 +656,7 @@ class Process_Factor_IMU_ODO : public Process_Factor_IMU
 
             // ===================================== ODO
             // Process ODO for the callback to take effect
-            data = Vector6s::Zero();
+            data = Vector6d::Zero();
             capture_odo = make_shared<CaptureOdom3D>(t+dt, sensor_odo, data, sensor_odo->getNoiseCov());
             sensor_odo->process(capture_odo);
 
@@ -685,8 +685,8 @@ TEST_F(Process_Factor_IMU, MotionConstant_PQV_b__PQV_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -729,8 +729,8 @@ TEST_F(Process_Factor_IMU, test_capture) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -744,7 +744,7 @@ TEST_F(Process_Factor_IMU, test_capture) // F_ixed___e_stimated
     // ================================================================================================================ //
 
     // ===================================== RUN ALL
-    Eigen::Vector6s initial_bias((Eigen::Vector6s()<< .002, .0007, -.001,   .003, -.002, .001).finished());
+    Eigen::Vector6d initial_bias((Eigen::Vector6d()<< .002, .0007, -.001,   .003, -.002, .001).finished());
     sensor_imu->getIntrinsic()->setState(initial_bias);
     configureAll();
     integrateAll();
@@ -775,8 +775,8 @@ TEST_F(Process_Factor_IMU, MotionConstant_pqv_b__PQV_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = false;
@@ -819,8 +819,8 @@ TEST_F(Process_Factor_IMU, MotionConstant_pqV_b__PQv_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = false;
@@ -863,8 +863,8 @@ TEST_F(Process_Factor_IMU, MotionRandom_PQV_b__PQV_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Matrix<Scalar, 3, 50>::Random();
-    w                  = Matrix<Scalar, 3, 50>::Random();
+    a                  = Matrix<double, 3, 50>::Random();
+    w                  = Matrix<double, 3, 50>::Random();
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -907,8 +907,8 @@ TEST_F(Process_Factor_IMU, MotionRandom_pqV_b__PQv_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Matrix<Scalar, 3, 50>::Random();
-    w                  = Matrix<Scalar, 3, 50>::Random();
+    a                  = Matrix<double, 3, 50>::Random();
+    w                  = Matrix<double, 3, 50>::Random();
 
     // ---------- fix boundaries
     p0_fixed       = false;
@@ -951,8 +951,8 @@ TEST_F(Process_Factor_IMU, MotionRandom_pqV_b__pQV_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Matrix<Scalar, 3, 50>::Random();
-    w                  = Matrix<Scalar, 3, 50>::Random();
+    a                  = Matrix<double, 3, 50>::Random();
+    w                  = Matrix<double, 3, 50>::Random();
 
     // ---------- fix boundaries
     p0_fixed       = false;
@@ -995,8 +995,8 @@ TEST_F(Process_Factor_IMU, MotionConstant_NonNullState_PQV_b__PQV_b) // F_ixed__
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1039,8 +1039,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstantRotation_PQV_b__PQV_b) // F_ixed___
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 0,0,0 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 0,0,0 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1083,8 +1083,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstantRotation_PQV_b__PQv_b) // F_ixed___
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 0,0,0 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 0,0,0 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1127,8 +1127,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstantRotation_PQV_b__Pqv_b) // F_ixed___
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 0,0,0 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 0,0,0 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1171,8 +1171,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstantRotation_PQV_b__pQv_b) // F_ixed___
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 0,0,0 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 0,0,0 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1215,8 +1215,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstantRotation_PQV_b__pqv_b) // F_ixed___
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 0,0,0 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 0,0,0 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1259,8 +1259,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstant_pqv_b__pqV_b) // F_ixed___e_stimat
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = false;
@@ -1303,8 +1303,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionConstant_pqV_b__pqv_b) // F_ixed___e_stimat
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Vector3s( 1,2,3 );
-    w                  = Vector3s( 1,2,3 );
+    a                  = Vector3d( 1,2,3 );
+    w                  = Vector3d( 1,2,3 );
 
     // ---------- fix boundaries
     p0_fixed       = false;
@@ -1347,8 +1347,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionRandom_PQV_b__pqv_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Matrix<Scalar, 3, 50>::Random();
-    w                  = Matrix<Scalar, 3, 50>::Random();
+    a                  = Matrix<double, 3, 50>::Random();
+    w                  = Matrix<double, 3, 50>::Random();
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1391,8 +1391,8 @@ TEST_F(Process_Factor_IMU_ODO, MotionRandom_PqV_b__pqV_b) // F_ixed___e_stimated
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a                  = Matrix<Scalar, 3, 50>::Random();
-    w                  = Matrix<Scalar, 3, 50>::Random();
+    a                  = Matrix<double, 3, 50>::Random();
+    w                  = Matrix<double, 3, 50>::Random();
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1435,8 +1435,8 @@ TEST_F(Process_Factor_IMU_ODO, RecoverTrajectory_MotionRandom_PqV_b__pqV_b) // F
     bias_preint         = -bias_real;
 
     // ---------- motion params
-    a  = Matrix<Scalar, 3, 25>::Ones() + 0.1 * Matrix<Scalar, 3, 25>::Random();
-    w  = Matrix<Scalar, 3, 25>::Ones() + 0.1 * Matrix<Scalar, 3, 25>::Random();
+    a  = Matrix<double, 3, 25>::Ones() + 0.1 * Matrix<double, 3, 25>::Random();
+    w  = Matrix<double, 3, 25>::Ones() + 0.1 * Matrix<double, 3, 25>::Random();
 
     // ---------- fix boundaries
     p0_fixed       = true;
@@ -1458,13 +1458,13 @@ TEST_F(Process_Factor_IMU_ODO, RecoverTrajectory_MotionRandom_PqV_b__pqV_b) // F
     assertAll();
 
     // Build optimal trajectory
-    MatrixXs Trj_x_optim(10,Trj_D_preint_prc.cols());
-    Scalar Dt = 0;
+    MatrixXd Trj_x_optim(10,Trj_D_preint_prc.cols());
+    double Dt = 0;
     SizeEigen i = 0;
     for (auto J_D_b : Buf_Jac_preint_prc)
     {
-        VectorXs step       = J_D_b * (bias_0 - bias_preint);
-        VectorXs D_opt      = imu::plus(Trj_D_preint_prc.col(i).eval(), step);
+        VectorXd step       = J_D_b * (bias_0 - bias_preint);
+        VectorXd D_opt      = imu::plus(Trj_D_preint_prc.col(i).eval(), step);
         Trj_x_optim.col(i)  = imu::composeOverState(x0_optim, D_opt, Dt);
         Dt += dt;
         i  ++;
@@ -1473,7 +1473,7 @@ TEST_F(Process_Factor_IMU_ODO, RecoverTrajectory_MotionRandom_PqV_b__pqV_b) // F
     // Get optimal trajectory via getState()
     i = 0;
     t = 0;
-    MatrixXs Trj_x_optim_prc(10,Trj_D_preint_prc.cols());
+    MatrixXd Trj_x_optim_prc(10,Trj_D_preint_prc.cols());
     for (int i = 0; i < Trj_x_optim_prc.cols(); i++)
     {
         Trj_x_optim_prc.col(i) = problem->getState(t);
diff --git a/test/gtest_IMU_tools.cpp b/test/gtest_IMU_tools.cpp
index c1b438d68d3471f5439730ab50c015cd0260f8fa..16730096e0e31900010b18a13ca11c1ffa21a20a 100644
--- a/test/gtest_IMU_tools.cpp
+++ b/test/gtest_IMU_tools.cpp
@@ -14,37 +14,37 @@ using namespace imu;
 
 TEST(IMU_tools, identity)
 {
-    VectorXs id_true;
+    VectorXd id_true;
     id_true.setZero(10);
     id_true(6) = 1.0;
 
-    VectorXs id = identity<Scalar>();
+    VectorXd id = identity<double>();
     ASSERT_MATRIX_APPROX(id, id_true, 1e-10);
 }
 
 TEST(IMU_tools, identity_split)
 {
-    VectorXs p(3), qv(4), v(3);
-    Quaternions q;
+    VectorXd p(3), qv(4), v(3);
+    Quaterniond q;
 
     identity(p,q,v);
-    ASSERT_MATRIX_APPROX(p, Vector3s::Zero(), 1e-10);
-    ASSERT_QUATERNION_APPROX(q, Quaternions::Identity(), 1e-10);
-    ASSERT_MATRIX_APPROX(v, Vector3s::Zero(), 1e-10);
+    ASSERT_MATRIX_APPROX(p, Vector3d::Zero(), 1e-10);
+    ASSERT_QUATERNION_APPROX(q, Quaterniond::Identity(), 1e-10);
+    ASSERT_MATRIX_APPROX(v, Vector3d::Zero(), 1e-10);
 
     identity(p,qv,v);
-    ASSERT_MATRIX_APPROX(p , Vector3s::Zero(), 1e-10);
-    ASSERT_MATRIX_APPROX(qv, (Vector4s()<<0,0,0,1).finished(), 1e-10);
-    ASSERT_MATRIX_APPROX(v , Vector3s::Zero(), 1e-10);
+    ASSERT_MATRIX_APPROX(p , Vector3d::Zero(), 1e-10);
+    ASSERT_MATRIX_APPROX(qv, (Vector4d()<<0,0,0,1).finished(), 1e-10);
+    ASSERT_MATRIX_APPROX(v , Vector3d::Zero(), 1e-10);
 }
 
 TEST(IMU_tools, inverse)
 {
-    VectorXs d(10), id(10), iid(10), iiid(10), I(10);
-    Vector4s qv;
-    Scalar dt = 0.1;
+    VectorXd d(10), id(10), iid(10), iiid(10), I(10);
+    Vector4d qv;
+    double dt = 0.1;
 
-    qv = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    qv = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     d << 0, 1, 2, qv, 7, 8, 9;
 
     id   = inverse(d, dt);
@@ -62,15 +62,15 @@ TEST(IMU_tools, inverse)
 
 TEST(IMU_tools, compose_between)
 {
-    VectorXs dx1(10), dx2(10), dx3(10);
-    Matrix<Scalar, 10, 1> d1, d2, d3;
-    Vector4s qv;
-    Scalar dt = 0.1;
+    VectorXd dx1(10), dx2(10), dx3(10);
+    Matrix<double, 10, 1> d1, d2, d3;
+    Vector4d qv;
+    double dt = 0.1;
 
-    qv = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    qv = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     dx1 << 0, 1, 2, qv, 7, 8, 9;
     d1 = dx1;
-    qv = (Vector4s() << 6, 5, 4, 3).finished().normalized();
+    qv = (Vector4d() << 6, 5, 4, 3).finished().normalized();
     dx2 << 9, 8, 7, qv, 2, 1, 0;
     d2 = dx2;
 
@@ -84,8 +84,8 @@ TEST(IMU_tools, compose_between)
     ASSERT_MATRIX_APPROX(d3, dx3, 1e-10);
 
     // minus(d1, d3) should recover delta_2
-    VectorXs diffx(10);
-    Matrix<Scalar,10,1> diff;
+    VectorXd diffx(10);
+    Matrix<double,10,1> diff;
     between(d1, d3, dt, diff);
     ASSERT_MATRIX_APPROX(diff, d2, 1e-10);
 
@@ -96,13 +96,13 @@ TEST(IMU_tools, compose_between)
 
 TEST(IMU_tools, compose_between_with_state)
 {
-    VectorXs x(10), d(10), x2(10), x3(10), d2(10), d3(10);
-    Vector4s qv;
-    Scalar dt = 0.1;
+    VectorXd x(10), d(10), x2(10), x3(10), d2(10), d3(10);
+    Vector4d qv;
+    double dt = 0.1;
 
-    qv = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    qv = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     x << 0, 1, 2, qv, 7, 8, 9;
-    qv = (Vector4s() << 6, 5, 4, 3).finished().normalized();
+    qv = (Vector4d() << 6, 5, 4, 3).finished().normalized();
     d << 9, 8, 7, qv, 2, 1, 0;
 
     composeOverState(x, d, dt, x2);
@@ -125,59 +125,59 @@ TEST(IMU_tools, compose_between_with_state)
 
 TEST(IMU_tools, lift_retract)
 {
-    VectorXs d_min(9); d_min << 0, 1, 2, .3, .4, .5, 6, 7, 8; // use angles in the ball theta < pi
+    VectorXd d_min(9); d_min << 0, 1, 2, .3, .4, .5, 6, 7, 8; // use angles in the ball theta < pi
 
     // transform to delta
-    VectorXs delta = exp_IMU(d_min);
+    VectorXd delta = exp_IMU(d_min);
 
     // expected delta
-    Vector3s dp = d_min.head(3);
-    Quaternions dq = v2q(d_min.segment(3,3));
-    Vector3s dv = d_min.tail(3);
-    VectorXs delta_true(10); delta_true << dp, dq.coeffs(), dv;
+    Vector3d dp = d_min.head(3);
+    Quaterniond dq = v2q(d_min.segment(3,3));
+    Vector3d dv = d_min.tail(3);
+    VectorXd delta_true(10); delta_true << dp, dq.coeffs(), dv;
     ASSERT_MATRIX_APPROX(delta, delta_true, 1e-10);
 
     // transform to a new tangent -- should be the original tangent
-    VectorXs d_from_delta = log_IMU(delta);
+    VectorXd d_from_delta = log_IMU(delta);
     ASSERT_MATRIX_APPROX(d_from_delta, d_min, 1e-10);
 
     // transform to a new delta -- should be the previous delta
-    VectorXs delta_from_d = exp_IMU(d_from_delta);
+    VectorXd delta_from_d = exp_IMU(d_from_delta);
     ASSERT_MATRIX_APPROX(delta_from_d, delta, 1e-10);
 }
 
 TEST(IMU_tools, plus)
 {
-    VectorXs d1(10), d2(10), d3(10);
-    VectorXs err(9);
-    Vector4s qv = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    VectorXd d1(10), d2(10), d3(10);
+    VectorXd err(9);
+    Vector4d qv = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     d1 << 0, 1, 2, qv, 7, 8, 9;
     err << 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09;
 
     d3.head(3) = d1.head(3) + err.head(3);
-    d3.segment(3,4) = (Quaternions(qv.data()) * exp_q(err.segment(3,3))).coeffs();
+    d3.segment(3,4) = (Quaterniond(qv.data()) * exp_q(err.segment(3,3))).coeffs();
     d3.tail(3) = d1.tail(3) + err.tail(3);
 
     plus(d1, err, d2);
-    ASSERT_MATRIX_APPROX(diff(d3, d2), VectorXs::Zero(9), 1e-10);
+    ASSERT_MATRIX_APPROX(diff(d3, d2), VectorXd::Zero(9), 1e-10);
 }
 
 TEST(IMU_tools, diff)
 {
-    VectorXs d1(10), d2(10);
-    Vector4s qv = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    VectorXd d1(10), d2(10);
+    Vector4d qv = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     d1 << 0, 1, 2, qv, 7, 8, 9;
     d2 = d1;
 
-    VectorXs err(9);
+    VectorXd err(9);
     diff(d1, d2, err);
-    ASSERT_MATRIX_APPROX(err, VectorXs::Zero(9), 1e-10);
-    ASSERT_MATRIX_APPROX(diff(d1, d2), VectorXs::Zero(9), 1e-10);
+    ASSERT_MATRIX_APPROX(err, VectorXd::Zero(9), 1e-10);
+    ASSERT_MATRIX_APPROX(diff(d1, d2), VectorXd::Zero(9), 1e-10);
 
-    VectorXs d3(10);
+    VectorXd d3(10);
     d3.setRandom(); d3.segment(3,4).normalize();
     err.head(3) = d3.head(3) - d1.head(3);
-    err.segment(3,3) = log_q(Quaternions(d1.data()+3).conjugate()*Quaternions(d3.data()+3));
+    err.segment(3,3) = log_q(Quaterniond(d1.data()+3).conjugate()*Quaterniond(d3.data()+3));
     err.tail(3) = d3.tail(3) - d1.tail(3);
 
     ASSERT_MATRIX_APPROX(err, diff(d1, d3), 1e-10);
@@ -186,15 +186,15 @@ TEST(IMU_tools, diff)
 
 TEST(IMU_tools, compose_jacobians)
 {
-    VectorXs d1(10), d2(10), d3(10), d1_pert(10), d2_pert(10), d3_pert(10); // deltas
-    VectorXs t1(9), t2(9); // tangents
-    Matrix<Scalar, 9, 9> J1_a, J2_a, J1_n, J2_n;
-    Vector4s qv1, qv2;
-    Scalar dt = 0.1;
-    Scalar dx = 1e-6;
-    qv1 = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    VectorXd d1(10), d2(10), d3(10), d1_pert(10), d2_pert(10), d3_pert(10); // deltas
+    VectorXd t1(9), t2(9); // tangents
+    Matrix<double, 9, 9> J1_a, J2_a, J1_n, J2_n;
+    Vector4d qv1, qv2;
+    double dt = 0.1;
+    double dx = 1e-6;
+    qv1 = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     d1 << 0, 1, 2, qv1, 7, 8, 9;
-    qv2 = (Vector4s() << 1, 2, 3, 4).finished().normalized();
+    qv2 = (Vector4d() << 1, 2, 3, 4).finished().normalized();
     d2 << 9, 8, 7, qv2, 2, 1, 0;
 
     // analytical jacobians
@@ -226,14 +226,14 @@ TEST(IMU_tools, compose_jacobians)
 
 TEST(IMU_tools, diff_jacobians)
 {
-    VectorXs d1(10), d2(10), d3(9), d1_pert(10), d2_pert(10), d3_pert(9); // deltas
-    VectorXs t1(9), t2(9); // tangents
-    Matrix<Scalar, 9, 9> J1_a, J2_a, J1_n, J2_n;
-    Vector4s qv1, qv2;
-    Scalar dx = 1e-6;
-    qv1 = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    VectorXd d1(10), d2(10), d3(9), d1_pert(10), d2_pert(10), d3_pert(9); // deltas
+    VectorXd t1(9), t2(9); // tangents
+    Matrix<double, 9, 9> J1_a, J2_a, J1_n, J2_n;
+    Vector4d qv1, qv2;
+    double dx = 1e-6;
+    qv1 = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     d1 << 0, 1, 2, qv1, 7, 8, 9;
-    qv2 = (Vector4s() << 1, 2, 3, 4).finished().normalized();
+    qv2 = (Vector4d() << 1, 2, 3, 4).finished().normalized();
     d2 << 9, 8, 7, qv2, 2, 1, 0;
 
     // analytical jacobians
@@ -265,14 +265,14 @@ TEST(IMU_tools, diff_jacobians)
 
 TEST(IMU_tools, body2delta_jacobians)
 {
-    VectorXs delta(10), delta_pert(10); // deltas
-    VectorXs body(6), pert(6);
-    VectorXs tang(9); // tangents
-    Matrix<Scalar, 9, 6> J_a, J_n; // analytic and numerical jacs
-    Vector4s qv;;
-    Scalar dt = 0.1;
-    Scalar dx = 1e-6;
-    qv = (Vector4s() << 3, 4, 5, 6).finished().normalized();
+    VectorXd delta(10), delta_pert(10); // deltas
+    VectorXd body(6), pert(6);
+    VectorXd tang(9); // tangents
+    Matrix<double, 9, 6> J_a, J_n; // analytic and numerical jacs
+    Vector4d qv;;
+    double dt = 0.1;
+    double dx = 1e-6;
+    qv = (Vector4d() << 3, 4, 5, 6).finished().normalized();
     delta << 0, 1, 2,   qv,   7, 8, 9;
     body << 1, 2, 3,   3, 2, 1;
 
@@ -297,93 +297,93 @@ TEST(IMU_tools, body2delta_jacobians)
 
 TEST(motion2data, zero)
 {
-    Vector6s motion;
-    Vector6s bias;
-    Quaternions q;
+    Vector6d motion;
+    Vector6d bias;
+    Quaterniond q;
 
     motion  .setZero();
     bias    .setZero();
     q       .setIdentity();
 
-    Vector6s data = imu::motion2data(motion, q, bias);
+    Vector6d data = imu::motion2data(motion, q, bias);
 
-    Vector6s data_true; data_true << -gravity(), Vector3s::Zero();
+    Vector6d data_true; data_true << -gravity(), Vector3d::Zero();
 
     ASSERT_MATRIX_APPROX(data, data_true, 1e-12);
 }
 
 TEST(motion2data, motion)
 {
-    Vector6s motion, g_extended;
-    Vector6s bias;
-    Quaternions q;
+    Vector6d motion, g_extended;
+    Vector6d bias;
+    Quaterniond q;
 
-    g_extended << gravity() , Vector3s::Zero();
+    g_extended << gravity() , Vector3d::Zero();
 
     motion  << 1,2,3, 4,5,6;
     bias    .setZero();
     q       .setIdentity();
 
-    Vector6s data = imu::motion2data(motion, q, bias);
+    Vector6d data = imu::motion2data(motion, q, bias);
 
-    Vector6s data_true; data_true = motion - g_extended;
+    Vector6d data_true; data_true = motion - g_extended;
 
     ASSERT_MATRIX_APPROX(data, data_true, 1e-12);
 }
 
 TEST(motion2data, bias)
 {
-    Vector6s motion, g_extended;
-    Vector6s bias;
-    Quaternions q;
+    Vector6d motion, g_extended;
+    Vector6d bias;
+    Quaterniond q;
 
-    g_extended << gravity() , Vector3s::Zero();
+    g_extended << gravity() , Vector3d::Zero();
 
     motion  .setZero();
     bias    << 1,2,3, 4,5,6;
     q       .setIdentity();
 
-    Vector6s data = imu::motion2data(motion, q, bias);
+    Vector6d data = imu::motion2data(motion, q, bias);
 
-    Vector6s data_true; data_true = bias - g_extended;
+    Vector6d data_true; data_true = bias - g_extended;
 
     ASSERT_MATRIX_APPROX(data, data_true, 1e-12);
 }
 
 TEST(motion2data, orientation)
 {
-    Vector6s motion, g_extended;
-    Vector6s bias;
-    Quaternions q;
+    Vector6d motion, g_extended;
+    Vector6d bias;
+    Quaterniond q;
 
-    g_extended << gravity() , Vector3s::Zero();
+    g_extended << gravity() , Vector3d::Zero();
 
     motion  .setZero();
     bias    .setZero();
-    q       = v2q(Vector3s(M_PI/2, 0, 0)); // turn 90 deg in X axis
+    q       = v2q(Vector3d(M_PI/2, 0, 0)); // turn 90 deg in X axis
 
-    Vector6s data = imu::motion2data(motion, q, bias);
+    Vector6d data = imu::motion2data(motion, q, bias);
 
-    Vector6s data_true; data_true << 0,-gravity()(2),0, 0,0,0;
+    Vector6d data_true; data_true << 0,-gravity()(2),0, 0,0,0;
 
     ASSERT_MATRIX_APPROX(data, data_true, 1e-12);
 }
 
 TEST(motion2data, AllRandom)
 {
-    Vector6s motion, g_extended;
-    Vector6s bias;
-    Quaternions q;
+    Vector6d motion, g_extended;
+    Vector6d bias;
+    Quaterniond q;
 
     motion      .setRandom();
     bias        .setRandom();
     q.coeffs()  .setRandom().normalize();
 
-    g_extended << q.conjugate()*gravity() , Vector3s::Zero();
+    g_extended << q.conjugate()*gravity() , Vector3d::Zero();
 
-    Vector6s data = imu::motion2data(motion, q, bias);
+    Vector6d data = imu::motion2data(motion, q, bias);
 
-    Vector6s data_true; data_true = motion + bias - g_extended;
+    Vector6d data_true; data_true = motion + bias - g_extended;
 
     ASSERT_MATRIX_APPROX(data, data_true, 1e-12);
 }
@@ -398,14 +398,14 @@ TEST(motion2data, AllRandom)
  * Output:
  *   return: the preintegrated delta
  */
-VectorXs integrateDelta(int N, const Quaternions& q0, const VectorXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt)
+VectorXd integrateDelta(int N, const Quaterniond& q0, const VectorXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt)
 {
-    VectorXs data(6);
-    VectorXs body(6);
-    VectorXs delta(10);
-    VectorXs Delta(10), Delta_plus(10);
+    VectorXd data(6);
+    VectorXd body(6);
+    VectorXd delta(10);
+    VectorXd Delta(10), Delta_plus(10);
     Delta << 0,0,0, 0,0,0,1, 0,0,0;
-    Quaternions q(q0);
+    Quaterniond q(q0);
     for (int n = 0; n<N; n++)
     {
         data        = motion2data(motion, q, bias_real);
@@ -429,15 +429,15 @@ VectorXs integrateDelta(int N, const Quaternions& q0, const VectorXs& motion, co
  *   J_D_b: the Jacobian of the preintegrated delta wrt the bias
  *   return: the preintegrated delta
  */
-VectorXs integrateDelta(int N, const Quaternions& q0, const VectorXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, Matrix<Scalar, 9, 6>& J_D_b)
+VectorXd integrateDelta(int N, const Quaterniond& q0, const VectorXd& motion, const VectorXd& bias_real, const VectorXd& bias_preint, double dt, Matrix<double, 9, 6>& J_D_b)
 {
-    VectorXs data(6);
-    VectorXs body(6);
-    VectorXs delta(10);
-    Matrix<Scalar, 9, 6> J_d_d, J_d_b;
-    Matrix<Scalar, 9, 9> J_D_D, J_D_d;
-    VectorXs Delta(10), Delta_plus(10);
-    Quaternions q;
+    VectorXd data(6);
+    VectorXd body(6);
+    VectorXd delta(10);
+    Matrix<double, 9, 6> J_d_d, J_d_b;
+    Matrix<double, 9, 9> J_D_D, J_D_d;
+    VectorXd Delta(10), Delta_plus(10);
+    Quaterniond q;
 
     Delta << 0,0,0, 0,0,0,1, 0,0,0;
     J_D_b.setZero();
@@ -466,14 +466,14 @@ VectorXs integrateDelta(int N, const Quaternions& q0, const VectorXs& motion, co
 
 TEST(IMU_tools, integral_jacobian_bias)
 {
-    VectorXs Delta(10), Delta_pert(10); // deltas
-    VectorXs bias_real(6), pert(6), bias_pert(6), bias_preint(6);
-    VectorXs body(6), data(6), motion(6);
-    VectorXs tang(9); // tangents
-    Matrix<Scalar, 9, 6> J_a, J_n; // analytic and numerical jacs
-    Scalar dt = 0.001;
-    Scalar dx = 1e-4;
-    Quaternions q0(3, 4, 5, 6); q0.normalize();
+    VectorXd Delta(10), Delta_pert(10); // deltas
+    VectorXd bias_real(6), pert(6), bias_pert(6), bias_preint(6);
+    VectorXd body(6), data(6), motion(6);
+    VectorXd tang(9); // tangents
+    Matrix<double, 9, 6> J_a, J_n; // analytic and numerical jacs
+    double dt = 0.001;
+    double dx = 1e-4;
+    Quaterniond q0(3, 4, 5, 6); q0.normalize();
     motion << .1, .2, .3,   .3, .2, .1;
     bias_real   << .002, .004, .001,   .003, .002, .001;
     bias_preint << .004, .005, .006,   .001, .002, .003;
@@ -501,14 +501,14 @@ TEST(IMU_tools, integral_jacobian_bias)
 
 TEST(IMU_tools, delta_correction)
 {
-    VectorXs Delta(10), Delta_preint(10), Delta_corr; // deltas
-    VectorXs bias(6), pert(6), bias_preint(6);
-    VectorXs body(6), motion(6);
-    VectorXs tang(9); // tangents
-    Matrix<Scalar, 9, 6> J_b; // analytic and numerical jacs
-    Vector4s qv;;
-    Scalar dt = 0.001;
-    Quaternions q0(3, 4, 5, 6); q0.normalize();
+    VectorXd Delta(10), Delta_preint(10), Delta_corr; // deltas
+    VectorXd bias(6), pert(6), bias_preint(6);
+    VectorXd body(6), motion(6);
+    VectorXd tang(9); // tangents
+    Matrix<double, 9, 6> J_b; // analytic and numerical jacs
+    Vector4d qv;;
+    double dt = 0.001;
+    Quaterniond q0(3, 4, 5, 6); q0.normalize();
     motion << 1, 2, 3,   3, 2, 1; motion *= .1;
 
     int N = 1000; // # steps of integration
@@ -523,14 +523,14 @@ TEST(IMU_tools, delta_correction)
     Delta_preint = integrateDelta(N, q0, motion, bias, bias_preint, dt, J_b);
 
     // correct perturbated
-    Vector9s step = J_b*(bias-bias_preint);
+    Vector9d step = J_b*(bias-bias_preint);
     Delta_corr = plus(Delta_preint, step);
 
     // Corrected delta should match real delta
     ASSERT_MATRIX_APPROX(Delta, Delta_corr, 1e-5);
 
     // diff between real and corrected should be zero
-    ASSERT_MATRIX_APPROX(diff(Delta, Delta_corr), Vector9s::Zero(), 1e-5);
+    ASSERT_MATRIX_APPROX(diff(Delta, Delta_corr), Vector9d::Zero(), 1e-5);
 
     // diff between preint and corrected deltas should be the jacobian-computed step
     ASSERT_MATRIX_APPROX(diff(Delta_preint, Delta_corr), step, 1e-5);
@@ -538,15 +538,15 @@ TEST(IMU_tools, delta_correction)
 
 TEST(IMU_tools, full_delta_residual)
 {
-    VectorXs x1(10), x2(10);
-    VectorXs Delta(10), Delta_preint(10), Delta_corr(10);
-    VectorXs Delta_real(9), Delta_err(9), Delta_diff(10), Delta_exp(10);
-    VectorXs bias(6), pert(6), bias_preint(6), bias_null(6);
-    VectorXs body(6), motion(6);
-    VectorXs tang(9); // tangents
-    Matrix<Scalar, 9, 6> J_b; // analytic and numerical jacs
-    Scalar dt = 0.001;
-    Quaternions q0; q0.setIdentity();
+    VectorXd x1(10), x2(10);
+    VectorXd Delta(10), Delta_preint(10), Delta_corr(10);
+    VectorXd Delta_real(9), Delta_err(9), Delta_diff(10), Delta_exp(10);
+    VectorXd bias(6), pert(6), bias_preint(6), bias_null(6);
+    VectorXd body(6), motion(6);
+    VectorXd tang(9); // tangents
+    Matrix<double, 9, 6> J_b; // analytic and numerical jacs
+    double dt = 0.001;
+    Quaterniond q0; q0.setIdentity();
 
     x1          << 0,0,0, 0,0,0,1, 0,0,0;
     motion      <<  .3,    .2,    .1,      .1,     .2,     .3; // acc and gyro
@@ -574,7 +574,7 @@ TEST(IMU_tools, full_delta_residual)
     Delta_preint = integrateDelta(N, q0, motion, bias, bias_preint, dt, J_b);
 
     // compute correction step
-    Vector9s step = J_b*(bias-bias_preint);
+    Vector9d step = J_b*(bias-bias_preint);
 
     // correct preintegrated delta
     Delta_corr = plus(Delta_preint, step);
@@ -583,7 +583,7 @@ TEST(IMU_tools, full_delta_residual)
     ASSERT_MATRIX_APPROX(Delta_real, Delta_corr, 1e-3);
 
     // diff between real and corrected should be zero
-    ASSERT_MATRIX_APPROX(diff(Delta_real, Delta_corr), Vector9s::Zero(), 1e-3);
+    ASSERT_MATRIX_APPROX(diff(Delta_real, Delta_corr), Vector9d::Zero(), 1e-3);
 
     // expected delta
     Delta_exp = betweenStates(x1, x2, N*dt);
@@ -591,10 +591,10 @@ TEST(IMU_tools, full_delta_residual)
     ASSERT_MATRIX_APPROX(Delta_exp, Delta_corr, 1e-3);
 
     // compute diff between expected and corrected
-//    Matrix<Scalar, 9, 9> J_err_exp, J_err_corr;
+//    Matrix<double, 9, 9> J_err_exp, J_err_corr;
     diff(Delta_exp, Delta_corr, Delta_err); //, J_err_exp, J_err_corr);
 
-    ASSERT_MATRIX_APPROX(Delta_err, Vector9s::Zero(), 1e-3);
+    ASSERT_MATRIX_APPROX(Delta_err, Vector9d::Zero(), 1e-3);
 
     // compute error between expected and preintegrated
     Delta_err = diff(Delta_preint, Delta_exp);
diff --git a/test/gtest_factor_IMU.cpp b/test/gtest_factor_IMU.cpp
index f8fa7b85bcf3060d9665257c0e5121206ae67fbe..4d79d659b46752d93793c48635d840a523aeadc9 100644
--- a/test/gtest_factor_IMU.cpp
+++ b/test/gtest_factor_IMU.cpp
@@ -48,10 +48,10 @@ class FactorIMU_biasTest_Static_NullBias : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr KF0;
         FrameBasePtr KF1;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
-        Eigen::MatrixXs P_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
+        Eigen::MatrixXd P_origin;
 
     virtual void SetUp()
     {
@@ -73,7 +73,7 @@ class FactorIMU_biasTest_Static_NullBias : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -100,7 +100,7 @@ class FactorIMU_biasTest_Static_NullBias : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu;
+        Eigen::Vector6d data_imu;
         data_imu << -wolf::gravity(), 0,0,0;
 
         wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), origin_bias); //set data on IMU (measure only gravity here)
@@ -137,9 +137,9 @@ class FactorIMU_biasTest_Static_NonNullAccBias : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr KF0;
         FrameBasePtr KF1;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -161,7 +161,7 @@ class FactorIMU_biasTest_Static_NonNullAccBias : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -184,7 +184,7 @@ class FactorIMU_biasTest_Static_NonNullAccBias : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu;
+        Eigen::Vector6d data_imu;
         data_imu << -wolf::gravity(), 0,0,0;
         data_imu = data_imu + origin_bias;
 
@@ -221,9 +221,9 @@ class FactorIMU_biasTest_Static_NonNullGyroBias : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -245,7 +245,7 @@ class FactorIMU_biasTest_Static_NonNullGyroBias : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -268,7 +268,7 @@ class FactorIMU_biasTest_Static_NonNullGyroBias : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu;
+        Eigen::Vector6d data_imu;
         data_imu << -wolf::gravity(), 0,0,0;
         data_imu = data_imu + origin_bias;
 
@@ -305,9 +305,9 @@ class FactorIMU_biasTest_Static_NonNullBias : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -329,7 +329,7 @@ class FactorIMU_biasTest_Static_NonNullBias : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -354,11 +354,11 @@ class FactorIMU_biasTest_Static_NonNullBias : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu;
+        Eigen::Vector6d data_imu;
         data_imu << -wolf::gravity(), 0,0,0;
         data_imu = data_imu + origin_bias;
 
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero()); //set data on IMU (measure only gravity here)
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero()); //set data on IMU (measure only gravity here)
 
         for(unsigned int i = 0; i < 1000; i++) //integrate during 1 second
         {
@@ -391,9 +391,9 @@ class FactorIMU_biasTest_Move_NullBias : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -415,7 +415,7 @@ class FactorIMU_biasTest_Move_NullBias : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -429,7 +429,7 @@ class FactorIMU_biasTest_Move_NullBias : public testing::Test
         x_origin << 0,0,0, 0,0,0,1, 0,0,0;
         t.set(0);
 
-        Eigen::Vector6s data_imu;
+        Eigen::Vector6d data_imu;
         data_imu << 0,10,-wolf::gravity()(2), 0,0,0; //10m/s on y direction
         expected_final_state << 0,5,0, 0,0,0,1, 0,10,0; // advanced at a=10m/s2 during 1s ==> dx = 0.5*10*1^2 = 5; dvx = 10*1 = 10
 
@@ -445,7 +445,7 @@ class FactorIMU_biasTest_Move_NullBias : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
 
         for(unsigned int i = 0; i < 1000; i++) //integrate during 1 second
         {
@@ -478,9 +478,9 @@ class FactorIMU_biasTest_Move_NonNullBias : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -502,7 +502,7 @@ class FactorIMU_biasTest_Move_NonNullBias : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -515,8 +515,8 @@ class FactorIMU_biasTest_Move_NonNullBias : public testing::Test
         x_origin << 0,0,0, 0,0,0,1, 0,0,0;
         t.set(0);
 
-        Eigen::Vector6s data_imu;
-        origin_bias = Eigen::Vector6s::Random() * 0.001;
+        Eigen::Vector6d data_imu;
+        origin_bias = Eigen::Vector6d::Random() * 0.001;
         data_imu << 0,10,-wolf::gravity()(2), 0,0,0; //10m/s on y direction
         data_imu = data_imu + origin_bias;
         expected_final_state << 0,5,0, 0,0,0,1, 0,10,0; // advanced at a=10m/s2 during 1s ==> dx = 0.5*10*1^2 = 5; dvx = 10*1 = 10
@@ -528,7 +528,7 @@ class FactorIMU_biasTest_Move_NonNullBias : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
 
         for(unsigned int i = 0; i < 1000; i++) //integrate during 1 second
         {
@@ -561,9 +561,9 @@ class FactorIMU_biasTest_Move_NonNullBiasRotCst : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -585,7 +585,7 @@ class FactorIMU_biasTest_Move_NonNullBiasRotCst : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -598,14 +598,14 @@ class FactorIMU_biasTest_Move_NonNullBiasRotCst : public testing::Test
         x_origin << 0,0,0, 0,0,0,1, 0,0,0;
         t.set(0);
 
-        Eigen::Vector6s data_imu, data_imu_initial;
-        origin_bias = Eigen::Vector6s::Random() * 0.001;
-        wolf::Scalar rate_of_turn = 5 * M_PI/180.0; // rad/s
+        Eigen::Vector6d data_imu, data_imu_initial;
+        origin_bias = Eigen::Vector6d::Random() * 0.001;
+        double rate_of_turn = 5 * M_PI/180.0; // rad/s
         data_imu << -wolf::gravity(), rate_of_turn,0,0; //rotation only
         data_imu_initial = data_imu;
 
         // Expected state after one second integration
-        Eigen::Quaternions quat_comp(Eigen::Quaternions::Identity());
+        Eigen::Quaterniond quat_comp(Eigen::Quaterniond::Identity());
         quat_comp = quat_comp * wolf::v2q(data_imu.tail(3)*1);
         expected_final_state << 0,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 0,0,0; // rotated at 5 deg/s for 0.1s = 5 deg => 5 * M_PI/180
 
@@ -617,7 +617,7 @@ class FactorIMU_biasTest_Move_NonNullBiasRotCst : public testing::Test
         //===================================================== END{INITIALIZATION}
         //===================================================== PROCESS DATA
 
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
 
         for(unsigned int i = 0; i < 1000; i++) //integrate during 1 second
         {
@@ -654,9 +654,9 @@ class FactorIMU_biasTest_Move_NonNullBiasRotAndVCst : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -678,7 +678,7 @@ class FactorIMU_biasTest_Move_NonNullBiasRotAndVCst : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -691,15 +691,15 @@ class FactorIMU_biasTest_Move_NonNullBiasRotAndVCst : public testing::Test
         x_origin << 0,0,0, 0,0,0,1, 10,-3,4;
         t.set(0);
 
-        Eigen::Vector6s data_imu, data_imu_initial;
-        origin_bias = Eigen::Vector6s::Random();
+        Eigen::Vector6d data_imu, data_imu_initial;
+        origin_bias = Eigen::Vector6d::Random();
         origin_bias << 0,0,0, 0,0,0;
-        wolf::Scalar rate_of_turn = 5 * M_PI/180.0; // rad/s
+        double rate_of_turn = 5 * M_PI/180.0; // rad/s
         data_imu << -wolf::gravity(), rate_of_turn,0,0; //rotation only
         data_imu_initial = data_imu;
 
         // Expected state after one second integration
-        Eigen::Quaternions quat_comp(Eigen::Quaternions::Identity());
+        Eigen::Quaterniond quat_comp(Eigen::Quaterniond::Identity());
         quat_comp = quat_comp * wolf::v2q(data_imu.tail(3)*1);
 
         // rotated at 5 deg/s for 1s = 5 deg => 5 * M_PI/180
@@ -716,7 +716,7 @@ class FactorIMU_biasTest_Move_NonNullBiasRotAndVCst : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(t, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
 
         for(unsigned int i = 0; i < 1000; i++) //integrate during 1 second
         {
@@ -755,9 +755,9 @@ class FactorIMU_biasTest_Move_NonNullBiasRot : public testing::Test
         ProcessorIMUPtr processor_imu;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -779,7 +779,7 @@ class FactorIMU_biasTest_Move_NonNullBiasRot : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
@@ -792,7 +792,7 @@ class FactorIMU_biasTest_Move_NonNullBiasRot : public testing::Test
         x_origin << 0,0,0, 0,0,0,1, 0,0,0;
         origin_bias << 0.01, 0.02, 0.003, 0.002, 0.005, 0.01;
         t.set(0);
-        Eigen::Quaternions quat_current(Eigen::Quaternions::Identity());
+        Eigen::Quaterniond quat_current(Eigen::Quaterniond::Identity());
 
         //set origin of the problem
         origin_KF = processor_imu->setOrigin(x_origin, t);
@@ -801,12 +801,12 @@ class FactorIMU_biasTest_Move_NonNullBiasRot : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu(Eigen::Vector6s::Zero());
-        Eigen::Vector3s rateOfTurn(Eigen::Vector3s::Zero()); //deg/s
+        Eigen::Vector6d data_imu(Eigen::Vector6d::Zero());
+        Eigen::Vector3d rateOfTurn(Eigen::Vector3d::Zero()); //deg/s
 
-        Scalar dt(0.001);
+        double dt(0.001);
         TimeStamp ts(0);
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
 
         while( ts.get() < 1 )
         {
@@ -857,9 +857,9 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRot : public testing::Test
         FrameBasePtr last_KF;
         CaptureIMUPtr    capture_imu;
         CaptureOdom3DPtr capture_odo;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -879,13 +879,13 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRot : public testing::Test
         ceres_manager = std::make_shared<CeresManager>(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        sensor          = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        sensor          = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         sensor_imu      = std::static_pointer_cast<SensorIMU>(sensor);
         processor       = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         processor_imu   = std::static_pointer_cast<ProcessorIMU>(processor);
 
         // SENSOR + PROCESSOR ODOM 3D
-        sensor          = problem->installSensor("ODOM 3D", "odom", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml");
+        sensor          = problem->installSensor("ODOM 3D", "odom", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml");
         sensor_odo      = std::static_pointer_cast<SensorOdom3D>(sensor);
 
         sensor_imu->setNoiseStd((sensor_imu->getNoiseStd()/10.0).eval());
@@ -920,12 +920,12 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRot : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu(Eigen::Vector6s::Zero()),
-                        data_odo(Eigen::Vector6s::Zero());
-        Eigen::Vector3s rateOfTurn(Eigen::Vector3s::Zero()); //deg/s
+        Eigen::Vector6d data_imu(Eigen::Vector6d::Zero()),
+                        data_odo(Eigen::Vector6d::Zero());
+        Eigen::Vector3d rateOfTurn(Eigen::Vector3d::Zero()); //deg/s
 
         TimeStamp t_imu(0.0),    t_odo(0.0);
-        Scalar   dt_imu(0.001), dt_odo(.01);
+        double   dt_imu(0.001), dt_odo(.01);
 
         capture_imu = std::make_shared<CaptureIMU>   (t_imu, sensor_imu, data_imu, sensor_imu->getNoiseCov(), sensor_imu->getCalibration(), nullptr);
 
@@ -934,8 +934,8 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRot : public testing::Test
         t_odo += dt_odo;        //first odometry data will be processed at this timestamp
 
         // ground truth for quaternion:
-        Eigen::Quaternions quat_odo(Eigen::Quaternions::Identity());
-        Eigen::Quaternions quat_imu(Eigen::Quaternions::Identity());
+        Eigen::Quaterniond quat_odo(Eigen::Quaterniond::Identity());
+        Eigen::Quaterniond quat_imu(Eigen::Quaterniond::Identity());
 
         WOLF_TRACE("last delta preint: ", processor_imu->getLast()->getDeltaPreint().transpose());
         WOLF_TRACE("last jacoob bias : ", processor_imu->getLast()->getJacobianCalib().row(0));
@@ -947,7 +947,7 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRot : public testing::Test
             // Time and data variables
             t_imu += dt_imu;
             
-//            rateOfTurn = Eigen::Vector3s::Random()*10; //to have rate of turn > 0.99 deg/s
+//            rateOfTurn = Eigen::Vector3d::Random()*10; //to have rate of turn > 0.99 deg/s
             rateOfTurn << 5, 10, 15; // deg/s
             data_imu.tail<3>() = rateOfTurn * M_PI/180.0;
             data_imu.head<3>() =  quat_imu.conjugate() * (- wolf::gravity()); //gravity measured, we have no other translation movement
@@ -990,7 +990,7 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRot : public testing::Test
 //                WOLF_TRACE("orig calib preint: ", processor_imu->getOrigin()->getCalibrationPreint().transpose());
 
                 //prepare next odometry measurement
-                quat_odo = Eigen::Quaternions::Identity(); //set to identity to have next odom relative to this last KF
+                quat_odo = Eigen::Quaterniond::Identity(); //set to identity to have next odom relative to this last KF
                 t_odo += dt_odo;
                 break;
             }
@@ -1038,9 +1038,9 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY : public testing::Test
         ProcessorOdom3DPtr processor_odom3D;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
 
     virtual void SetUp()
     {
@@ -1062,13 +1062,13 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY : public testing::Test
         ceres_manager_wolf_diff = new CeresManager(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor_ = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor_);
 
         // SENSOR + PROCESSOR ODOM 3D
-        SensorBasePtr sen1_ptr = problem->installSensor("ODOM 3D", "odom", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml");
+        SensorBasePtr sen1_ptr = problem->installSensor("ODOM 3D", "odom", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml");
         ProcessorParamsOdom3DPtr prc_odom3D_params = std::make_shared<ProcessorParamsOdom3D>();
         prc_odom3D_params->max_time_span = 0.9999;
         prc_odom3D_params->max_buff_length = 1000000000; //make it very high so that this condition will not pass
@@ -1088,8 +1088,8 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY : public testing::Test
         origin_bias << 0.0015, 0.004, -0.002, 0.005, -0.0074, -0.003;
         origin_bias *= .1;
         t.set(0);
-        Eigen::Quaternions odom_quat(Eigen::Quaternions::Identity());
-        Eigen::Quaternions current_quatState(Eigen::Quaternions::Identity());
+        Eigen::Quaterniond odom_quat(Eigen::Quaterniond::Identity());
+        Eigen::Quaterniond current_quatState(Eigen::Quaterniond::Identity());
 
         //set origin of the problem
         origin_KF = processor_imu->setOrigin(x_origin, t);
@@ -1099,14 +1099,14 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu(Eigen::Vector6s::Zero()), data_odom3D(Eigen::Vector6s::Zero());
-        Eigen::Vector3s rateOfTurn; //deg/s
+        Eigen::Vector6d data_imu(Eigen::Vector6d::Zero()), data_odom3D(Eigen::Vector6d::Zero());
+        Eigen::Vector3d rateOfTurn; //deg/s
         rateOfTurn << 0,90,0;
-        VectorXs D_cor(10);
+        VectorXd D_cor(10);
 
-        Scalar dt(0.0010), dt_odom(1.0);
+        double dt(0.0010), dt_odom(1.0);
         TimeStamp ts(0.0), t_odom(0.0);
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
         wolf::CaptureOdom3DPtr mot_ptr = std::make_shared<CaptureOdom3D>(t, sen_odom3D, data_odom3D, sen_odom3D->getNoiseCov(), nullptr);
         sen_odom3D->process(mot_ptr);
         //first odometry data will be processed at this timestamp
@@ -1146,7 +1146,7 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY : public testing::Test
                 sen_odom3D->process(mot_ptr);
 
                 //prepare next odometry measurement
-                odom_quat = Eigen::Quaternions::Identity(); //set to identity to have next odom relative to this last KF
+                odom_quat = Eigen::Quaterniond::Identity(); //set to identity to have next odom relative to this last KF
                 t_odom.set(t_odom.get() + dt_odom);
             }
         }
@@ -1179,10 +1179,10 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
         ProcessorOdom3DPtr processor_odom3D;
         FrameBasePtr origin_KF;
         FrameBasePtr last_KF;
-        Eigen::Vector6s origin_bias;
-        Eigen::VectorXs expected_final_state;
-        Eigen::VectorXs x_origin;
-        Eigen::MatrixXs P_origin;
+        Eigen::Vector6d origin_bias;
+        Eigen::VectorXd expected_final_state;
+        Eigen::VectorXd x_origin;
+        Eigen::MatrixXd P_origin;
 
     virtual void SetUp()
     {
@@ -1204,13 +1204,13 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
         ceres_manager_wolf_diff = std::make_shared<CeresManager>(problem, ceres_options);
 
         // SENSOR + PROCESSOR IMU
-        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
+        SensorBasePtr sen0_ptr = problem->installSensor("IMU", "Main IMU", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_imu.yaml");
         processor = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
         sen_imu = std::static_pointer_cast<SensorIMU>(sen0_ptr);
         processor_imu = std::static_pointer_cast<ProcessorIMU>(processor);
 
         // SENSOR + PROCESSOR ODOM 3D
-        SensorBasePtr sen1_ptr = problem->installSensor("ODOM 3D", "odom", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml");
+        SensorBasePtr sen1_ptr = problem->installSensor("ODOM 3D", "odom", (Vector7d()<<0,0,0,0,0,0,1).finished(), wolf_root + "/demos/sensor_odom_3D.yaml");
         ProcessorParamsOdom3DPtr prc_odom3D_params = std::make_shared<ProcessorParamsOdom3D>();
         prc_odom3D_params->max_time_span = 0.9999;
         prc_odom3D_params->max_buff_length = 1000000000; //make it very high so that this condition will not pass
@@ -1230,8 +1230,8 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
         P_origin.setIdentity(9,9); P_origin *= .01;
         origin_bias << 0.0015, 0.004, -0.002, 0.005, -0.0074, -0.003;
         t.set(0);
-        Eigen::Quaternions odom_quat(Eigen::Quaternions::Identity());
-        Eigen::Quaternions current_quatState(Eigen::Quaternions::Identity());
+        Eigen::Quaterniond odom_quat(Eigen::Quaterniond::Identity());
+        Eigen::Quaterniond current_quatState(Eigen::Quaterniond::Identity());
 
         //set origin of the problem
         origin_KF = problem->setPrior(x_origin, P_origin, t, 0.005);
@@ -1242,19 +1242,19 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
         //===================================================== PROCESS DATA
         // PROCESS DATA
 
-        Eigen::Vector6s data_imu(Eigen::Vector6s::Zero()), data_odom3D(Eigen::Vector6s::Zero());
-        Eigen::Vector3s rateOfTurn; //deg/s
+        Eigen::Vector6d data_imu(Eigen::Vector6d::Zero()), data_odom3D(Eigen::Vector6d::Zero());
+        Eigen::Vector3d rateOfTurn; //deg/s
         rateOfTurn << 45,90,0;
 
-        Scalar dt(0.0010), dt_odom(1.0);
+        double dt(0.0010), dt_odom(1.0);
         TimeStamp ts(0.0), t_odom(1.0);
-        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6s::Zero());
+        wolf::CaptureIMUPtr imu_ptr = std::make_shared<CaptureIMU>(ts, sen_imu, data_imu, sen_imu->getNoiseCov(), Eigen::Vector6d::Zero());
         wolf::CaptureOdom3DPtr mot_ptr = std::make_shared<CaptureOdom3D>(t, sen_odom3D, data_odom3D, nullptr);
         sen_odom3D->process(mot_ptr);
         //first odometry data will be processed at this timestamp
         //t_odom.set(t_odom.get() + dt_odom);
 
-        Eigen::Vector2s randomPart;
+        Eigen::Vector2d randomPart;
         data_imu.tail<3>() = rateOfTurn* M_PI/180.0; //constant rotation =
 
         //when we find a IMU timestamp corresponding with this odometry timestamp then we process odometry measurement
@@ -1286,7 +1286,7 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
                 sen_odom3D->process(mot_ptr);
 
                 //prepare next odometry measurement
-                odom_quat = Eigen::Quaternions::Identity(); //set to identity to have next odom relative to this last KF
+                odom_quat = Eigen::Quaterniond::Identity(); //set to identity to have next odom relative to this last KF
                 t_odom.set(t_odom.get() + dt_odom);
             }
         }
@@ -1301,7 +1301,7 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
             ts.set((500 + j)*dt);
 
             /*data_imu.tail<3>() = rateOfTurn* M_PI/180.0;
-            randomPart = Eigen::Vector2s::Random(); //to have rate of turn > 0.99 deg/s
+            randomPart = Eigen::Vector2d::Random(); //to have rate of turn > 0.99 deg/s
             data_imu.segment<2>(3) += randomPart* M_PI/180.0;*/
             data_imu.head<3>() =  current_quatState.conjugate() * (- wolf::gravity()); //gravity measured, we have no other translation movement
 
@@ -1325,7 +1325,7 @@ class FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY : public testing::Test
                 sen_odom3D->process(mot_ptr);
 
                 //prepare next odometry measurement
-                odom_quat = Eigen::Quaternions::Identity(); //set to identity to have next odom relative to this last KF
+                odom_quat = Eigen::Quaterniond::Identity(); //set to identity to have next odom relative to this last KF
                 t_odom.set(t_odom.get() + dt_odom);
             }
         }
@@ -1351,7 +1351,7 @@ TEST_F(FactorIMU_biasTest_Static_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_initOK)
     KF0->getP()->fix();
     KF0->getO()->fix();
     KF0->getV()->fix();
-    KF0->getCaptureOf(sen_imu)->setCalibration((Vector6s()<<1,2,3,1,2,3).finished());
+    KF0->getCaptureOf(sen_imu)->setCalibration((Vector6d()<<1,2,3,1,2,3).finished());
 
     KF1->getP()->setState(expected_final_state.head(3));
     KF1->getO()->setState(expected_final_state.segment(3,4));
@@ -1360,7 +1360,7 @@ TEST_F(FactorIMU_biasTest_Static_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_initOK)
     KF1->getP()->fix();
     KF1->getO()->fix();
     KF1->getV()->fix();
-    KF1->getCaptureOf(sen_imu)->setCalibration((Vector6s()<<-1,-2,-3,-1,-2,-3).finished());
+    KF1->getCaptureOf(sen_imu)->setCalibration((Vector6d()<<-1,-2,-3,-1,-2,-3).finished());
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport;
 
@@ -1382,16 +1382,16 @@ TEST_F(FactorIMU_biasTest_Static_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     KF1->getO()->fix();
     KF1->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
     std::string report;
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1409,7 +1409,7 @@ TEST_F(FactorIMU_biasTest_Static_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1427,7 +1427,7 @@ TEST_F(FactorIMU_biasTest_Static_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1447,7 +1447,7 @@ TEST_F(FactorIMU_biasTest_Static_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
         KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1498,16 +1498,16 @@ TEST_F(FactorIMU_biasTest_Static_NonNullAccBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBia
     KF1->getO()->fix();
     KF1->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
     std::string report;
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1525,7 +1525,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullAccBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBia
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1543,7 +1543,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullAccBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBia
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1563,7 +1563,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullAccBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBia
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         KF0->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
         KF1->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1611,16 +1611,16 @@ TEST_F(FactorIMU_biasTest_Static_NonNullGyroBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
     last_KF->getO()->fix();
     last_KF->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
     std::string report;
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
 
     origin_KF->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
@@ -1636,7 +1636,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullGyroBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     last_KF->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1651,7 +1651,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullGyroBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
     last_KF->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1668,7 +1668,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullGyroBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         origin_KF->getCaptureOf(sen_imu)->setCalibration(perturbed_bias);
         last_KF->getCaptureOf(sen_imu)->setCalibration(origin_bias);
@@ -1691,16 +1691,16 @@ TEST_F(FactorIMU_biasTest_Static_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     last_KF->getO()->fix();
     last_KF->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
     std::string report;
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1716,7 +1716,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1731,7 +1731,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1748,7 +1748,7 @@ TEST_F(FactorIMU_biasTest_Static_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         origin_KF->setState(x_origin);
         last_KF->setState(expected_final_state);
@@ -1793,15 +1793,15 @@ TEST_F(FactorIMU_biasTest_Move_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     last_KF->getO()->fix();
     last_KF->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1816,7 +1816,7 @@ TEST_F(FactorIMU_biasTest_Move_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1831,7 +1831,7 @@ TEST_F(FactorIMU_biasTest_Move_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1848,7 +1848,7 @@ TEST_F(FactorIMU_biasTest_Move_NullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         origin_KF->setState(x_origin);
         last_KF->setState(expected_final_state);
@@ -1892,15 +1892,15 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     last_KF->getO()->fix();
     last_KF->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1915,7 +1915,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1930,7 +1930,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -1947,7 +1947,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBias,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBias)
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         origin_KF->setState(x_origin);
         last_KF->setState(expected_final_state);
@@ -1992,15 +1992,15 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotCst,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
     last_KF->getO()->fix();
     last_KF->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -2015,7 +2015,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotCst,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -2030,7 +2030,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotCst,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -2047,7 +2047,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotCst,VarB1B2_InvarP1Q1V1P2Q2V2_ErrBi
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         origin_KF->setState(x_origin);
         last_KF->setState(expected_final_state);
@@ -2092,15 +2092,15 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotAndVCst,VarB1B2_InvarP1Q1V1P2Q2V2_E
     last_KF->getO()->fix();
     last_KF->getV()->fix();
 
-    wolf::Scalar epsilon_bias = 0.0000001;
-    Eigen::VectorXs perturbed_bias(origin_bias);
+    double epsilon_bias = 0.0000001;
+    Eigen::VectorXd perturbed_bias(origin_bias);
 
     //==============================================================
     //WOLF_INFO("Starting error bias 1e-6")
     epsilon_bias = 0.000001;
-    Eigen::Vector6s err;
+    Eigen::Vector6d err;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -2115,7 +2115,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotAndVCst,VarB1B2_InvarP1Q1V1P2Q2V2_E
     //WOLF_INFO("Starting error bias 1e-4")
     epsilon_bias = 0.0001;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -2130,7 +2130,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotAndVCst,VarB1B2_InvarP1Q1V1P2Q2V2_E
     //WOLF_INFO("Starting error bias 1e-2")
     epsilon_bias = 0.01;
 
-    err = Eigen::Vector6s::Random() * epsilon_bias*10;
+    err = Eigen::Vector6d::Random() * epsilon_bias*10;
     perturbed_bias = origin_bias + err;
     origin_KF->setState(x_origin);
     last_KF->setState(expected_final_state);
@@ -2147,7 +2147,7 @@ TEST_F(FactorIMU_biasTest_Move_NonNullBiasRotAndVCst,VarB1B2_InvarP1Q1V1P2Q2V2_E
 
     for(int i = 1; i<10; i++)
     {
-        err = Eigen::Vector6s::Random() * epsilon_bias*10;
+        err = Eigen::Vector6d::Random() * epsilon_bias*10;
         perturbed_bias = origin_bias + err;
         origin_KF->setState(x_origin);
         last_KF->setState(expected_final_state);
@@ -2217,8 +2217,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2_InvarP1Q1V1P2Q2V2_i
     last_KF->getV()->fix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2228,8 +2228,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2_InvarP1Q1V1P2Q2V2_i
     ASSERT_MATRIX_APPROX(origin_KF->getCaptureOf(sen_imu)->getCalibration(), origin_bias, 1e-5)
     ASSERT_MATRIX_APPROX(last_KF  ->getCaptureOf(sen_imu)->getCalibration(), origin_bias, 1e-5)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2262,8 +2262,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V2_InvarP1Q1V1P2Q2_i
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2274,8 +2274,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V2_InvarP1Q1V1P2Q2_i
 
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*100)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2309,8 +2309,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V1V2_InvarP1Q1P2Q2_i
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2338,8 +2338,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V1Q2V2_InvarP1Q1P2_i
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2349,7 +2349,7 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V1Q2V2_InvarP1Q1P2_i
     ASSERT_MATRIX_APPROX(origin_KF->getV()->getState(), x_origin.segment(7,3), wolf::Constants::EPS*1000)
     
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*1000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 }
 
@@ -2368,8 +2368,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V1P2V2_InvarP1Q1Q2_i
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2396,8 +2396,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V1P2Q2V2_InvarP1Q1_i
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.0001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.0001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2407,7 +2407,7 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2V1P2Q2V2_InvarP1Q1_i
     ASSERT_MATRIX_APPROX(last_KF  ->getCaptureOf(sen_imu)->getCalibration(), origin_bias, 1e-5)
     
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*10000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 }
 
@@ -2425,8 +2425,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2P2Q2V2_InvarP1Q1V1_i
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2438,11 +2438,11 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2P2Q2V2_InvarP1Q1V1_i
     
     ASSERT_MATRIX_APPROX(last_KF->getP()->getState(), expected_final_state.head(3), wolf::Constants::EPS*100)
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*1000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2464,11 +2464,11 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarB1B2P2Q2V2_InvarP1Q1V1_i
 TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarQ1B1B2P2Q2_InvarP1V1V2_initOK)
 {
     //Add fix factor on yaw to make the problem observable
-    Eigen::MatrixXs featureFix_cov(6,6);
-    featureFix_cov = Eigen::MatrixXs::Identity(6,6); 
+    Eigen::MatrixXd featureFix_cov(6,6);
+    featureFix_cov = Eigen::MatrixXd::Identity(6,6); 
     featureFix_cov(5,5) = 0.1;
-    auto capfix = CaptureBase::emplace<CaptureOdom3D>(origin_KF, 0, nullptr, (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), nullptr);
-    auto ffix = FeatureBase::emplace<FeatureBase>(capfix, "ODOM 3D", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), featureFix_cov);
+    auto capfix = CaptureBase::emplace<CaptureOdom3D>(origin_KF, 0, nullptr, (Eigen::Vector7d() << 0,0,0, 0,0,0,1).finished(), nullptr);
+    auto ffix = FeatureBase::emplace<FeatureBase>(capfix, "ODOM 3D", (Eigen::Vector7d() << 0,0,0, 0,0,0,1).finished(), featureFix_cov);
     FactorPose3DPtr fac_fix = std::static_pointer_cast<FactorPose3D>(FactorBase::emplace<FactorPose3D>(ffix, ffix));
 
     //prepare problem for solving
@@ -2483,8 +2483,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarQ1B1B2P2Q2_InvarP1V1V2_i
     last_KF->getV()->fix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2496,11 +2496,11 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarQ1B1B2P2Q2_InvarP1V1V2_i
     
     ASSERT_MATRIX_APPROX(last_KF->getP()->getState(), expected_final_state.head(3), wolf::Constants::EPS*100)
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*1000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2522,13 +2522,13 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotY, VarQ1B1B2P2Q2_InvarP1V1V2_i
 TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY, VarQ1B1B2P2Q2_InvarP1V1V2_initOK)
 {
     //Add fix factor on yaw to make the problem observable
-    Eigen::MatrixXs featureFix_cov(6,6);
-    featureFix_cov = Eigen::MatrixXs::Identity(6,6); 
+    Eigen::MatrixXd featureFix_cov(6,6);
+    featureFix_cov = Eigen::MatrixXd::Identity(6,6); 
     featureFix_cov(5,5) = 0.1;
-    // CaptureBasePtr capfix = origin_KF->addCapture(std::make_shared<CaptureOdom3D>(0, nullptr, (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), nullptr));
-    auto capfix = CaptureBase::emplace<CaptureOdom3D>(origin_KF, 0, nullptr, (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), nullptr);
-    // FeatureBasePtr ffix = capfix->addFeature(std::make_shared<FeatureBase>("ODOM 3D", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), featureFix_cov));
-    auto ffix = FeatureBase::emplace<FeatureBase>(capfix, "ODOM 3D", (Eigen::Vector7s() << 0,0,0, 0,0,0,1).finished(), featureFix_cov);
+    // CaptureBasePtr capfix = origin_KF->addCapture(std::make_shared<CaptureOdom3D>(0, nullptr, (Eigen::Vector7d() << 0,0,0, 0,0,0,1).finished(), nullptr));
+    auto capfix = CaptureBase::emplace<CaptureOdom3D>(origin_KF, 0, nullptr, (Eigen::Vector7d() << 0,0,0, 0,0,0,1).finished(), nullptr);
+    // FeatureBasePtr ffix = capfix->addFeature(std::make_shared<FeatureBase>("ODOM 3D", (Eigen::Vector7d() << 0,0,0, 0,0,0,1).finished(), featureFix_cov));
+    auto ffix = FeatureBase::emplace<FeatureBase>(capfix, "ODOM 3D", (Eigen::Vector7d() << 0,0,0, 0,0,0,1).finished(), featureFix_cov);
     // FactorPose3DPtr fac_fix = std::static_pointer_cast<FactorPose3D>(ffix->addFactor(std::make_shared<FactorPose3D>(ffix)));
     FactorPose3DPtr fac_fix = std::static_pointer_cast<FactorPose3D>(FactorBase::emplace<FactorPose3D>(ffix, ffix));
 
@@ -2544,8 +2544,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY, VarQ1B1B2P2Q2_InvarP1V1V2_
     last_KF->getV()->fix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sen_imu)->getCalibration();
     origin_KF->getCaptureOf(sen_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager_wolf_diff->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2557,11 +2557,11 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRotXY, VarQ1B1B2P2Q2_InvarP1V1V2_
     
     ASSERT_MATRIX_APPROX(last_KF->getP()->getState(), expected_final_state.head(3), wolf::Constants::EPS*100)
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*1000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2594,8 +2594,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2_InvarP1Q1V1P2Q2V2_in
     last_KF->getV()->fix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
 //    WOLF_TRACE("real   bias : ", origin_bias.transpose());
@@ -2611,8 +2611,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2_InvarP1Q1V1P2Q2V2_in
     ASSERT_MATRIX_APPROX(origin_KF->getCaptureOf(sensor_imu)->getCalibration(), origin_bias, 1e-5)
     ASSERT_MATRIX_APPROX(last_KF  ->getCaptureOf(sensor_imu)->getCalibration(), origin_bias, 1e-5)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2645,8 +2645,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V2_InvarP1Q1V1P2Q2_in
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2657,8 +2657,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V2_InvarP1Q1V1P2Q2_in
 
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*100)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
@@ -2691,8 +2691,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V1V2_InvarP1Q1P2Q2_in
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2718,8 +2718,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V1Q2V2_InvarP1Q1P2_in
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2729,7 +2729,7 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V1Q2V2_InvarP1Q1P2_in
     ASSERT_MATRIX_APPROX(last_KF  ->getCaptureOf(sensor_imu)->getCalibration(), origin_bias, 1e-5)
     
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*1000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 }
 
@@ -2747,8 +2747,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V1P2V2_InvarP1Q1Q2_in
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2774,8 +2774,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V1P2Q2V2_InvarP1Q1_in
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.0001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.0001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2785,7 +2785,7 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2V1P2Q2V2_InvarP1Q1_in
     ASSERT_MATRIX_APPROX(last_KF  ->getCaptureOf(sensor_imu)->getCalibration(), origin_bias, 1e-5)
     
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*10000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 }
 
@@ -2803,8 +2803,8 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2P2Q2V2_InvarP1Q1V1_in
     last_KF->getV()->unfix();
 
     //perturbation of origin bias
-    Eigen::Vector6s random_err(Eigen::Vector6s::Random() * 0.00001);
-    Eigen::Vector6s bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
+    Eigen::Vector6d random_err(Eigen::Vector6d::Random() * 0.00001);
+    Eigen::Vector6d bias = origin_KF->getCaptureOf(sensor_imu)->getCalibration();
     origin_KF->getCaptureOf(sensor_imu)->setCalibration(bias + random_err);
 
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);// 0: nothing, 1: BriefReport, 2: FullReport
@@ -2816,11 +2816,11 @@ TEST_F(FactorIMU_ODOM_biasTest_Move_NonNullBiasRot, VarB1B2P2Q2V2_InvarP1Q1V1_in
     
     ASSERT_MATRIX_APPROX(last_KF->getP()->getState(), expected_final_state.head(3), wolf::Constants::EPS*100)
     ASSERT_MATRIX_APPROX(last_KF->getV()->getState(), expected_final_state.segment(7,3), wolf::Constants::EPS*1000)
-    Eigen::Map<const Eigen::Quaternions> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
+    Eigen::Map<const Eigen::Quaterniond> estimatedLastQuat(last_KF->getO()->getState().data()), expectedLastQuat(expected_final_state.segment(3,4).data());
     ASSERT_QUATERNION_APPROX(estimatedLastQuat, expectedLastQuat, wolf::Constants::EPS*100)
 
-    Eigen::Matrix<wolf::Scalar, 10, 1> cov_stdev, actual_state(last_KF->getState());
-    Eigen::MatrixXs covX(10,10);
+    Eigen::Matrix<double, 10, 1> cov_stdev, actual_state(last_KF->getState());
+    Eigen::MatrixXd covX(10,10);
         
     //get data from covariance blocks
     problem->getFrameCovariance(last_KF, covX);
diff --git a/test/gtest_feature_IMU.cpp b/test/gtest_feature_IMU.cpp
index f5e9a0c2b4b987cad4373bbb6e48de0c4149b284..f97943db3f4ad03b3a24b415f11673d59403a22c 100644
--- a/test/gtest_feature_IMU.cpp
+++ b/test/gtest_feature_IMU.cpp
@@ -16,13 +16,13 @@ class FeatureIMU_test : public testing::Test
         wolf::ProblemPtr problem;
         wolf::TimeStamp ts;
         wolf::CaptureIMUPtr imu_ptr;
-        Eigen::VectorXs state_vec;
-        Eigen::VectorXs delta_preint;
-        Eigen::Matrix<wolf::Scalar,9,9> delta_preint_cov;
+        Eigen::VectorXd state_vec;
+        Eigen::VectorXd delta_preint;
+        Eigen::Matrix<double,9,9> delta_preint_cov;
         std::shared_ptr<wolf::FeatureIMU> feat_imu;
         wolf::FrameBasePtr last_frame;
         wolf::FrameBasePtr origin_frame;
-        Eigen::MatrixXs dD_db_jacobians;
+        Eigen::MatrixXd dD_db_jacobians;
         wolf::ProcessorBasePtr processor_ptr_;
 
     //a new of this will be created for each new test
@@ -35,7 +35,7 @@ class FeatureIMU_test : public testing::Test
 
         // Wolf problem
         problem = Problem::create("POV", 3);
-        Eigen::VectorXs IMU_extrinsics(7);
+        Eigen::VectorXd IMU_extrinsics(7);
         IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
         IntrinsicsIMUPtr sen_imu_params = std::make_shared<IntrinsicsIMU>();
         SensorBasePtr sensor_ptr = problem->installSensor("IMU", "Main IMU", IMU_extrinsics, sen_imu_params);
@@ -48,14 +48,14 @@ class FeatureIMU_test : public testing::Test
 
     // Time and data variables
         TimeStamp t;
-        Eigen::Vector6s data_;
+        Eigen::Vector6d data_;
 
         t.set(0);
 
     // Set the origin
-        Eigen::VectorXs x0(10);
+        Eigen::VectorXd x0(10);
         x0 << 0,0,0,  0,0,0,1,  0,0,0;
-        MatrixXs P0; P0.setIdentity(9,9);
+        MatrixXd P0; P0.setIdentity(9,9);
         origin_frame = problem->setPrior(x0, P0, 0.0, 0.01);
 
     // Emplace one capture to store the IMU data arriving from (sensor / callback / file / etc.)
@@ -65,8 +65,8 @@ class FeatureIMU_test : public testing::Test
                                                  t,
                                                  sensor_ptr,
                                                  data_,
-                                                 Eigen::Matrix6s::Identity(),
-                                                 Eigen::Vector6s::Zero()) );
+                                                 Eigen::Matrix6d::Identity(),
+                                                 Eigen::Vector6d::Zero()) );
 
     //process data
         data_ << 2, 0, 9.8, 0, 0, 0;
@@ -86,8 +86,8 @@ class FeatureIMU_test : public testing::Test
 
     //emplace a feature
         delta_preint = problem->getProcessorMotion()->getMotion().delta_integr_;
-        delta_preint_cov = problem->getProcessorMotion()->getMotion().delta_integr_cov_ + MatrixXs::Identity(9,9)*1e-08;
-        VectorXs calib_preint = problem->getProcessorMotion()->getLast()->getCalibrationPreint();
+        delta_preint_cov = problem->getProcessorMotion()->getMotion().delta_integr_cov_ + MatrixXd::Identity(9,9)*1e-08;
+        VectorXd calib_preint = problem->getProcessorMotion()->getLast()->getCalibrationPreint();
         dD_db_jacobians = problem->getProcessorMotion()->getMotion().jacobian_calib_;
         feat_imu = std::static_pointer_cast<FeatureIMU>(
                 FeatureBase::emplace<FeatureIMU>(imu_ptr,
@@ -136,7 +136,7 @@ TEST_F(FeatureIMU_test, check_frame)
     left_vptr = left_frame->getV();
 
     ASSERT_MATRIX_APPROX(origin_pptr->getState(), left_pptr->getState(), wolf::Constants::EPS_SMALL);
-    Eigen::Map<const Eigen::Quaternions> origin_Quat(origin_optr->getState().data()), left_Quat(left_optr->getState().data());
+    Eigen::Map<const Eigen::Quaterniond> origin_Quat(origin_optr->getState().data()), left_Quat(left_optr->getState().data());
     ASSERT_QUATERNION_APPROX(origin_Quat, left_Quat, wolf::Constants::EPS_SMALL);
     ASSERT_MATRIX_APPROX(origin_vptr->getState(), left_vptr->getState(), wolf::Constants::EPS_SMALL);
 
@@ -147,7 +147,7 @@ TEST_F(FeatureIMU_test, access_members)
 {
     using namespace wolf;
 
-    Eigen::VectorXs delta(10);
+    Eigen::VectorXd delta(10);
     //dx = 0.5*2*0.1^2 = 0.01; dvx = 2*0.1 = 0.2; dz = 0.5*9.8*0.1^2 = 0.049; dvz = 9.8*0.1 = 0.98
     delta << 0.01,0,0.049, 0,0,0,1, 0.2,0,0.98;
     ASSERT_MATRIX_APPROX(feat_imu->getMeasurement().transpose(), delta.transpose(), wolf::Constants::EPS);
diff --git a/test/gtest_processor_IMU.cpp b/test/gtest_processor_IMU.cpp
index 9c51e9c2b327f4af0b86210525ab01f27eee4005..31b1ba84726b575825b116045fcaf4272face078 100644
--- a/test/gtest_processor_IMU.cpp
+++ b/test/gtest_processor_IMU.cpp
@@ -31,11 +31,11 @@ class ProcessorIMUt : public testing::Test
         wolf::ProblemPtr problem;
         wolf::SensorBasePtr sensor_ptr;
         wolf::TimeStamp t;
-        wolf::Scalar mti_clock, tmp;
-        wolf::Scalar dt;
-        Vector6s data;
-        Matrix6s data_cov;
-        VectorXs x0;
+        double mti_clock, tmp;
+        double dt;
+        Vector6d data;
+        Matrix6d data_cov;
+        VectorXd x0;
         std::shared_ptr<wolf::CaptureIMU> cap_imu_ptr;
 
     //a new of this will be created for each new test
@@ -52,19 +52,19 @@ class ProcessorIMUt : public testing::Test
 
         // Wolf problem
         problem = Problem::create("POV", 3);
-        Vector7s extrinsics = (Vector7s() << 0,0,0, 0,0,0,1).finished();
+        Vector7d extrinsics = (Vector7d() << 0,0,0, 0,0,0,1).finished();
         sensor_ptr = problem->installSensor("IMU", "Main IMU", extrinsics,  wolf_root + "/demos/sensor_imu.yaml");
         ProcessorBasePtr processor_ptr = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/demos/processor_imu.yaml");
 
         // Time and data variables
-        data = Vector6s::Zero();
-        data_cov = Matrix6s::Identity();
+        data = Vector6d::Zero();
+        data_cov = Matrix6d::Identity();
 
         // Set the origin
         x0.resize(10);
 
         // Create one capture to store the IMU data arriving from (sensor / callback / file / etc.)
-        cap_imu_ptr = make_shared<CaptureIMU>(t, sensor_ptr, data, data_cov, Vector6s::Zero());
+        cap_imu_ptr = make_shared<CaptureIMU>(t, sensor_ptr, data, data_cov, Vector6d::Zero());
     }
 
     virtual void TearDown()
@@ -101,7 +101,7 @@ TEST(ProcessorIMU_constructors, ALL)
     //Factory constructor with pointers
     std::string wolf_root = _WOLF_IMU_ROOT_DIR;
     ProblemPtr problem = Problem::create("POV", 3);
-    Vector7s extrinsics = (Vector7s()<<1,0,0, 0,0,0,1).finished();
+    Vector7d extrinsics = (Vector7d()<<1,0,0, 0,0,0,1).finished();
     SensorBasePtr sensor_ptr = problem->installSensor("IMU", "Main IMU", extrinsics, wolf_root + "/demos/sensor_imu.yaml");
     ProcessorParamsIMUPtr params_default = std::make_shared<ProcessorParamsIMU>();
     ProcessorBasePtr processor_ptr = problem->installProcessor("IMU", "IMU pre-integrator", sensor_ptr, params_default);
@@ -131,7 +131,7 @@ TEST(ProcessorIMU, voteForKeyFrame)
 
     // Wolf problem
     ProblemPtr problem = Problem::create("POV", 3);
-    Vector7s extrinsics = (Vector7s()<<1,0,0, 0,0,0,1).finished();
+    Vector7d extrinsics = (Vector7d()<<1,0,0, 0,0,0,1).finished();
     SensorBasePtr sensor_ptr = problem->installSensor("IMU", "Main IMU", extrinsics,  wolf_root + "/demos/sensor_imu.yaml");
     ProcessorParamsIMUPtr prc_imu_params = std::make_shared<ProcessorParamsIMU>();
     prc_imu_params->max_time_span = 1;
@@ -142,24 +142,24 @@ TEST(ProcessorIMU, voteForKeyFrame)
     ProcessorBasePtr processor_ptr = problem->installProcessor("IMU", "IMU pre-integrator", sensor_ptr, prc_imu_params);
     
     //setting origin
-    VectorXs x0(10);
+    VectorXd x0(10);
     TimeStamp t(0);
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
     //data variable and covariance matrix
     // since we integrate only a few times, give the capture a big covariance, otherwise it will be so small that it won't pass following assertions
-    Vector6s data;
+    Vector6d data;
     data << 1,0,0, 0,0,0;
-    Matrix6s data_cov(Matrix6s::Identity());
+    Matrix6d data_cov(Matrix6d::Identity());
     data_cov(0,0) = 0.5;
 
     // Create the captureIMU to store the IMU data arriving from (sensor / callback / file / etc.)
-    std::shared_ptr<wolf::CaptureIMU> cap_imu_ptr = make_shared<CaptureIMU>(t, sensor_ptr, data, data_cov, Vector6s::Zero());
+    std::shared_ptr<wolf::CaptureIMU> cap_imu_ptr = make_shared<CaptureIMU>(t, sensor_ptr, data, data_cov, Vector6d::Zero());
 
     //  Time  
     // we want more than one data to integrate otherwise covariance will be 0
-    Scalar dt = std::static_pointer_cast<ProcessorIMU>(processor_ptr)->getMaxTimeSpan() - 0.1;
+    double dt = std::static_pointer_cast<ProcessorIMU>(processor_ptr)->getMaxTimeSpan() - 0.1;
     t.set(dt);
     cap_imu_ptr->setTimeStamp(t);
     sensor_ptr->process(cap_imu_ptr);
@@ -206,7 +206,7 @@ TEST_F(ProcessorIMUt, acc_x)
 {
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
     data << 2, 0, 9.806, 0, 0, 0; // only acc_x, but measure gravity!
@@ -216,9 +216,9 @@ TEST_F(ProcessorIMUt, acc_x)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0.01,0,0, 0,0,0,1, 0.2,0,0; // advanced at a=2m/s2 during 0.1s ==> dx = 0.5*2*0.1^2 = 0.01; dvx = 2*0.1 = 0.2
-    Vector6s b; b << 0,0,0, 0,0,0;
+    Vector6d b; b << 0,0,0, 0,0,0;
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);
     ASSERT_MATRIX_APPROX(problem->getProcessorMotion()->getLast()->getCalibration() , b, wolf::Constants::EPS_SMALL);
@@ -232,7 +232,7 @@ TEST_F(ProcessorIMUt, acc_y)
 
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
     data << 0, 20, 9.806, 0, 0, 0; // only acc_y, but measure gravity!
@@ -242,9 +242,9 @@ TEST_F(ProcessorIMUt, acc_y)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0,0.00001,0, 0,0,0,1, 0,0.02,0; // advanced at a=20m/s2 during 0.001s ==> dx = 0.5*20*0.001^2 = 0.00001; dvx = 20*0.001 = 0.02
-    Vector6s b; b<< 0,0,0, 0,0,0;
+    Vector6d b; b<< 0,0,0, 0,0,0;
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);
     ASSERT_MATRIX_APPROX(problem->getProcessorMotion()->getLast()->getCalibration() , b, wolf::Constants::EPS_SMALL);
@@ -269,7 +269,7 @@ TEST_F(ProcessorIMUt, acc_z)
 {
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
     data << 0, 0, 9.806 + 2.0, 0, 0, 0; // only acc_z, but measure gravity!
@@ -279,9 +279,9 @@ TEST_F(ProcessorIMUt, acc_z)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0,0,0.01, 0,0,0,1, 0,0,0.2; // advanced at a=2m/s2 during 0.1s ==> dz = 0.5*2*0.1^2 = 0.01; dvz = 2*0.1 = 0.2
-    Vector6s b; b<< 0,0,0, 0,0,0;
+    Vector6d b; b<< 0,0,0, 0,0,0;
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);
     ASSERT_MATRIX_APPROX(problem->getProcessorMotion()->getLast()->getCalibration() , b, wolf::Constants::EPS_SMALL);
@@ -306,7 +306,7 @@ TEST_F(ProcessorIMUt, check_Covariance)
 {
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
     data << 2, 0, 9.806, 0, 0, 0; // only acc_x, but measure gravity!
@@ -315,22 +315,22 @@ TEST_F(ProcessorIMUt, check_Covariance)
     cap_imu_ptr->setTimeStamp(0.1);
     sensor_ptr->process(cap_imu_ptr);
 
-    VectorXs delta_preint(problem->getProcessorMotion()->getMotion().delta_integr_);
-//    Matrix<wolf::Scalar,9,9> delta_preint_cov = problem->getProcessorMotion()->getCurrentDeltaPreintCov();
+    VectorXd delta_preint(problem->getProcessorMotion()->getMotion().delta_integr_);
+//    Matrix<double,9,9> delta_preint_cov = problem->getProcessorMotion()->getCurrentDeltaPreintCov();
 
     ASSERT_FALSE(delta_preint.isMuchSmallerThan(1, wolf::Constants::EPS_SMALL));
-//    ASSERT_MATRIX_APPROX(delta_preint_cov, MatrixXs::Zero(9,9), wolf::Constants::EPS_SMALL); // << "delta_preint_cov :\n" << delta_preint_cov; //covariances computed only at keyframe creation
+//    ASSERT_MATRIX_APPROX(delta_preint_cov, MatrixXd::Zero(9,9), wolf::Constants::EPS_SMALL); // << "delta_preint_cov :\n" << delta_preint_cov; //covariances computed only at keyframe creation
 }
 
 TEST_F(ProcessorIMUt, gyro_x)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 0, 0, 9.806, rate_of_turn, 0, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -338,10 +338,10 @@ TEST_F(ProcessorIMUt, gyro_x)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 0,0,0; // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);
@@ -353,7 +353,7 @@ TEST_F(ProcessorIMUt, gyro_x)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity());
 
         cap_imu_ptr->setTimeStamp(i*dt + dt); //first one will be 0.002 and last will be 1.000
@@ -368,16 +368,16 @@ TEST_F(ProcessorIMUt, gyro_x)
 TEST_F(ProcessorIMUt, gyro_x_biasedAbx)
 {
     // time
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
 
     // bias
-    wolf::Scalar abx = 0.002;
-    Vector6s bias; bias << abx,0,0,  0,0,0;
-    Vector3s acc_bias = bias.head(3);
+    double abx = 0.002;
+    Vector6d bias; bias << abx,0,0,  0,0,0;
+    Vector3d acc_bias = bias.head(3);
     // state
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
 
     // init things
     problem->setPrior(x0, P0, t, 0.01);
@@ -387,7 +387,7 @@ TEST_F(ProcessorIMUt, gyro_x_biasedAbx)
 //    WOLF_DEBUG("calib: ", cap_imu_ptr->getCalibration().transpose());
 
     // data
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << acc_bias - wolf::gravity(), rate_of_turn, 0, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -395,13 +395,13 @@ TEST_F(ProcessorIMUt, gyro_x_biasedAbx)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x_true(10);
+    VectorXd x_true(10);
     x_true << 0,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 0,0,0; // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180
 
-    VectorXs x_est(10);
+    VectorXd x_est(10);
     x_est = problem->getCurrentState().head(10);
 
     ASSERT_MATRIX_APPROX(x_est.transpose() , x_true.transpose(), wolf::Constants::EPS);
@@ -413,7 +413,7 @@ TEST_F(ProcessorIMUt, gyro_x_biasedAbx)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity()) + acc_bias;
 
         cap_imu_ptr->setTimeStamp(i*dt + dt); //first one will be 0.002 and last will be 1.000
@@ -428,20 +428,20 @@ TEST_F(ProcessorIMUt, gyro_x_biasedAbx)
 
 TEST_F(ProcessorIMUt, gyro_xy_biasedAbxy)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
-    wolf::Scalar abx(0.002), aby(0.01);
+    double abx(0.002), aby(0.01);
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    Vector6s bias; bias << abx,aby,0,  0,0,0;
-    Vector3s acc_bias = bias.head(3);
+    Vector6d bias; bias << abx,aby,0,  0,0,0;
+    Vector3d acc_bias = bias.head(3);
 
     problem->getProcessorMotion()->getOrigin()->setCalibration(bias);
     problem->getProcessorMotion()->getLast()->setCalibrationPreint(bias);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
 //    data << 0+abx, 0+aby, 9.806, rate_of_turn, rate_of_turn*1.5, 0; // measure gravity
     data << acc_bias - wolf::gravity(), rate_of_turn*1.5, 0, 0; // measure gravity
 
@@ -450,10 +450,10 @@ TEST_F(ProcessorIMUt, gyro_xy_biasedAbxy)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 0,0,0;//, abx,aby,0, 0,0,0;
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);// << "expected state : " << problem->getCurrentState().transpose()
@@ -466,7 +466,7 @@ TEST_F(ProcessorIMUt, gyro_xy_biasedAbxy)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity()) + acc_bias;
 
         cap_imu_ptr->setTimeStamp(i*dt + dt); //first one will be 0.002 and last will be 1.000
@@ -481,13 +481,13 @@ TEST_F(ProcessorIMUt, gyro_xy_biasedAbxy)
 
 TEST_F(ProcessorIMUt, gyro_z)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << -wolf::gravity(), 0, 0, rate_of_turn; // measure gravity!
 
     cap_imu_ptr->setData(data);
@@ -495,10 +495,10 @@ TEST_F(ProcessorIMUt, gyro_z)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 0,0,0; // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);
@@ -522,18 +522,18 @@ TEST_F(ProcessorIMUt, gyro_xyz)
 {
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    Vector3s tmp_vec; //will be used to store rate of turn data
-    Quaternions quat_comp(Quaternions::Identity());
-    Matrix3s R0(Matrix3s::Identity());
-    wolf::Scalar time = 0;
+    Vector3d tmp_vec; //will be used to store rate of turn data
+    Quaterniond quat_comp(Quaterniond::Identity());
+    Matrix3d R0(Matrix3d::Identity());
+    double time = 0;
     const unsigned int x_rot_vel = 5;
     const unsigned int y_rot_vel = 6;
     const unsigned int z_rot_vel = 13;
 
-    wolf::Scalar tmpx, tmpy, tmpz;
+    double tmpx, tmpy, tmpz;
     
     /*
         ox oy oz evolution in degrees (for understanding) --> converted in rad
@@ -549,7 +549,7 @@ TEST_F(ProcessorIMUt, gyro_xyz)
         wz = pi*gamma*cos(gamma*t*pi/180)*pi/180;
      */
 
-     const wolf::Scalar dt = 0.001;
+     const double dt = 0.001;
 
     for(unsigned int data_iter = 0; data_iter <= 1000; data_iter ++)
     {   
@@ -564,7 +564,7 @@ TEST_F(ProcessorIMUt, gyro_xyz)
         quat_comp = quat_comp * wolf::v2q(tmp_vec*dt);
         R0 = R0 * wolf::v2R(tmp_vec*dt);
         // use processorIMU
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity()); //gravity measured
         data.tail(3) = tmp_vec;
 
@@ -582,16 +582,16 @@ TEST_F(ProcessorIMUt, gyro_xyz)
      */
 
      // validating that the quaternion composition and rotation matrix composition actually describe the same rotation.
-    Quaternions R2quat(wolf::v2q(wolf::R2v(R0)));
-    Vector4s quat_comp_vec((Vector4s() <<quat_comp.x(), quat_comp.y(), quat_comp.z(), quat_comp.w()).finished() );
-    Vector4s R2quat_vec((Vector4s() <<R2quat.x(), R2quat.y(), R2quat.z(), R2quat.w()).finished() );
+    Quaterniond R2quat(wolf::v2q(wolf::R2v(R0)));
+    Vector4d quat_comp_vec((Vector4d() <<quat_comp.x(), quat_comp.y(), quat_comp.z(), quat_comp.w()).finished() );
+    Vector4d R2quat_vec((Vector4d() <<R2quat.x(), R2quat.y(), R2quat.z(), R2quat.w()).finished() );
 
     ASSERT_MATRIX_APPROX(quat_comp_vec , R2quat_vec, wolf::Constants::EPS);// << "quat_comp_vec : " << quat_comp_vec.transpose() << "\n R2quat_vec : " << R2quat_vec.transpose() << std::endl;
 
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0,0,0, quat_comp.x(), quat_comp.y(), quat_comp.z(), quat_comp.w(), 0,0,0;
 
-    Quaternions result_quat(problem->getCurrentState().data() + 3);
+    Quaterniond result_quat(problem->getCurrentState().data() + 3);
     //std::cout << "final orientation : " << wolf::q2v(result_quat).transpose() << std::endl;
 
     //check position part
@@ -606,13 +606,13 @@ TEST_F(ProcessorIMUt, gyro_xyz)
 
 TEST_F(ProcessorIMUt, gyro_z_ConstVelocity)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  2,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << -wolf::gravity(), 0, 0, rate_of_turn; // measure gravity!
 
     cap_imu_ptr->setData(data);
@@ -620,10 +620,10 @@ TEST_F(ProcessorIMUt, gyro_z_ConstVelocity)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     x << 0.002,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 2,0,0; // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180, 2m/s * 0.001s = 0.002m
 
     ASSERT_MATRIX_APPROX(problem->getCurrentState().head(10) , x, wolf::Constants::EPS_SMALL);
@@ -645,13 +645,13 @@ TEST_F(ProcessorIMUt, gyro_z_ConstVelocity)
 
 TEST_F(ProcessorIMUt, gyro_x_ConstVelocity)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  2,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 0, 0, 9.806, rate_of_turn, 0, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -659,10 +659,10 @@ TEST_F(ProcessorIMUt, gyro_x_ConstVelocity)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180, 2m/s * 0.001s = 0.002
     x << 0.002,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 2,0,0;
 
@@ -675,7 +675,7 @@ TEST_F(ProcessorIMUt, gyro_x_ConstVelocity)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity());
 
         cap_imu_ptr->setTimeStamp(i*dt + dt); //first one will be 0.002 and last will be 1.000
@@ -689,13 +689,13 @@ TEST_F(ProcessorIMUt, gyro_x_ConstVelocity)
 
 TEST_F(ProcessorIMUt, gyro_xy_ConstVelocity)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  2,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 0, 0, 9.806, 0, rate_of_turn, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -703,10 +703,10 @@ TEST_F(ProcessorIMUt, gyro_xy_ConstVelocity)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180, 2m/s * 0.001s = 0.002
     x << 0.002,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 2,0,0;
 
@@ -719,7 +719,7 @@ TEST_F(ProcessorIMUt, gyro_xy_ConstVelocity)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity());
 
         cap_imu_ptr->setTimeStamp(i*dt + dt); //first one will be 0.002 and last will be 1.000
@@ -733,13 +733,13 @@ TEST_F(ProcessorIMUt, gyro_xy_ConstVelocity)
 
 TEST_F(ProcessorIMUt, gyro_y_ConstVelocity)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  2,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 0, 0, 9.806, 0, rate_of_turn, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -747,10 +747,10 @@ TEST_F(ProcessorIMUt, gyro_y_ConstVelocity)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180, 2m/s * 0.001s = 0.002
     x << 0.002,0,0, quat_comp.x(),quat_comp.y(),quat_comp.z(),quat_comp.w(), 2,0,0;
 
@@ -763,7 +763,7 @@ TEST_F(ProcessorIMUt, gyro_y_ConstVelocity)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity());
 
         cap_imu_ptr->setTimeStamp(i*dt + dt); //first one will be 0.002 and last will be 1.000
@@ -779,18 +779,18 @@ TEST_F(ProcessorIMUt, gyro_xyz_ConstVelocity)
 {
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  2,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    Vector3s tmp_vec; //will be used to store rate of turn data
-    Quaternions quat_comp(Quaternions::Identity());
-    Matrix3s R0(Matrix3s::Identity());
-    wolf::Scalar time = 0;
+    Vector3d tmp_vec; //will be used to store rate of turn data
+    Quaterniond quat_comp(Quaterniond::Identity());
+    Matrix3d R0(Matrix3d::Identity());
+    double time = 0;
     const unsigned int x_rot_vel = 5;
     const unsigned int y_rot_vel = 6;
     const unsigned int z_rot_vel = 13;
 
-    wolf::Scalar tmpx, tmpy, tmpz;
+    double tmpx, tmpy, tmpz;
     
     /*
         ox oy oz evolution in degrees (for understanding) --> converted in rad
@@ -806,7 +806,7 @@ TEST_F(ProcessorIMUt, gyro_xyz_ConstVelocity)
         wz = pi*gamma*cos(gamma*t*pi/180)*pi/180;
      */
 
-     const wolf::Scalar dt = 0.001;
+     const double dt = 0.001;
 
     for(unsigned int data_iter = 0; data_iter < 1000; data_iter ++)
     {   
@@ -821,7 +821,7 @@ TEST_F(ProcessorIMUt, gyro_xyz_ConstVelocity)
         quat_comp = quat_comp * wolf::v2q(tmp_vec*dt);
         R0 = R0 * wolf::v2R(tmp_vec*dt);
         // use processorIMU
-        Quaternions rot(problem->getCurrentState().data()+3);
+        Quaterniond rot(problem->getCurrentState().data()+3);
         data.head(3) =  rot.conjugate() * (- wolf::gravity()); //gravity measured
         data.tail(3) = tmp_vec;
 
@@ -839,17 +839,17 @@ TEST_F(ProcessorIMUt, gyro_xyz_ConstVelocity)
      */
 
      // validating that the quaternion composition and rotation matrix composition actually describe the same rotation.
-    Quaternions R2quat(wolf::v2q(wolf::R2v(R0)));
-    Vector4s quat_comp_vec((Vector4s() <<quat_comp.x(), quat_comp.y(), quat_comp.z(), quat_comp.w()).finished() );
-    Vector4s R2quat_vec((Vector4s() <<R2quat.x(), R2quat.y(), R2quat.z(), R2quat.w()).finished() );
+    Quaterniond R2quat(wolf::v2q(wolf::R2v(R0)));
+    Vector4d quat_comp_vec((Vector4d() <<quat_comp.x(), quat_comp.y(), quat_comp.z(), quat_comp.w()).finished() );
+    Vector4d R2quat_vec((Vector4d() <<R2quat.x(), R2quat.y(), R2quat.z(), R2quat.w()).finished() );
 
     ASSERT_MATRIX_APPROX(quat_comp_vec , R2quat_vec, wolf::Constants::EPS); // << "quat_comp_vec : " << quat_comp_vec.transpose() << "\n R2quat_vec : " << R2quat_vec.transpose() << std::endl;
 
-    VectorXs x(10);
+    VectorXd x(10);
     //rotation + translation due to initial velocity
     x << 2,0,0, quat_comp.x(), quat_comp.y(), quat_comp.z(), quat_comp.w(), 2,0,0;
 
-    Quaternions result_quat(problem->getCurrentState().data() + 3);
+    Quaterniond result_quat(problem->getCurrentState().data() + 3);
     //std::cout << "final orientation : " << wolf::q2v(result_quat).transpose() << std::endl;
 
     //check position part
@@ -865,13 +865,13 @@ TEST_F(ProcessorIMUt, gyro_xyz_ConstVelocity)
 
 TEST_F(ProcessorIMUt, gyro_x_acc_x)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 1, 0, -wolf::gravity()(2), rate_of_turn, 0, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -879,10 +879,10 @@ TEST_F(ProcessorIMUt, gyro_x_acc_x)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180 on x axis
     // translation with constant acc : 1 m/s^2 for 0.001 second. Initial velocity : 0, p = 0.5*a*dt^2 + v*dt = 0.5*1*0.001^2 = 0.0000005 on x axis
     // v = a*dt = 0.001
@@ -898,8 +898,8 @@ TEST_F(ProcessorIMUt, gyro_x_acc_x)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
-        data.head(3) =  rot.conjugate() * (- wolf::gravity()) + (Vector3s()<<1,0,0).finished();
+        Quaterniond rot(problem->getCurrentState().data()+3);
+        data.head(3) =  rot.conjugate() * (- wolf::gravity()) + (Vector3d()<<1,0,0).finished();
 
         cap_imu_ptr->setTimeStamp(i*dt); //first one will be 0.002 and last will be 1.000
         cap_imu_ptr->setData(data);
@@ -914,13 +914,13 @@ TEST_F(ProcessorIMUt, gyro_x_acc_x)
 
 TEST_F(ProcessorIMUt, gyro_y_acc_y)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 0, 1, -wolf::gravity()(2), 0, rate_of_turn, 0; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -928,10 +928,10 @@ TEST_F(ProcessorIMUt, gyro_y_acc_y)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180 on y axis
     // translation with constant acc : 1 m/s^2 for 0.001 second. Initial velocity : 0, p = 0.5*a*dt^2 + v*dt = 0.5*1*0.001^2 = 0.0000005 on y axis
     // v = a*dt = 0.001
@@ -947,8 +947,8 @@ TEST_F(ProcessorIMUt, gyro_y_acc_y)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
-        data.head(3) =  rot.conjugate() * (- wolf::gravity()) + (Vector3s()<<0,1,0).finished();
+        Quaterniond rot(problem->getCurrentState().data()+3);
+        data.head(3) =  rot.conjugate() * (- wolf::gravity()) + (Vector3d()<<0,1,0).finished();
 
         cap_imu_ptr->setTimeStamp(i*dt); //first one will be 0.002 and last will be 1.000
         cap_imu_ptr->setData(data);
@@ -963,13 +963,13 @@ TEST_F(ProcessorIMUt, gyro_y_acc_y)
 
 TEST_F(ProcessorIMUt, gyro_z_acc_z)
 {
-    wolf::Scalar dt(0.001);
+    double dt(0.001);
     t.set(0); // clock in 0,1 ms ticks
     x0 << 0,0,0,  0,0,0,1,  0,0,0;
-    MatrixXs P0(9,9); P0.setIdentity();
+    MatrixXd P0(9,9); P0.setIdentity();
     problem->setPrior(x0, P0, t, 0.01);
 
-    wolf::Scalar rate_of_turn = 5 * M_PI/180.0;
+    double rate_of_turn = 5 * M_PI/180.0;
     data << 0, 0, -wolf::gravity()(2) + 1, 0, 0, rate_of_turn; // measure gravity
 
     cap_imu_ptr->setData(data);
@@ -977,10 +977,10 @@ TEST_F(ProcessorIMUt, gyro_z_acc_z)
     sensor_ptr->process(cap_imu_ptr);
 
     // Expected state after one integration
-    Quaternions quat_comp(Quaternions::Identity());
+    Quaterniond quat_comp(Quaterniond::Identity());
     quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-    VectorXs x(10);
+    VectorXd x(10);
     // rotated at 5 deg/s for 0.001s = 0.005 deg => 0.005 * M_PI/180 on z axis
     // translation with constant acc : 1 m/s^2 for 0.001 second. Initial velocity : 0, p = 0.5*a*dt^2 + v*dt = 0.5*1*0.001^2 = 0.0000005 on z axis
     // v = a*dt = 0.001
@@ -995,8 +995,8 @@ TEST_F(ProcessorIMUt, gyro_z_acc_z)
         // quaternion composition
         quat_comp = quat_comp * wolf::v2q(data.tail(3)*dt);
 
-        Quaternions rot(problem->getCurrentState().data()+3);
-        data.head(3) =  rot.conjugate() * (- wolf::gravity()) + (Vector3s()<<0,0,1).finished();
+        Quaterniond rot(problem->getCurrentState().data()+3);
+        data.head(3) =  rot.conjugate() * (- wolf::gravity()) + (Vector3d()<<0,0,1).finished();
 
         cap_imu_ptr->setTimeStamp(i*dt); //first one will be 0.002 and last will be 1.000
         cap_imu_ptr->setData(data);
diff --git a/test/gtest_processor_IMU_jacobians.cpp b/test/gtest_processor_IMU_jacobians.cpp
index 422972ea078fc1cce80297009e7d2e4edbf9e243..19a7b783fbb6bc99ca5710ccb52253a02185d335 100644
--- a/test/gtest_processor_IMU_jacobians.cpp
+++ b/test/gtest_processor_IMU_jacobians.cpp
@@ -32,37 +32,37 @@ class ProcessorIMU_jacobians : public testing::Test
 {
     public:
         TimeStamp t;
-        Eigen::Vector6s data_;
-        Eigen::Matrix<wolf::Scalar,10,1> Delta0;
-        wolf::Scalar ddelta_bias;
-        wolf::Scalar dt;
-        Eigen::Matrix<wolf::Scalar,9,1> Delta_noise;
-        Eigen::Matrix<wolf::Scalar,9,1> delta_noise;
+        Eigen::Vector6d data_;
+        Eigen::Matrix<double,10,1> Delta0;
+        double ddelta_bias;
+        double dt;
+        Eigen::Matrix<double,9,1> Delta_noise;
+        Eigen::Matrix<double,9,1> delta_noise;
         struct IMU_jac_bias bias_jac;
         struct IMU_jac_deltas deltas_jac;
 
-        void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq0, Eigen::Map<Eigen::Quaternions>& _dq0){
+        void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq0, Eigen::Map<Eigen::Quaterniond>& _dq0){
 
-            new (&_Dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta0_.data() + 3);
-            new (&_dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta0_.data() + 3);
+            new (&_Dq0) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.Delta0_.data() + 3);
+            new (&_dq0) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.delta0_.data() + 3);
         }
 
-        void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq, Eigen::Map<Eigen::Quaternions>& _dq, const int& place ){
+        void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq, Eigen::Map<Eigen::Quaterniond>& _dq, const int& place ){
     
             assert(place < _jac_delta.Delta_noisy_vect_.size());
-            new (&_Dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
-            new (&_dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta_noisy_vect_(place).data() + 3);
+            new (&_Dq) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
+            new (&_dq) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.delta_noisy_vect_(place).data() + 3);
         }
 
     virtual void SetUp()
     {
         //SetUp for jacobians 
-        wolf::Scalar deg_to_rad = M_PI/180.0;
+        double deg_to_rad = M_PI/180.0;
         data_ << 10,0.5,3, 100*deg_to_rad,110*deg_to_rad,30*deg_to_rad;
 
         // Wolf problem
         ProblemPtr wolf_problem_ptr_ = Problem::create("POV", 3);
-        Eigen::VectorXs IMU_extrinsics(7);
+        Eigen::VectorXd IMU_extrinsics(7);
         IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
 
         ProcessorIMU_UnitTester processor_imu;
@@ -70,14 +70,14 @@ class ProcessorIMU_jacobians : public testing::Test
         dt = 0.001;
 
         //defining a random Delta to begin with (not to use Origin point)
-        Eigen::Matrix<wolf::Scalar,10,1> Delta0;
-        Delta0 = Eigen::Matrix<wolf::Scalar,10,1>::Random();
+        Eigen::Matrix<double,10,1> Delta0;
+        Delta0 = Eigen::Matrix<double,10,1>::Random();
         Delta0.head<3>() = Delta0.head<3>()*100;
         Delta0.tail<3>() = Delta0.tail<3>()*10;
-        Eigen::Vector3s ang0, ang;
+        Eigen::Vector3d ang0, ang;
         ang0 << 120.08*deg_to_rad, 12.36*deg_to_rad, 54.32*deg_to_rad; 
 
-        Eigen::Map<Eigen::Quaternions> Delta0_quat(Delta0.data()+3);
+        Eigen::Map<Eigen::Quaterniond> Delta0_quat(Delta0.data()+3);
         Delta0_quat = v2q(ang0);
         Delta0_quat.normalize();
         ang = q2v(Delta0_quat);
@@ -114,34 +114,34 @@ class ProcessorIMU_jacobians_Dq : public testing::Test
 {
     public:
         TimeStamp t;
-        Eigen::Vector6s data_;
-        Eigen::Matrix<wolf::Scalar,10,1> Delta0;
-        wolf::Scalar ddelta_bias2;
-        wolf::Scalar dt;
+        Eigen::Vector6d data_;
+        Eigen::Matrix<double,10,1> Delta0;
+        double ddelta_bias2;
+        double dt;
         struct IMU_jac_bias bias_jac2;
 
-        void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq0, Eigen::Map<Eigen::Quaternions>& _dq0){
+        void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq0, Eigen::Map<Eigen::Quaterniond>& _dq0){
 
-            new (&_Dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta0_.data() + 3);
-            new (&_dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta0_.data() + 3);
+            new (&_Dq0) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.Delta0_.data() + 3);
+            new (&_dq0) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.delta0_.data() + 3);
         }
 
-        void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq, Eigen::Map<Eigen::Quaternions>& _dq, const int& place ){
+        void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaterniond>& _Dq, Eigen::Map<Eigen::Quaterniond>& _dq, const int& place ){
     
             assert(place < _jac_delta.Delta_noisy_vect_.size());
-            new (&_Dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
-            new (&_dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta_noisy_vect_(place).data() + 3);
+            new (&_Dq) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
+            new (&_dq) Eigen::Map<const Eigen::Quaterniond>(_jac_delta.delta_noisy_vect_(place).data() + 3);
         }
 
     virtual void SetUp()
     {
         //SetUp for jacobians 
-        wolf::Scalar deg_to_rad = M_PI/180.0;
+        double deg_to_rad = M_PI/180.0;
         data_ << 10,0.5,3, 100*deg_to_rad,110*deg_to_rad,30*deg_to_rad;
 
         // Wolf problem
         ProblemPtr wolf_problem_ptr_ = Problem::create("POV", 3);
-        Eigen::VectorXs IMU_extrinsics(7);
+        Eigen::VectorXd IMU_extrinsics(7);
         IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
 
         ProcessorIMU_UnitTester processor_imu;
@@ -149,14 +149,14 @@ class ProcessorIMU_jacobians_Dq : public testing::Test
         dt = 0.001;
 
         //defining a random Delta to begin with (not to use Origin point)
-        Eigen::Matrix<wolf::Scalar,10,1> Delta0;
-        Delta0 = Eigen::Matrix<wolf::Scalar,10,1>::Random();
+        Eigen::Matrix<double,10,1> Delta0;
+        Delta0 = Eigen::Matrix<double,10,1>::Random();
         Delta0.head<3>() = Delta0.head<3>()*100;
         Delta0.tail<3>() = Delta0.tail<3>()*10;
-        Eigen::Vector3s ang0, ang;
+        Eigen::Vector3d ang0, ang;
         ang0 << 120.08*deg_to_rad, 12.36*deg_to_rad, 54.32*deg_to_rad; 
 
-        Eigen::Map<Eigen::Quaternions> Delta0_quat(Delta0.data()+3);
+        Eigen::Map<Eigen::Quaterniond> Delta0_quat(Delta0.data()+3);
         Delta0_quat = v2q(ang0);
         Delta0_quat.normalize();
         ang = q2v(Delta0_quat);
@@ -218,7 +218,7 @@ class ProcessorIMU_jacobians_Dq : public testing::Test
 TEST_F(ProcessorIMU_jacobians, dDp_dab)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDp_dab;
+    Eigen::Matrix3d dDp_dab;
 
     for(int i=0;i<3;i++)
          dDp_dab.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i).head(3) - bias_jac.Delta0_.head(3))/ddelta_bias;
@@ -230,7 +230,7 @@ TEST_F(ProcessorIMU_jacobians, dDp_dab)
 TEST_F(ProcessorIMU_jacobians, dDv_dab)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDv_dab;
+    Eigen::Matrix3d dDv_dab;
 
     for(int i=0;i<3;i++)
          dDv_dab.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i).tail(3) - bias_jac.Delta0_.tail(3))/ddelta_bias;
@@ -242,7 +242,7 @@ TEST_F(ProcessorIMU_jacobians, dDv_dab)
 TEST_F(ProcessorIMU_jacobians, dDp_dwb)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDp_dwb;
+    Eigen::Matrix3d dDp_dwb;
 
     for(int i=0;i<3;i++)
          dDp_dwb.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i+3).head(3) - bias_jac.Delta0_.head(3))/ddelta_bias;
@@ -254,7 +254,7 @@ TEST_F(ProcessorIMU_jacobians, dDp_dwb)
 TEST_F(ProcessorIMU_jacobians, dDv_dwb_)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDv_dwb;
+    Eigen::Matrix3d dDv_dwb;
 
     for(int i=0;i<3;i++)
          dDv_dwb.block<3,1>(0,i) = (bias_jac.Deltas_noisy_vect_(i+3).tail(3) - bias_jac.Delta0_.tail(3))/ddelta_bias;
@@ -266,12 +266,12 @@ TEST_F(ProcessorIMU_jacobians, dDv_dwb_)
 TEST_F(ProcessorIMU_jacobians, dDq_dab)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> q_in_1(NULL), q_in_2(NULL);
-    Eigen::Matrix3s dDq_dab;
+    Eigen::Map<Eigen::Quaterniond> q_in_1(NULL), q_in_2(NULL);
+    Eigen::Matrix3d dDq_dab;
 
-    new (&q_in_1) Eigen::Map<Eigen::Quaternions>(bias_jac.Delta0_.data() + 3);
+    new (&q_in_1) Eigen::Map<Eigen::Quaterniond>(bias_jac.Delta0_.data() + 3);
     for(int i=0;i<3;i++){
-        new (&q_in_2) Eigen::Map<Eigen::Quaternions>(bias_jac.Deltas_noisy_vect_(i).data() + 3);
+        new (&q_in_2) Eigen::Map<Eigen::Quaterniond>(bias_jac.Deltas_noisy_vect_(i).data() + 3);
         dDq_dab.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias;
     }
 
@@ -281,13 +281,13 @@ TEST_F(ProcessorIMU_jacobians, dDq_dab)
 TEST_F(ProcessorIMU_jacobians, dDq_dwb_noise_1Em8_)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> q_in_1(NULL), q_in_2(NULL);
-    Eigen::Matrix3s dDq_dwb;
+    Eigen::Map<Eigen::Quaterniond> q_in_1(NULL), q_in_2(NULL);
+    Eigen::Matrix3d dDq_dwb;
 
-    new (&q_in_1) Eigen::Map<Eigen::Quaternions>(bias_jac.Delta0_.data() + 3);
+    new (&q_in_1) Eigen::Map<Eigen::Quaterniond>(bias_jac.Delta0_.data() + 3);
 
     for(int i=0;i<3;i++){
-        new (&q_in_2) Eigen::Map<Eigen::Quaternions>(bias_jac.Deltas_noisy_vect_(i+3).data() + 3);
+        new (&q_in_2) Eigen::Map<Eigen::Quaterniond>(bias_jac.Deltas_noisy_vect_(i+3).data() + 3);
 
         dDq_dwb.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias;
     }
@@ -303,12 +303,12 @@ TEST_F(ProcessorIMU_jacobians, dDq_dwb_noise_1Em8_)
 TEST_F(ProcessorIMU_jacobians_Dq, dDq_dwb_noise_1Em4_precision_1Em3_)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> q_in_1(NULL), q_in_2(NULL);
-    Eigen::Matrix3s dDq_dwb;
+    Eigen::Map<Eigen::Quaterniond> q_in_1(NULL), q_in_2(NULL);
+    Eigen::Matrix3d dDq_dwb;
 
-    new (&q_in_1) Eigen::Map<Eigen::Quaternions>(bias_jac2.Delta0_.data() + 3);
+    new (&q_in_1) Eigen::Map<Eigen::Quaterniond>(bias_jac2.Delta0_.data() + 3);
     for(int i=0;i<3;i++){
-        new (&q_in_2) Eigen::Map<Eigen::Quaternions>(bias_jac2.Deltas_noisy_vect_(i+3).data() + 3);
+        new (&q_in_2) Eigen::Map<Eigen::Quaterniond>(bias_jac2.Deltas_noisy_vect_(i+3).data() + 3);
         dDq_dwb.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias2;
     }
 
@@ -397,7 +397,7 @@ TEST_F(ProcessorIMU_jacobians_Dq, dDq_dwb_noise_1Em4_precision_1Em3_)
 TEST_F(ProcessorIMU_jacobians, dDp_dP)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDp_dP;
+    Eigen::Matrix3d dDp_dP;
 
     //dDp_dPx = ((P + dPx) - P)/dPx
     for(int i=0;i<3;i++)
@@ -410,7 +410,7 @@ TEST_F(ProcessorIMU_jacobians, dDp_dP)
 TEST_F(ProcessorIMU_jacobians, dDp_dV)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDp_dV;
+    Eigen::Matrix3d dDp_dV;
 
     //Dp_dVx = ((V + dVx)*dt - V*dt)/dVx
     for(int i=0;i<3;i++)
@@ -423,8 +423,8 @@ TEST_F(ProcessorIMU_jacobians, dDp_dV)
 TEST_F(ProcessorIMU_jacobians, dDp_dO)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
-    Eigen::Matrix3s dDp_dO;
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
+    Eigen::Matrix3d dDp_dO;
 
     //dDp_dOx = (( dR(Theta) * exp(dThetax,0,0)*dp ) - ( dR(Theta)*dp ))/dThetax
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
@@ -440,7 +440,7 @@ TEST_F(ProcessorIMU_jacobians, dDp_dO)
 TEST_F(ProcessorIMU_jacobians, dDv_dV)
 {
     using namespace wolf;
-    Eigen::Matrix3s dDv_dV;
+    Eigen::Matrix3d dDv_dV;
 
     //dDv_dVx = ((V + dVx) - V)/dVx
     for(int i=0;i<3;i++)
@@ -453,8 +453,8 @@ TEST_F(ProcessorIMU_jacobians, dDv_dV)
 TEST_F(ProcessorIMU_jacobians, dDv_dO)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
-    Eigen::Matrix3s dDv_dO;
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
+    Eigen::Matrix3d dDv_dO;
 
     //dDv_dOx = (( dR(Theta) * exp(dThetax,0,0)*dv ) - ( dR(Theta)*dv ))/dThetax
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
@@ -472,8 +472,8 @@ TEST_F(ProcessorIMU_jacobians, dDv_dO)
 TEST_F(ProcessorIMU_jacobians, dDo_dO)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
-    Eigen::Matrix3s dDo_dO;
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
+    Eigen::Matrix3d dDo_dO;
 
     //dDo_dOx = log( (dR(Theta) * dr(theta)).transpose() * (dR(Theta)*exp(dThetax,0,0)) * dr(theta) )/dThetax
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
@@ -489,8 +489,8 @@ TEST_F(ProcessorIMU_jacobians, dDo_dO)
 TEST_F(ProcessorIMU_jacobians, dDp_dp)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL), dq0(NULL);
-    Eigen::Matrix3s dDp_dp, dDp_dp_a;
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL), dq0(NULL);
+    Eigen::Matrix3d dDp_dp, dDp_dp_a;
 
     dDp_dp_a = deltas_jac.jacobian_delta_.block(0,0,3,3);
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
@@ -507,8 +507,8 @@ TEST_F(ProcessorIMU_jacobians, dDp_dp)
 TEST_F(ProcessorIMU_jacobians, dDv_dv)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL), dq0(NULL);
-    Eigen::Matrix3s dDv_dv, dDv_dv_a;
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL), dq0(NULL);
+    Eigen::Matrix3d dDv_dv, dDv_dv_a;
 
     dDv_dv_a = deltas_jac.jacobian_delta_.block(6,6,3,3);
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
@@ -525,8 +525,8 @@ TEST_F(ProcessorIMU_jacobians, dDv_dv)
 TEST_F(ProcessorIMU_jacobians, dDo_do)
 {
     using namespace wolf;
-    Eigen::Map<Eigen::Quaternions> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
-    Eigen::Matrix3s dDo_do, dDo_do_a;
+    Eigen::Map<Eigen::Quaterniond> Dq0(NULL), dq0(NULL), Dq_noisy(NULL), dq_noisy(NULL);
+    Eigen::Matrix3d dDo_do, dDo_do_a;
 
     //dDo_dox = log( (dR(Theta) * dr(theta)).transpose() * dR(Theta) * (dr(theta)*exp(dthetax,0,0)) )/dthetax
     remapJacDeltas_quat0(deltas_jac, Dq0, dq0);
diff --git a/test/processor_IMU_UnitTester.h b/test/processor_IMU_UnitTester.h
index c352a33648f354ad06118e6be02c50d6c965d104..ccfc60fd4579b33786990d1ca2c888920c12a15a 100644
--- a/test/processor_IMU_UnitTester.h
+++ b/test/processor_IMU_UnitTester.h
@@ -9,13 +9,13 @@
 namespace wolf {
     struct IMU_jac_bias{ //struct used for checking jacobians by finite difference
 
-        IMU_jac_bias(Eigen::Matrix<Eigen::VectorXs,6,1> _Deltas_noisy_vect,
-                     Eigen::VectorXs _Delta0 ,
-                     Eigen::Matrix3s _dDp_dab,
-                     Eigen::Matrix3s _dDv_dab,
-                     Eigen::Matrix3s _dDp_dwb,
-                     Eigen::Matrix3s _dDv_dwb,
-                     Eigen::Matrix3s _dDq_dwb) :
+        IMU_jac_bias(Eigen::Matrix<Eigen::VectorXd,6,1> _Deltas_noisy_vect,
+                     Eigen::VectorXd _Delta0 ,
+                     Eigen::Matrix3d _dDp_dab,
+                     Eigen::Matrix3d _dDv_dab,
+                     Eigen::Matrix3d _dDp_dwb,
+                     Eigen::Matrix3d _dDv_dwb,
+                     Eigen::Matrix3d _dDq_dwb) :
                          Deltas_noisy_vect_(_Deltas_noisy_vect),
                          Delta0_(_Delta0) ,
                          dDp_dab_(_dDp_dab),
@@ -30,15 +30,15 @@ namespace wolf {
         IMU_jac_bias(){
 
             for (int i=0; i<6; i++){
-                Deltas_noisy_vect_(i) = Eigen::VectorXs::Zero(1,1);
+                Deltas_noisy_vect_(i) = Eigen::VectorXd::Zero(1,1);
             }
 
-            Delta0_ = Eigen::VectorXs::Zero(1,1);
-            dDp_dab_ = Eigen::Matrix3s::Zero();
-            dDv_dab_ = Eigen::Matrix3s::Zero();
-            dDp_dwb_ = Eigen::Matrix3s::Zero();
-            dDv_dwb_ = Eigen::Matrix3s::Zero();
-            dDq_dwb_ = Eigen::Matrix3s::Zero();
+            Delta0_ = Eigen::VectorXd::Zero(1,1);
+            dDp_dab_ = Eigen::Matrix3d::Zero();
+            dDv_dab_ = Eigen::Matrix3d::Zero();
+            dDp_dwb_ = Eigen::Matrix3d::Zero();
+            dDv_dwb_ = Eigen::Matrix3d::Zero();
+            dDq_dwb_ = Eigen::Matrix3d::Zero();
         }
 
         IMU_jac_bias(IMU_jac_bias const & toCopy){
@@ -57,13 +57,13 @@ namespace wolf {
               place 1 : added da_bx in data         place 2 : added da_by in data       place 3 : added da_bz in data
               place 4 : added dw_bx in data         place 5 : added dw_by in data       place 6 : added dw_bz in data
              */
-            Eigen::Matrix<Eigen::VectorXs,6,1> Deltas_noisy_vect_;
-            Eigen::VectorXs Delta0_;
-            Eigen::Matrix3s dDp_dab_;
-            Eigen::Matrix3s dDv_dab_;
-            Eigen::Matrix3s dDp_dwb_;
-            Eigen::Matrix3s dDv_dwb_;
-            Eigen::Matrix3s dDq_dwb_;
+            Eigen::Matrix<Eigen::VectorXd,6,1> Deltas_noisy_vect_;
+            Eigen::VectorXd Delta0_;
+            Eigen::Matrix3d dDp_dab_;
+            Eigen::Matrix3d dDv_dab_;
+            Eigen::Matrix3d dDp_dwb_;
+            Eigen::Matrix3d dDv_dwb_;
+            Eigen::Matrix3d dDq_dwb_;
 
         public:
             void copyfrom(IMU_jac_bias const& right){
@@ -80,12 +80,12 @@ namespace wolf {
 
     struct IMU_jac_deltas{
 
-        IMU_jac_deltas(Eigen::VectorXs _Delta0,
-                       Eigen::VectorXs _delta0,
-                       Eigen::Matrix<Eigen::VectorXs,9,1> _Delta_noisy_vect,
-                       Eigen::Matrix<Eigen::VectorXs,9,1> _delta_noisy_vect,
-                       Eigen::MatrixXs _jacobian_delta_preint,
-                       Eigen::MatrixXs _jacobian_delta ) :
+        IMU_jac_deltas(Eigen::VectorXd _Delta0,
+                       Eigen::VectorXd _delta0,
+                       Eigen::Matrix<Eigen::VectorXd,9,1> _Delta_noisy_vect,
+                       Eigen::Matrix<Eigen::VectorXd,9,1> _delta_noisy_vect,
+                       Eigen::MatrixXd _jacobian_delta_preint,
+                       Eigen::MatrixXd _jacobian_delta ) :
                            Delta0_(_Delta0),
                            delta0_(_delta0),
                            Delta_noisy_vect_(_Delta_noisy_vect),
@@ -98,14 +98,14 @@ namespace wolf {
 
         IMU_jac_deltas(){
             for (int i=0; i<9; i++){
-                Delta_noisy_vect_(i) = Eigen::VectorXs::Zero(1,1);
-                delta_noisy_vect_(i) = Eigen::VectorXs::Zero(1,1);
+                Delta_noisy_vect_(i) = Eigen::VectorXd::Zero(1,1);
+                delta_noisy_vect_(i) = Eigen::VectorXd::Zero(1,1);
             }
 
-            Delta0_ = Eigen::VectorXs::Zero(1,1);
-            delta0_ = Eigen::VectorXs::Zero(1,1);
-            jacobian_delta_preint_ = Eigen::MatrixXs::Zero(9,9);
-            jacobian_delta_ = Eigen::MatrixXs::Zero(9,9);
+            Delta0_ = Eigen::VectorXd::Zero(1,1);
+            delta0_ = Eigen::VectorXd::Zero(1,1);
+            jacobian_delta_preint_ = Eigen::MatrixXd::Zero(9,9);
+            jacobian_delta_ = Eigen::MatrixXd::Zero(9,9);
         }
 
         IMU_jac_deltas(IMU_jac_deltas const & toCopy){
@@ -128,12 +128,12 @@ namespace wolf {
                             4: +dOx, 5: +dOy, 6: +dOz                                                               4: + dox, 5: +doy, 6: +doz
                             7: +dVx, 8: +dVy, 9: +dVz                                                               7: + dvx, 9: +dvy, +: +dvz
              */
-            Eigen::VectorXs Delta0_; //this will contain the Delta not affected by noise
-            Eigen::VectorXs delta0_; //this will contain the delta not affected by noise
-            Eigen::Matrix<Eigen::VectorXs,9,1> Delta_noisy_vect_; //this will contain the Deltas affected by noises
-            Eigen::Matrix<Eigen::VectorXs,9,1> delta_noisy_vect_; //this will contain the deltas affected by noises
-            Eigen::MatrixXs jacobian_delta_preint_;
-            Eigen::MatrixXs jacobian_delta_;
+            Eigen::VectorXd Delta0_; //this will contain the Delta not affected by noise
+            Eigen::VectorXd delta0_; //this will contain the delta not affected by noise
+            Eigen::Matrix<Eigen::VectorXd,9,1> Delta_noisy_vect_; //this will contain the Deltas affected by noises
+            Eigen::Matrix<Eigen::VectorXd,9,1> delta_noisy_vect_; //this will contain the deltas affected by noises
+            Eigen::MatrixXd jacobian_delta_preint_;
+            Eigen::MatrixXd jacobian_delta_;
 
         public:
             void copyfrom(IMU_jac_deltas const& right){
@@ -161,10 +161,10 @@ namespace wolf {
             _dt : time interval between 2 IMU measurements
             da_b : bias noise to add - scalar because adding the same noise to each component of bias (abx, aby, abz, wbx, wby, wbz) one by one. 
          */
-        IMU_jac_bias finite_diff_ab(const Scalar _dt,
-                                    Eigen::Vector6s& _data,
-                                    const wolf::Scalar& da_b,
-                                    const Eigen::Matrix<wolf::Scalar,10,1>& _delta_preint0);
+        IMU_jac_bias finite_diff_ab(const double _dt,
+                                    Eigen::Vector6d& _data,
+                                    const double& da_b,
+                                    const Eigen::Matrix<double,10,1>& _delta_preint0);
 
         /* params :
             _data : input data vector (size 6 : ax,ay,az,wx,wy,wz)
@@ -172,11 +172,11 @@ namespace wolf {
             _Delta_noise : noise to add to Delta_preint (D1 in D = D1 + d), vector 9 because rotation expressed as a vector (R2v(q.matrix()))
             _delta_noise : noise to add to instantaneous delta (d in D = D1 + d), vector 9 because rotation expressed as a vector (R2v(q.matrix()))
          */
-        IMU_jac_deltas finite_diff_noise(const Scalar& _dt,
-                                         Eigen::Vector6s& _data,
-                                         const Eigen::Matrix<wolf::Scalar,9,1>& _Delta_noise,
-                                         const Eigen::Matrix<wolf::Scalar,9,1>& _delta_noise,
-                                         const Eigen::Matrix<wolf::Scalar,10,1>& _Delta0);
+        IMU_jac_deltas finite_diff_noise(const double& _dt,
+                                         Eigen::Vector6d& _data,
+                                         const Eigen::Matrix<double,9,1>& _Delta_noise,
+                                         const Eigen::Matrix<double,9,1>& _delta_noise,
+                                         const Eigen::Matrix<double,10,1>& _Delta0);
 
         public:
         static ProcessorBasePtr create(const std::string& _unique_name,
@@ -185,7 +185,7 @@ namespace wolf {
 
         public:
         // Maps quat, to be used as temporary
-        Eigen::Map<Eigen::Quaternions> Dq_out_;
+        Eigen::Map<Eigen::Quaterniond> Dq_out_;
 
     };
 
@@ -202,46 +202,46 @@ namespace wolf {
 namespace wolf{
 
     //Functions to test jacobians with finite difference method
-inline IMU_jac_bias ProcessorIMU_UnitTester::finite_diff_ab(const Scalar _dt,
-                                                            Eigen::Vector6s& _data,
-                                                            const wolf::Scalar& da_b,
-                                                            const Eigen::Matrix<wolf::Scalar,10,1>& _delta_preint0)
+inline IMU_jac_bias ProcessorIMU_UnitTester::finite_diff_ab(const double _dt,
+                                                            Eigen::Vector6d& _data,
+                                                            const double& da_b,
+                                                            const Eigen::Matrix<double,10,1>& _delta_preint0)
 {
     //TODO : need to use a reset function here to make sure jacobians have not been used before --> reset everything
     ///Define all the needed variables
-    Eigen::VectorXs Delta0;
-    Eigen::Matrix<Eigen::VectorXs,6,1> Deltas_noisy_vect;
-    Eigen::Vector6s data0;
+    Eigen::VectorXd Delta0;
+    Eigen::Matrix<Eigen::VectorXd,6,1> Deltas_noisy_vect;
+    Eigen::Vector6d data0;
     data0 = _data;
 
-    Eigen::MatrixXs data_cov;
-    Eigen::MatrixXs jacobian_delta_preint;
-    Eigen::MatrixXs jacobian_delta;
-    Eigen::VectorXs delta_preint_plus_delta0;
+    Eigen::MatrixXd data_cov;
+    Eigen::MatrixXd jacobian_delta_preint;
+    Eigen::MatrixXd jacobian_delta;
+    Eigen::VectorXd delta_preint_plus_delta0;
     data_cov.resize(6,6);
     jacobian_delta_preint.resize(9,9);
     jacobian_delta.resize(9,9);
     delta_preint_plus_delta0.resize(10);
 
     //set all variables to 0
-    data_cov = Eigen::MatrixXs::Zero(6,6);
-    jacobian_delta_preint = Eigen::MatrixXs::Zero(9,9);
-    jacobian_delta = Eigen::MatrixXs::Zero(9,9);
+    data_cov = Eigen::MatrixXd::Zero(6,6);
+    jacobian_delta_preint = Eigen::MatrixXd::Zero(9,9);
+    jacobian_delta = Eigen::MatrixXd::Zero(9,9);
     delta_preint_plus_delta0 << 0,0,0, 0,0,0,1 ,0,0,0; //PQV
 
-    Vector6s bias = Vector6s::Zero();
+    Vector6d bias = Vector6d::Zero();
 
     /*The following vectors will contain all the matrices and deltas needed to compute the finite differences.
         place 1 : added da_bx in data         place 2 : added da_by in data       place 3 : added da_bz in data
         place 4 : added dw_bx in data         place 5 : added dw_by in data       place 6 : added dw_bz in data
      */
 
-    Eigen::Matrix3s dDp_dab, dDv_dab, dDp_dwb, dDv_dwb, dDq_dwb;
+    Eigen::Matrix3d dDp_dab, dDv_dab, dDp_dwb, dDv_dwb, dDq_dwb;
 
     //Deltas without use of da_b
     computeCurrentDelta(_data, data_cov, bias, _dt,delta_,delta_cov_,jacobian_delta_calib_);
     deltaPlusDelta(_delta_preint0, delta_, _dt, delta_preint_plus_delta0, jacobian_delta_preint, jacobian_delta);
-    MatrixXs jacobian_bias = jacobian_delta * jacobian_delta_calib_;
+    MatrixXd jacobian_bias = jacobian_delta * jacobian_delta_calib_;
     Delta0 = delta_preint_plus_delta0; //this is the first preintegrated delta, not affected by any added bias noise
     dDp_dab = jacobian_bias.block(0,0,3,3);
     dDp_dwb = jacobian_bias.block(0,3,3,3);
@@ -254,7 +254,7 @@ inline IMU_jac_bias ProcessorIMU_UnitTester::finite_diff_ab(const Scalar _dt,
     for(int i=0; i<6; i++){
         //need to reset stuff here
         delta_preint_plus_delta0 << 0,0,0, 0,0,0,1 ,0,0,0;  //PQV
-        data_cov = Eigen::MatrixXs::Zero(6,6);
+        data_cov = Eigen::MatrixXd::Zero(6,6);
 
         // add da_b
         _data = data0;
@@ -269,38 +269,38 @@ inline IMU_jac_bias ProcessorIMU_UnitTester::finite_diff_ab(const Scalar _dt,
     return bias_jacobians;
 }
 
-inline IMU_jac_deltas ProcessorIMU_UnitTester::finite_diff_noise(const Scalar& _dt, Eigen::Vector6s& _data, const Eigen::Matrix<wolf::Scalar,9,1>& _Delta_noise, const Eigen::Matrix<wolf::Scalar,9,1>& _delta_noise, const Eigen::Matrix<wolf::Scalar,10,1>& _Delta0)
+inline IMU_jac_deltas ProcessorIMU_UnitTester::finite_diff_noise(const double& _dt, Eigen::Vector6d& _data, const Eigen::Matrix<double,9,1>& _Delta_noise, const Eigen::Matrix<double,9,1>& _delta_noise, const Eigen::Matrix<double,10,1>& _Delta0)
 {
     //we do not propagate any noise from data vector
-    Eigen::VectorXs Delta_; //will contain the preintegrated Delta affected by added noise
-    Eigen::VectorXs delta0; //will contain the delta not affected by added noise
+    Eigen::VectorXd Delta_; //will contain the preintegrated Delta affected by added noise
+    Eigen::VectorXd delta0; //will contain the delta not affected by added noise
     // delta_ that /will contain the delta affected by added noise is declared in processor_motion.h
-    Eigen::VectorXs delta_preint_plus_delta;
+    Eigen::VectorXd delta_preint_plus_delta;
     delta0.resize(10);
     delta_preint_plus_delta.resize(10);
     delta_preint_plus_delta << 0,0,0 ,0,0,0,1 ,0,0,0;
 
-    Eigen::MatrixXs jacobian_delta_preint;  //will be used as input for deltaPlusDelta
-    Eigen::MatrixXs jacobian_delta;         //will be used as input for deltaPlusDelta
+    Eigen::MatrixXd jacobian_delta_preint;  //will be used as input for deltaPlusDelta
+    Eigen::MatrixXd jacobian_delta;         //will be used as input for deltaPlusDelta
     jacobian_delta_preint.resize(9,9);
     jacobian_delta.resize(9,9);
     jacobian_delta_preint.setIdentity(9,9);
     jacobian_delta.setIdentity(9,9);
-    Eigen::MatrixXs jacobian_delta_preint0; //will contain the jacobian we want to check
-    Eigen::MatrixXs jacobian_delta0;        //will contain the jacobian we want to check
+    Eigen::MatrixXd jacobian_delta_preint0; //will contain the jacobian we want to check
+    Eigen::MatrixXd jacobian_delta0;        //will contain the jacobian we want to check
     jacobian_delta_preint0.resize(9,9);
     jacobian_delta0.resize(9,9);
     jacobian_delta_preint0.setIdentity(9,9);
     jacobian_delta0.setIdentity(9,9);
 
-    Eigen::MatrixXs data_cov;   //will be used filled with Zeros as input for data2delta
+    Eigen::MatrixXd data_cov;   //will be used filled with Zeros as input for data2delta
     data_cov.resize(6,6);
-    data_cov = Eigen::MatrixXs::Zero(6,6);
+    data_cov = Eigen::MatrixXd::Zero(6,6);
 
-    Eigen::Matrix<Eigen::VectorXs,9,1> Delta_noisy_vect; //this will contain the Deltas affected by noises
-    Eigen::Matrix<Eigen::VectorXs,9,1> delta_noisy_vect; //this will contain the deltas affected by noises
+    Eigen::Matrix<Eigen::VectorXd,9,1> Delta_noisy_vect; //this will contain the Deltas affected by noises
+    Eigen::Matrix<Eigen::VectorXd,9,1> delta_noisy_vect; //this will contain the deltas affected by noises
 
-    Vector6s bias = Vector6s::Zero();
+    Vector6d bias = Vector6d::Zero();
 
     computeCurrentDelta(_data, data_cov, bias,_dt,delta_,delta_cov_,jacobian_delta_calib_); //Affects dp_out, dv_out and dq_out
     delta0 = delta_;        //save the delta that is not affected by noise
@@ -330,10 +330,10 @@ inline IMU_jac_deltas ProcessorIMU_UnitTester::finite_diff_noise(const Scalar& _
     {   
         //PQV formulation
         //fist we need to reset some stuff
-        Eigen::Vector3s dtheta = Eigen::Vector3s::Zero();
+        Eigen::Vector3d dtheta = Eigen::Vector3d::Zero();
 
         delta_ = delta0;
-        new (&Dq_out_) Map<Quaternions>(delta_.data() + 3); //not sure that we need this
+        new (&Dq_out_) Map<Quaterniond>(delta_.data() + 3); //not sure that we need this
         dtheta(i) +=  _delta_noise(i+3); //introduce perturbation
         Dq_out_ = Dq_out_ * v2q(dtheta);
         delta_noisy_vect(i+3) = delta_;
@@ -360,10 +360,10 @@ inline IMU_jac_deltas ProcessorIMU_UnitTester::finite_diff_noise(const Scalar& _
     for(int i=0; i<3; i++) //for noise dtheta, it is in SO3, need to work on quaternions
     {
         //fist we need to reset some stuff
-        Eigen::Vector3s dtheta = Eigen::Vector3s::Zero();
+        Eigen::Vector3d dtheta = Eigen::Vector3d::Zero();
 
         Delta_ = _Delta0;
-        new (&Dq_out_) Map<Quaternions>(Delta_.data() + 3);
+        new (&Dq_out_) Map<Quaterniond>(Delta_.data() + 3);
         dtheta(i) += _Delta_noise(i+3); //introduce perturbation
         Dq_out_ = Dq_out_ * v2q(dtheta);
         Delta_noisy_vect(i+3) = Delta_;