From 90f5566d634286726f0ef632383852f679d529fc Mon Sep 17 00:00:00 2001
From: asanjuan <asanjuan@iri.upc.edu>
Date: Thu, 18 Aug 2022 16:45:20 +0200
Subject: [PATCH] Errors fixed and passing z axis rotation gtest

---
 ...problem_force_torque_inertial_dynamics.cpp | 66 +++++++++++--------
 1 file changed, 39 insertions(+), 27 deletions(-)

diff --git a/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp b/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp
index ad158ed..25ff34b 100644
--- a/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp
+++ b/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp
@@ -35,6 +35,7 @@
 #include <core/state_block/state_block_derived.h>
 #include <core/state_block/factory_state_block.h>
 #include <core/ceres_wrapper/solver_ceres.h>
+#include <core/math/rotations.h>
 
 #include <Eigen/Dense>
 #include <Eigen/Geometry>
@@ -586,31 +587,43 @@ TEST_F(Test_SolveProblemForceTorqueInertialDynamics_yaml, rotation_around_z_axis
     C_KF0->getFrame()->unfix();
     C_KF0->getFrame()->getStateBlock('P')->fix();
     C_KF0->getFrame()->getStateBlock('P')->setState(Vector3d(0, 0, 0));
+    C_KF0->getFrame()->getStateBlock('O')->fix();
+    C_KF0->getFrame()->getStateBlock('O')->setState((Quaterniond(0,0,0,1)).coeffs());
 
     // initialiation of all the variables needed in the following iteration process
-    Vector3d         dL;
-    Vector3d         L_time_actual;
-    Vector3d         ang_vel_actual;
-    Vector3d         inertia_actual;
-    double           dt            = 1;  // time increment
-    CaptureMotionPtr C_time_before = C_KF0;
-    std::string      report;
-
-    for (TimeStamp t = 1.0; t <= 50.0; t += 1.0)
+    Vector3d    torque_true(0, 0, 1);
+    Vector3d    dL;
+    Vector3d    L_true(0, 0, 0);
+    Vector3d    ang_vel_true(0, 0, 0);
+    Vector3d    ang_acc_true;
+    Vector3d angle_true;
+    Quaterniond q_true(0,0,0,1);
+    double      dt = 1;  // time increment
+    Vector3d position_data (0,0,0);
+    Quaterniond q_data;
+    std::string report;
+
+    for (TimeStamp t = 1.0; t <= 18.0; t += 1.0)
     {
         // SIMULATOR
 
         // calculate dL = torque*dt
-        dL = data.segment<3>(9) * dt;
+        dL = torque_true * dt;
         // actualize L = L + dt
-        L_time_actual = C_time_before->getFrame()->getStateBlock('L')->getState();
-        L_time_actual = L_time_actual + dL;  // L = L + dt
+        L_true = L_true + dL;  // L = L + dt
         // w = L*i_inv  we actualize the data
-        inertia_actual     = p->getSensor()->getStateBlock('i')->getState();
-        ang_vel_actual(0)  = L_time_actual(0) / inertia_actual(0);
-        ang_vel_actual(1)  = L_time_actual(1) / inertia_actual(1);
-        ang_vel_actual(2)  = L_time_actual(2) / inertia_actual(2);
-        data.segment<3>(3) = ang_vel_actual;
+        ang_vel_true(0)  = L_true(0) / inertia_true(0);
+        ang_vel_true(1)  = L_true(1) / inertia_true(1);
+        ang_vel_true(2)  = L_true(2) / inertia_true(2);
+        data.segment<3>(3) = ang_vel_true;
+
+        ang_acc_true(0) = torque_true(0) / inertia_true(0);
+        ang_acc_true(1) = torque_true(1) / inertia_true(1);
+        ang_acc_true(2) = torque_true(2) / inertia_true(2);
+
+        angle_true = ang_vel_true*dt + 0.5*ang_acc_true*dt*dt;
+        q_true = q_true * exp_q(angle_true);
+
 
         // ESTIMATOR
 
@@ -619,22 +632,21 @@ TEST_F(Test_SolveProblemForceTorqueInertialDynamics_yaml, rotation_around_z_axis
         C->process();
 
         p->getOrigin()->getFrame()->unfix();
-        p->getOrigin()->getStateBlock('P')->fix();
-        p->getOrigin()->getStateBlock('P')->setState(Vector3d(0, 0, 0));
+        p->getOrigin()->getFrame()->getStateBlock('P')->fix();
+        p->getOrigin()->getFrame()->getStateBlock('P')->setState(position_data);
+        q_data = q_true;
+        p->getOrigin()->getFrame()->getStateBlock('O')->fix();
+        p->getOrigin()->getFrame()->getStateBlock('O')->setState(q_data.coeffs());
 
         report = solver->solve(wolf::SolverManager::ReportVerbosity::FULL);
         WOLF_INFO("Estimated inertia: ", S->getStateBlock('i')->getState().transpose(), " m^2 Kg.");
         WOLF_INFO("-----------------------------");
-
-        WOLF_INFO("True inertia     : ", inertia_true, " m^2 Kg.");
-        WOLF_INFO("Guess inertia    : ", inertia_guess, " m^2 Kg.");
-        WOLF_INFO("Estimated inertia: ", S->getStateBlock('i')->getState().transpose(), " m^2 Kg.");
-        WOLF_INFO("-----------------------------");
-
-        // saving of the actual capture to use it in the next iteration
-        C_time_before = std::static_pointer_cast<CaptureMotion>(p->getOrigin());
     }
 
+    WOLF_INFO("True inertia     : ", inertia_true, " m^2 Kg.");
+    WOLF_INFO("Guess inertia    : ", inertia_guess, " m^2 Kg.");
+    WOLF_INFO("Estimated inertia: ", S->getStateBlock('i')->getState().transpose(), " m^2 Kg.");
+    WOLF_INFO("-----------------------------");
     auto inertia_estimated = S->getStateBlock('i')->getState();
 
     ASSERT_NEAR(inertia_estimated(2), inertia_true(2), 1e-6);
-- 
GitLab