From 97dc12e8fa38f39d4a16f5c44c6ddcbc9822ac01 Mon Sep 17 00:00:00 2001
From: fbailly <fbailly@laas.fr>
Date: Tue, 15 Jan 2019 17:14:09 +0100
Subject: [PATCH] [added dcm-estimator entity] does nothing for now

---
 include/sot/talos_balance/dcm-estimator.hh | 111 +++++++++++++++
 src/dcm-estimator.cpp                      | 150 +++++++++++++++++++++
 unittest/python/test_com_estimator.py      |  28 ++++
 3 files changed, 289 insertions(+)
 create mode 100644 include/sot/talos_balance/dcm-estimator.hh
 create mode 100644 src/dcm-estimator.cpp
 create mode 100644 unittest/python/test_com_estimator.py

diff --git a/include/sot/talos_balance/dcm-estimator.hh b/include/sot/talos_balance/dcm-estimator.hh
new file mode 100644
index 0000000..a144513
--- /dev/null
+++ b/include/sot/talos_balance/dcm-estimator.hh
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2019, 
+ * LAAS-CNRS,
+ * Gepetto team 
+ *
+ * This file is part of sot-talos-balance.
+ * See license file 
+ */
+
+#ifndef __sot_talos_balance_dcm_estimator_H__
+#define __sot_talos_balance_dcm_estimator_H__
+
+/* --------------------------------------------------------------------- */
+/* --- API ------------------------------------------------------------- */
+/* --------------------------------------------------------------------- */
+
+#if defined (WIN32)
+#  if defined (dcm_estimator_EXPORTS)
+#    define DCMESTIMATOR_EXPORT __declspec(dllexport)
+#  else
+#    define DCMESTIMATOR_EXPORT __declspec(dllimport)
+#  endif
+#else
+#  define DCMESTIMATOR_EXPORT
+#endif
+
+
+/* --------------------------------------------------------------------- */
+/* --- INCLUDE --------------------------------------------------------- */
+/* --------------------------------------------------------------------- */
+
+#include <sot/core/signal-helper.hh>
+#include <sot/core/matrix-geometry.hh>
+#include <sot/core/logger.hh>
+#include <map>
+#include "boost/assign.hpp"
+#include <boost/math/distributions/normal.hpp> // for normal_distribution
+
+/* Pinocchio */
+#include <pinocchio/multibody/model.hpp>
+#include <pinocchio/parsers/urdf.hpp>
+#include <pinocchio/algorithm/kinematics.hpp>
+#include <sot/core/robot-utils.hh>
+
+namespace dynamicgraph 
+{
+  namespace sot 
+  {
+    namespace talos_balance 
+    {
+
+      /* --------------------------------------------------------------------- */
+      /* --- CLASS ----------------------------------------------------------- */
+      /* --------------------------------------------------------------------- */
+
+      class DCMESTIMATOR_EXPORT DcmEstimator
+	                         :public::dynamicgraph::Entity
+      {
+        typedef se3::SE3 SE3;
+        typedef Eigen::Vector2d Vector2;
+        typedef Eigen::Vector3d Vector3;
+        typedef Eigen::Vector4d Vector4;
+        typedef Eigen::Vector6d Vector6;
+        typedef Eigen::Vector7d Vector7;
+        typedef Eigen::Matrix3d Matrix3;
+        typedef boost::math::normal normal;
+
+        DYNAMIC_GRAPH_ENTITY_DECL();
+
+      public:
+        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+
+        /* --- CONSTRUCTOR ---- */
+        DcmEstimator(const std::string & name );
+
+        void init(const double & dt, const std::string& urdfFile);
+        void test_command(const int& test_int);
+        /* --- SIGNALS --- */
+        DECLARE_SIGNAL_IN(q,   dynamicgraph::Vector);
+
+        DECLARE_SIGNAL_OUT(c,  dynamicgraph::Vector);
+        DECLARE_SIGNAL_OUT(dc, dynamicgraph::Vector);
+
+        /* --- COMMANDS --- */
+        /* --- ENTITY INHERITANCE --- */
+        virtual void display( std::ostream& os ) const;
+
+        void sendMsg(const std::string& msg, MsgType t=MSG_TYPE_INFO, const char* file="", int line=0)
+        {
+          getLogger().sendMsg("[DcmEstimator-"+name+"] "+msg, t, file, line);
+        }
+
+      protected:
+        bool      m_initSucceeded;            /// true if the entity has been successfully initialized
+        RobotUtil*   m_robot_util;
+        se3::Data         *m_data;            /// Pinocchio robot data
+        Eigen::VectorXd   m_q_pin;            /// robot configuration according to pinocchio convention
+        Eigen::VectorXd   m_v_pin;            /// robot velocities according to pinocchio convention
+        Vector3        m_last_vel;
+        double               m_dt;            /// sampling time step
+        se3::Model        m_model;            /// Pinocchio robot model
+
+      }; // class DCMEstimator
+
+    }    // namespace talos_balance
+  }      // namespace sot
+}        // namespace dynamicgraph
+
+
+
+#endif // #ifndef __sot_talos_balance_dcm_estimator_H__
diff --git a/src/dcm-estimator.cpp b/src/dcm-estimator.cpp
new file mode 100644
index 0000000..d89e8f1
--- /dev/null
+++ b/src/dcm-estimator.cpp
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2019, 
+ * LAAS-CNRS
+ * François Bailly, 
+ *
+ * This file is part of sot-talos-balance.
+ * See license file.
+ */
+
+#include "sot/talos_balance/dcm-estimator.hh"
+#include <sot/core/debug.hh>
+#include <dynamic-graph/factory.h>
+#include "sot/talos_balance/utils/commands-helper.hh"
+#include <sot/talos_balance/utils/stop-watch.hh>
+#include "pinocchio/algorithm/frames.hpp"
+
+namespace dynamicgraph
+{
+  namespace sot
+  {
+    namespace talos_balance
+    {
+      namespace dg = ::dynamicgraph;
+      using namespace dg;
+      using namespace dg::command;
+      using namespace std;
+      using namespace se3;
+      using boost::math::normal; // typedef provides default type is double.
+ //Size to be aligned                         "-------------------------------------------------------"
+     
+#define PROFILE_BASE_POSITION_ESTIMATION      "base-est position estimation"
+#define PROFILE_BASE_VELOCITY_ESTIMATION      "base-est velocity estimation"
+#define PROFILE_BASE_KINEMATICS_COMPUTATION   "base-est kinematics computation"
+
+#define INPUT_SIGNALS     m_qSIN
+#define OUTPUT_SIGNALS    m_cSOUT << m_dcSOUT
+
+      /// Define EntityClassName here rather than in the header file
+      /// so that it can be used by the macros DEFINE_SIGNAL_**_FUNCTION.
+      typedef DcmEstimator EntityClassName;
+      /* --- DG FACTORY ---------------------------------------------------- */
+      DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(DcmEstimator,
+                                         "DcmEstimator");      
+      /* ------------------------------------------------------------------- */
+      /* --- CONSTRUCTION -------------------------------------------------- */
+      /* ------------------------------------------------------------------- */
+      DcmEstimator::DcmEstimator(const std::string& name)
+        : Entity(name)
+        ,CONSTRUCT_SIGNAL_IN( q,   dynamicgraph::Vector)
+        ,CONSTRUCT_SIGNAL_OUT(c,   dynamicgraph::Vector, m_qSIN)
+        ,CONSTRUCT_SIGNAL_OUT(dc,  dynamicgraph::Vector, m_qSIN)
+
+      {
+        Entity::signalRegistration( INPUT_SIGNALS << OUTPUT_SIGNALS );
+
+        /* Commands. */
+        addCommand("init",
+                   makeCommandVoid2(*this, &DcmEstimator::init,
+                                    docCommandVoid2("Initialize the entity.",
+                                                    "time step (double)",
+                                                    "URDF file path (string)")));
+
+        addCommand("test_command",
+                           makeCommandVoid1(*this, &DcmEstimator::test_command,
+                                            docCommandVoid1("Test dumb command",
+                                                            "integer (int)")));
+      }
+     void DcmEstimator::init(const double & dt, const std::string& robotRef)
+      {
+        m_dt = dt;
+        try
+        {
+          // Retrieve m_robot_util informations 
+          std::string localName(robotRef);
+          if (isNameInRobotUtil(localName))
+          {
+            m_robot_util = getRobotUtil(localName);
+            std::cerr << "m_robot_util:" << m_robot_util << std::endl;
+          }
+          else
+          {
+            SEND_MSG("You should have a robotUtil pointer initialized before",MSG_TYPE_ERROR);
+            return;
+          }
+
+          se3::urdf::buildModel(m_robot_util->m_urdf_filename,
+                                se3::JointModelFreeFlyer(), m_model);
+
+          assert(m_model.existFrame(m_robot_util->m_foot_util.m_Left_Foot_Frame_Name));
+          assert(m_model.existFrame(m_robot_util->m_foot_util.m_Right_Foot_Frame_Name));
+          assert(m_model.existFrame(m_robot_util->m_foot_util.m_Right_Foot_Frame_Name));
+          m_q_pin.setZero(m_model.nq);
+          m_q_pin[6]= 1.; // for quaternion
+          m_v_pin.setZero(m_robot_util->m_nbJoints+6);
+
+          m_last_vel.setZero(); // ?
+        }
+        catch (const std::exception& e)
+        {
+          std::cout << e.what();
+          SEND_MSG("Init failed: Could load URDF :" + m_robot_util->m_urdf_filename, MSG_TYPE_ERROR);
+          return;
+        }
+        m_data = new se3::Data(m_model);
+        m_initSucceeded = true;
+      }
+    
+     void DcmEstimator::test_command(const int& test_int)     
+     {
+        std::cout << "test integer:" << test_int << std::endl;
+     }
+      /* ------------------------------------------------------------------- */
+      /* --- SIGNALS ------------------------------------------------------- */
+      /* ------------------------------------------------------------------- */
+
+      DEFINE_SIGNAL_OUT_FUNCTION(c, dynamicgraph::Vector)
+      {
+        if(!m_initSucceeded)
+        {
+          SEND_WARNING_STREAM_MSG("Cannot compute signal com before initialization!");
+          return s;
+        }
+
+        s = m_q_pin;
+        return s;
+      }
+      
+      DEFINE_SIGNAL_OUT_FUNCTION(dc, dynamicgraph::Vector)
+      {
+        if(!m_initSucceeded)
+        {
+          SEND_WARNING_STREAM_MSG("Cannot compute signal dcom before initialization!");
+          return s;
+        }
+
+        s = m_q_pin;
+        return s;
+      }
+      void DcmEstimator::display(std::ostream& os) const
+      {
+        os << "DcmEstimator " << getName();
+        try
+        {
+          getProfiler().report_all(3, os);
+        }
+        catch (ExceptionSignal e) {}
+      }
+    } // namespace talos_balance
+  } // namespace sot
+} // namespace dynamicgraph
\ No newline at end of file
diff --git a/unittest/python/test_com_estimator.py b/unittest/python/test_com_estimator.py
new file mode 100644
index 0000000..4baa1cc
--- /dev/null
+++ b/unittest/python/test_com_estimator.py
@@ -0,0 +1,28 @@
+from sot_talos_balance.create_entities_utils import *
+from dynamic_graph import plug
+import dynamic_graph as dg
+from dynamic_graph.sot.core import SOT
+from numpy import eye
+from time import sleep
+import os
+from IPython import embed
+from sot_talos_balance.parameter_server             import ParameterServer
+from sot_talos_balance.utils.sot_utils              import Bunch
+from sot_talos_balance.dcm_estimator                import DcmEstimator
+from sot_talos_balance.utils.sot_utils              import Bunch
+import sot_talos_balance.talos.control_manager_conf as control_manager_conf
+
+
+dt = 0.001
+conf = Bunch()
+robot_name = 'robot'
+
+conf.param_server = control_manager_conf
+param_server = ParameterServer("param_server")     
+param_server.init(dt, conf.param_server.urdfFileName, robot_name)
+param_server.setRightFootForceSensorXYZ(conf.param_server.rightFootSensorXYZ)
+param_server.setRightFootSoleXYZ(conf.param_server.rightFootSoleXYZ)
+
+dcm_estimator = DcmEstimator('dcm_estimator')
+dcm_estimator.init(dt, robot_name)
+dcm_estimator.test_command(5)
\ No newline at end of file
-- 
GitLab