From 87404a17246d59f61484ec1a8228dffd6fcfd49a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A9d=C3=A9ric=20Fourmy?= <mfourmy@laas.fr>
Date: Sat, 11 Apr 2020 01:53:02 +0200
Subject: [PATCH] Solved measurement simulation bugs

---
 demos/mcapi_povcdl_estimation.cpp | 69 +++++++++++++++++++++----------
 demos/mcapi_utils.cpp             |  9 ++--
 2 files changed, 51 insertions(+), 27 deletions(-)

diff --git a/demos/mcapi_povcdl_estimation.cpp b/demos/mcapi_povcdl_estimation.cpp
index 4e1d6a8..a02dba2 100644
--- a/demos/mcapi_povcdl_estimation.cpp
+++ b/demos/mcapi_povcdl_estimation.cpp
@@ -91,7 +91,8 @@ int main (int argc, char **argv) {
     std::cout << "q_traj.dim(): " << q_traj.dim() << std::endl;
     double dt = 1e-2;  // chosen data sampling
     double min_t = q_traj.min();
-    double mac_t = q_traj.max();
+    // double max_t = q_traj.max();
+    double max_t = 0.25;  // only the beginning
 
     // initialize some vectors and fill them with dicretized data
     std::vector<double> t_arr;
@@ -104,7 +105,7 @@ int main (int argc, char **argv) {
     std::vector<VectorXd> L_traj_arr;
     std::vector<VectorXd> ll_contactf_traj_arr;
     std::vector<VectorXd> rl_contactf_traj_arr;
-    for (double t=min_t; t <= mac_t; t += dt){
+    for (double t=min_t; t <= max_t; t += dt){
         t_arr.push_back(t);
         q_traj_arr.push_back(q_traj(t));
         dq_traj_arr.push_back(dq_traj(t));
@@ -131,8 +132,10 @@ int main (int argc, char **argv) {
     // std::cout << "q: " << q.transpose() << std::endl;
     // // Perform the forward kinematics over the kinematic tree
     // forwardKinematics(model,data,q);
-    int ll_sole_idx = model.getFrameId("leg_left_sole_fix_joint");
-    int rl_sole_idx = model.getFrameId("leg_right_sole_fix_joint");
+    int left_leg_sole_idx = model.getFrameId("leg_left_sole_fix_joint");
+    int right_leg_sole_idx = model.getFrameId("leg_right_sole_fix_joint");
+    std::cout << "left_leg_sole_idx: " << left_leg_sole_idx << std::endl;
+    std::cout << "right_leg_sole_idx: " << right_leg_sole_idx << std::endl;
     std::vector<Vector3d> contacts = contacts_from_footrect_center();
 
 
@@ -141,7 +144,7 @@ int main (int argc, char **argv) {
     // Groundtruth
     std::vector<Vector3d> p_ob_gtruth_v; 
     std::vector<Vector4d> q_ob_gtruth_v; 
-    // std::vector<Vector3d> v_wb_gtruth_v; 
+    std::vector<Vector3d> v_ob_gtruth_v; 
     // std::vector<VectorXd>& c_gtruth_v = c_traj_arr;   // already have it directly
     // std::vector<VectorXd>& cd_gtruth_v = dc_traj_arr; // already have it directly
     // std::vector<Vector3d> Lc_gtruth_v; 
@@ -166,13 +169,13 @@ int main (int argc, char **argv) {
          * Groundtruth to recover (in world frame, vels/inertial frame):
          * b position                                  --> OK
          * b orientation (quat)                        --> OK
-         * b velocity: linear classical one -> careful
+         * b velocity: linear classical one            --> OK
          * CoM posi                                    --> OK
          * CoM vel                                     
          * Angular momentum         
          * 
          * Measures to recover (in local frames):
-         * IMU readings                                --> ALMOST OK
+         * IMU readings                                --> OK
          * Kinematics readings                         --> OK
          * Wrench readings                             --> OK
          * CoM relative position/vel                   --> OK
@@ -185,7 +188,7 @@ int main (int argc, char **argv) {
         VectorXd dq = dq_traj_arr[i];
         VectorXd ddq = ddq_traj_arr[i];
         Vector3d c = c_traj_arr[i];      // gtruth
-        VectorXd dc = dc_traj_arr[i];    // gtruth (??)
+        VectorXd dc = dc_traj_arr[i];    // gtruth
         VectorXd cw = cw_traj_arr[i];
         VectorXd L = L_traj_arr[i];
         VectorXd cf_ll = ll_contactf_traj_arr[i];
@@ -199,7 +202,7 @@ int main (int argc, char **argv) {
         // global frame pose
         SE3 oMb(Quaterniond(quat_wb).toRotationMatrix(), p_wb);
         // body vel is expressed in body frame
-        // Vector3d w_v_wb =  oMb.rotation() * dq.head<3>();  // NOT USED
+        Vector3d w_v_wb =  oMb.rotation() * dq.head<3>();  // NOT USED
         // com velocity is already expressed in world frame
         // Vector3d w_v_wc = dc;                              // TO STORE
         // Lc ??
@@ -218,8 +221,14 @@ int main (int argc, char **argv) {
 
         // update and retrieve kinematics
         forwardKinematics(model,data,q);
-        auto oMll = data.oMf[ll_sole_idx];
-        auto oMrl = data.oMf[rl_sole_idx];
+        // auto oMll = data.oMf[left_leg_sole_idx];
+        // auto oMrl = data.oMf[right_leg_sole_idx];
+        auto frame_ll_sole_idx = model.frames[left_leg_sole_idx];
+        auto oMll = data.oMi[frame_ll_sole_idx.parent].act(frame_ll_sole_idx.placement);
+        auto frame_rl_sole_idx = model.frames[right_leg_sole_idx];
+        auto oMrl = data.oMi[frame_rl_sole_idx.parent].act(frame_rl_sole_idx.placement);
+        std::cout << "oMll.translation(): " << oMll.translation().transpose() << std::endl;
+        std::cout << "oMrl.translation(): " << oMrl.translation().transpose() << std::endl;
         auto bMll = oMb.inverse() * oMll;
         auto bMrl = oMb.inverse() * oMrl;
         Vector3d b_p_ll = bMll.translation();                        // meas
@@ -260,7 +269,7 @@ int main (int argc, char **argv) {
 
         p_ob_gtruth_v.push_back(p_wb); 
         q_ob_gtruth_v.push_back(quat_wb); 
-        // v_wb_gtruth_v; 
+        v_ob_gtruth_v.push_back(w_v_wb); 
         // Lc_gtruth_v; 
 
         // Measurements
@@ -343,7 +352,7 @@ int main (int argc, char **argv) {
     // - call setOrigin on processors isMotion since the flag prior_is_set is not true when doing installProcessor (later)
     TimeStamp t0(t_arr[0]);
     VectorXd x_origin; x_origin.resize(19);
-    x_origin << p_ob_gtruth_v[0], q_ob_gtruth_v[0], ZERO3, ZERO3, ZERO3, ZERO3;  // TODO: origin vel shoulde not be zero  but v_wb_gtruth_v[0]
+    x_origin << p_ob_gtruth_v[0], q_ob_gtruth_v[0], v_ob_gtruth_v[0], ZERO3, ZERO3, ZERO3;  // TODO: origin vel shoulde not be zero  but v_wb_gtruth_v[0]
     MatrixXd P_origin = pow(1e-3, 2) * Eigen::Matrix9d::Identity();
     FrameBasePtr KF1 = problem->emplaceFrame(KEY, x_origin, t0);
     // Prior pose factor
@@ -389,7 +398,7 @@ int main (int argc, char **argv) {
 
         // Force Torque
         Vector6d f_meas; f_meas << wrench_ll_meas_v[i].head<3>(), wrench_rl_meas_v[i].head<3>();
-        Vector6d tau_meas; tau_meas << wrench_ll_meas_v[i].head<3>(), wrench_rl_meas_v[i].head<3>();
+        Vector6d tau_meas; tau_meas << wrench_ll_meas_v[i].tail<3>(), wrench_rl_meas_v[i].tail<3>();
         VectorXd kin_meas(14);
         kin_meas << p_bll_meas_v[i], p_brl_meas_v[i], q_bll_meas_v[i], q_brl_meas_v[i];
 
@@ -405,13 +414,24 @@ int main (int argc, char **argv) {
         Qftp.block<6, 6>(6, 6) = cov_tau;
         Qftp.block<3, 3>(12, 12) = cov_pbc;
 
-
-        CaptureImuPtr CImu2 = std::make_shared<CaptureImu>(ts, sen_imu, acc_gyr_meas, acc_gyr_cov);
-        CImu2->process();
-        auto CIKin2 = std::make_shared<CaptureInertialKinematics>(ts, sen_ikin, meas_ikin, Iq_meas_v[i], Lq_meas_v[i]);
-        CIKin2->process();
-        auto CFTpreint2 = std::make_shared<CaptureForceTorquePreint>(ts, sen_ft, CIKin2, CImu2, cap_ftp_data, Qftp);
-        CFTpreint2->process();
+        std::cout << "\nw_b_meas_v[i]:     " << w_b_meas_v[i].transpose() << std::endl;
+        std::cout << "Lq_meas_v[i]:        " << Lq_meas_v[i].transpose() << std::endl;
+        std::cout << "Iq_meas_v[i]\n" << Iq_meas_v[i] << std::endl;
+        std::cout << "wrench_ll_meas_v[i]: " << wrench_ll_meas_v[i].transpose() << std::endl;
+        std::cout << "wrench_rl_meas_v[i]: " << wrench_rl_meas_v[i].transpose() << std::endl;
+        std::cout << "p_bc_meas_v[i]:      " << p_bc_meas_v[i].transpose() << std::endl;
+        std::cout << "p_bll_meas_v[i]:     " << p_bll_meas_v[i].transpose() << std::endl;
+        std::cout << "p_brl_meas_v[i]:     " << p_brl_meas_v[i].transpose() << std::endl;
+        std::cout << "q_bll_meas_v[i]:     " << q_bll_meas_v[i].transpose() << std::endl;
+        std::cout << "q_brl_meas_v[i]:     " << q_brl_meas_v[i].transpose() << std::endl;
+        
+
+        CaptureImuPtr CImu = std::make_shared<CaptureImu>(ts, sen_imu, acc_gyr_meas, acc_gyr_cov);
+        CImu->process();
+        auto CIKin = std::make_shared<CaptureInertialKinematics>(ts, sen_ikin, meas_ikin, Iq_meas_v[i], Lq_meas_v[i]);
+        CIKin->process();
+        auto CFTpreint = std::make_shared<CaptureForceTorquePreint>(ts, sen_ft, CIKin, CImu, cap_ftp_data, Qftp);
+        CFTpreint->process();
 
         /////////////////////////////////////////////
         // Manually create an Odom3d factor when a new KF is detected (will be put in a processorLegOdom3d)
@@ -455,9 +475,14 @@ int main (int argc, char **argv) {
     ///////////////////////////////////////////
     /////////// SOLVING AND PRINTING //////////
     ///////////////////////////////////////////
-    problem->print(4,true,true,true);
     std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF);
+    problem->print(4,true,true,true);
     std::cout << report << std::endl;
 
+    std::cout << "Ground truth end: " << std::endl;
+    std::cout << p_ob_gtruth_v[p_ob_gtruth_v.size()-1].transpose() << std::endl;
+    std::cout << q_ob_gtruth_v[q_ob_gtruth_v.size()-1].transpose() << std::endl;
+    std::cout << v_ob_gtruth_v[v_ob_gtruth_v.size()-1].transpose() << std::endl;
+
 
 }
\ No newline at end of file
diff --git a/demos/mcapi_utils.cpp b/demos/mcapi_utils.cpp
index b89e9fb..bdb0dce 100644
--- a/demos/mcapi_utils.cpp
+++ b/demos/mcapi_utils.cpp
@@ -28,11 +28,10 @@ Matrix<double, 6, 1> contact_force_to_wrench(const std::vector<Vector3d>& contac
     Vector3d wf = w_cforces.segment<3>(0) + w_cforces.segment<3>(3) + w_cforces.segment<3>(6) + w_cforces.segment<3>(9);
     Vector3d lf = wRl.inverse() * wf;
     // torque at point l (center of the foot) in world frame
-    Vector3d w_tau_l = contacts[0].cross(w_cforces.segment<3>(0))
-                     + contacts[1].cross(w_cforces.segment<3>(3))
-                     + contacts[2].cross(w_cforces.segment<3>(6))
-                     + contacts[3].cross(w_cforces.segment<3>(9));
-    Vector3d l_tau_l = wRl.inverse() * w_tau_l;
+    Vector3d l_tau_l = contacts[0].cross(wRl.inverse() * w_cforces.segment<3>(0))
+                     + contacts[1].cross(wRl.inverse() * w_cforces.segment<3>(3))
+                     + contacts[2].cross(wRl.inverse() * w_cforces.segment<3>(6))
+                     + contacts[3].cross(wRl.inverse() * w_cforces.segment<3>(9));
     Matrix<double, 6, 1> l_wrench; l_wrench << lf, l_tau_l;
     return l_wrench;
 }
-- 
GitLab