diff --git a/src/test/gtest_constraint_autodiff.cpp b/src/test/gtest_constraint_autodiff.cpp
index 7cb92bbc56cfdb256c46ffc90e9b90946422ede7..52b5d1c121987779fb20661319f5b8f1a27fd8ad 100644
--- a/src/test/gtest_constraint_autodiff.cpp
+++ b/src/test/gtest_constraint_autodiff.cpp
@@ -12,6 +12,7 @@
 #include "capture_void.h"
 #include "feature_odom_2D.h"
 #include "constraint_odom_2D.h"
+#include "constraint_odom_2D_analytic.h"
 #include "constraint_autodiff.h"
 
 using namespace wolf;
@@ -122,23 +123,27 @@ TEST(CaptureAutodiff, JacobianOdom2d)
     J0 << -cos(f1_pose(2)), -sin(f1_pose(2)),
            sin(f1_pose(2)), -cos(f1_pose(2)),
            0,                0;
-    ASSERT_TRUE((J0-Jauto[0]).maxCoeff() < 1e-9 && (J0-Jauto[0]).minCoeff() > -1e-9);
+    ASSERT_MATRIX_APPROX(J0, Jauto[0], wolf::Constants::EPS);
+    //ASSERT_TRUE((J0-Jauto[0]).maxCoeff() < 1e-9 && (J0-Jauto[0]).minCoeff() > -1e-9);
 
     Eigen::MatrixXs J1(3,1);
     J1 << -(f2_pose(0) - f1_pose(0)) * sin(f1_pose(2)) + (f2_pose(1) - f1_pose(1)) * cos(f1_pose(2)),
           -(f2_pose(0) - f1_pose(0)) * cos(f1_pose(2)) - (f2_pose(1) - f1_pose(1)) * sin(f1_pose(2)),
           -1;
-    ASSERT_TRUE((J1-Jauto[1]).maxCoeff() < 1e-9 && (J1-Jauto[1]).minCoeff() > -1e-9);
+    ASSERT_MATRIX_APPROX(J1, Jauto[1], wolf::Constants::EPS);
+    //ASSERT_TRUE((J1-Jauto[1]).maxCoeff() < 1e-9 && (J1-Jauto[1]).minCoeff() > -1e-9);
 
     Eigen::MatrixXs J2(3,2);
     J2 <<  cos(f1_pose(2)), sin(f1_pose(2)),
            -sin(f1_pose(2)), cos(f1_pose(2)),
            0,               0;
-    ASSERT_TRUE((J2-Jauto[2]).maxCoeff() < 1e-9 && (J2-Jauto[2]).minCoeff() > -1e-9);
+    ASSERT_MATRIX_APPROX(J2, Jauto[2], wolf::Constants::EPS);
+    //ASSERT_TRUE((J2-Jauto[2]).maxCoeff() < 1e-9 && (J2-Jauto[2]).minCoeff() > -1e-9);
 
     Eigen::MatrixXs J3(3,1);
     J3 <<  0, 0, 1;
-    ASSERT_TRUE((J3-Jauto[3]).maxCoeff() < 1e-9 && (J3-Jauto[3]).minCoeff() > -1e-9);
+    ASSERT_MATRIX_APPROX(J3, Jauto[3], wolf::Constants::EPS);
+    //ASSERT_TRUE((J3-Jauto[3]).maxCoeff() < 1e-9 && (J3-Jauto[3]).minCoeff() > -1e-9);
 
 //    std::cout << "autodiff J " << 0 << ":\n" << Jauto[0] << std::endl;
 //    std::cout << "analytic J " << 0 << ":\n" << J0 << std::endl;
@@ -150,6 +155,52 @@ TEST(CaptureAutodiff, JacobianOdom2d)
 //    std::cout << "analytic J " << 3 << ":\n" << J3 << std::endl;
 }
 
+TEST(CaptureAutodiff, AutodiffVsAnalytic)
+{
+    Eigen::Vector3s f1_pose, f2_pose;
+    f1_pose << 2,1,M_PI;
+    f2_pose << 3,5,3*M_PI/2;
+
+    FrameBasePtr fr1_ptr(std::make_shared<FrameBase>(TimeStamp(0), std::make_shared<StateBlock>(f1_pose.head<2>()), std::make_shared<StateBlock>(f1_pose.tail<1>())));
+    FrameBasePtr fr2_ptr(std::make_shared<FrameBase>(TimeStamp(0), std::make_shared<StateBlock>(f2_pose.head<2>()), std::make_shared<StateBlock>(f2_pose.tail<1>())));
+
+    // SENSOR
+    SensorOdom2DPtr sensor_ptr = std::make_shared<SensorOdom2D>(std::make_shared<StateBlock>(2), std::make_shared<StateBlock>(1), 0.1, 0.1);
+
+    // CAPTURE
+    CaptureVoidPtr capture_ptr = std::make_shared<CaptureVoid>(TimeStamp(0), sensor_ptr);
+    fr2_ptr->addCapture(capture_ptr);
+
+    // FEATURE
+    Eigen::Vector3s d;
+    d << -1, -4, M_PI/2;
+    FeatureBasePtr feature_ptr = std::make_shared<FeatureOdom2D>(d, Eigen::Matrix3s::Identity());
+    capture_ptr->addFeature(feature_ptr);
+
+    // CONSTRAINTS
+    ConstraintOdom2DPtr ctr_autodiff_ptr = std::make_shared<ConstraintOdom2D>(feature_ptr, fr1_ptr);
+    feature_ptr->addConstraint(ctr_autodiff_ptr);
+    fr1_ptr->addConstrainedBy(ctr_autodiff_ptr);
+    ConstraintOdom2DAnalyticPtr ctr_analytic_ptr = std::make_shared<ConstraintOdom2DAnalytic>(feature_ptr, fr1_ptr);
+    feature_ptr->addConstraint(ctr_analytic_ptr);
+    fr1_ptr->addConstrainedBy(ctr_analytic_ptr);
+
+    // COMPUTE JACOBIANS
+    std::vector<const Scalar*> states_ptr({fr1_ptr->getPPtr()->getPtr(), fr1_ptr->getOPtr()->getPtr(), fr2_ptr->getPPtr()->getPtr(), fr2_ptr->getOPtr()->getPtr()});
+    std::vector<Eigen::MatrixXs> Jautodiff, Janalytic;
+    Eigen::VectorXs residuals(ctr_autodiff_ptr->getSize());
+    clock_t t = clock();
+    ctr_autodiff_ptr->evaluate(states_ptr, residuals, Jautodiff);
+    std::cout << "autodiff evaluate: " << ((double) clock() - t) / CLOCKS_PER_SEC << "s" << std::endl;
+    t = clock();
+    //TODO ConstraintAnalytic::evaluate
+//    ctr_analytic_ptr->evaluate(states_ptr, residuals, Janalytic);
+//    std::cout << "analytic evaluate: " << ((double) clock() - t) / CLOCKS_PER_SEC << "s" << std::endl;
+//
+//    for (auto i = 0; i < Jautodiff.size(); i++)
+//        ASSERT_MATRIX_APPROX(Jautodiff[i], Janalytic[i], wolf::Constants::EPS);
+}
+
 int main(int argc, char **argv)
 {
   testing::InitGoogleTest(&argc, argv);