From a367ad7f1798c661a54636e9ada776362e3833ca Mon Sep 17 00:00:00 2001
From: Mansard <nmansard@laas.fr>
Date: Tue, 15 Mar 2011 17:01:08 +0100
Subject: [PATCH] Added missing cpp files.

---
 src/solver-kine.cpp | 323 ++++++++++++++++++++++++++++++++++++++++++++
 src/solver-kine.h   | 118 ++++++++++++++++
 2 files changed, 441 insertions(+)
 create mode 100644 src/solver-kine.cpp
 create mode 100644 src/solver-kine.h

diff --git a/src/solver-kine.cpp b/src/solver-kine.cpp
new file mode 100644
index 0000000..059d9ab
--- /dev/null
+++ b/src/solver-kine.cpp
@@ -0,0 +1,323 @@
+/*
+ * Copyright 2011, Nicolas Mansard, LAAS-CNRS
+ *
+ * This file is part of sot-dyninv.
+ * sot-dyninv is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ * sot-dyninv is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along
+ * with sot-dyninv.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define VP_DEBUG
+#define VP_DEBUG_MODE 50
+#include <sot/core/debug.hh>
+#ifdef VP_DEBUG
+class solver_op_space__INIT
+{
+public:solver_op_space__INIT( void ) { dynamicgraph::sot::DebugTrace::openFile(); }
+};
+solver_op_space__INIT solver_op_space_initiator;
+#endif //#ifdef VP_DEBUG
+
+
+#include <sot-dyninv/solver-kine.h>
+#include <sot-dyninv/commands-helper.h>
+#include <dynamic-graph/factory.h>
+#include <boost/foreach.hpp>
+#include <sot-dyninv/commands-helper.h>
+#include <dynamic-graph/pool.h>
+#include <soth/HCOD.hpp>
+#include <sot-dyninv/task-dyn-pd.h>
+#include <sot/core/feature-point6d.hh>
+#include <sstream>
+#include <soth/Algebra.hpp>
+#include <Eigen/QR>
+#include <sot-dyninv/mal-to-eigen.h>
+
+
+namespace dynamicgraph
+{
+  namespace sot
+  {
+    namespace dyninv
+    {
+
+      namespace dg = ::dynamicgraph;
+      using namespace dg;
+      using dg::SignalBase;
+
+      /* --- DG FACTORY ------------------------------------------------------- */
+      DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(SolverKine,"SolverKine");
+
+      /* --- CONSTRUCTION ----------------------------------------------------- */
+      /* --- CONSTRUCTION ----------------------------------------------------- */
+      /* --- CONSTRUCTION ----------------------------------------------------- */
+      SolverKine::
+      SolverKine( const std::string & name )
+	: Entity(name)
+	,stack_t()
+
+	,CONSTRUCT_SIGNAL_IN(damping,double)
+	,CONSTRUCT_SIGNAL_OUT(control,ml::Vector,
+			      dampingSIN )
+	,CONSTRUCT_SIGNAL(velocity,OUT,ml::Vector)
+
+	,controlFreeFloating(true)
+
+	,hsolver()
+
+	,Ctasks(),btasks()
+	,solution()
+      {
+	signalRegistration(  controlSOUT << velocitySOUT
+			    << dampingSIN );
+
+	/* Command registration. */
+	addCommand("debugOnce",
+		   makeCommandVoid0(*this,&SolverKine::debugOnce,
+				    docCommandVoid0("open trace-file for next iteration of the solver.")));
+
+	addCommand("setControlFreeFloating",
+		   makeDirectSetter(*this,&controlFreeFloating,
+				    docDirectSetter("If true, the ouput control includes the ff (ie, size nbDof). Oterwise, size is nbDof-6. FF is supposed to be at the head.","bool")));
+
+	ADD_COMMANDS_FOR_THE_STACK;
+      }
+
+      /* --- STACK ----------------------------------------------------------- */
+      /* --- STACK ----------------------------------------------------------- */
+      /* --- STACK ----------------------------------------------------------- */
+
+      SolverKine::TaskDependancyList_t SolverKine::
+      getTaskDependancyList( const TaskAbstract& task )
+      {
+	TaskDependancyList_t res;
+	res.push_back( &task.taskSOUT );
+	res.push_back( &task.jacobianSOUT );
+	return res;
+      }
+      void SolverKine::
+      addDependancy( const TaskDependancyList_t& depList )
+      {
+	BOOST_FOREACH( const SignalBase<int>* sig, depList )
+	  { controlSOUT.addDependency( *sig ); }
+      }
+      void  SolverKine::
+      removeDependancy( const TaskDependancyList_t& depList )
+      {
+	BOOST_FOREACH( const SignalBase<int>* sig, depList )
+	  { controlSOUT.removeDependency( *sig ); }
+      }
+      void SolverKine::
+      resetReady( void )
+      {
+	controlSOUT.setReady();
+      }
+
+
+      /* --- INIT SOLVER ------------------------------------------------------ */
+      /* --- INIT SOLVER ------------------------------------------------------ */
+      /* --- INIT SOLVER ------------------------------------------------------ */
+
+      /** Force the update of all the task in-signals, in order to fix their
+       * size for resizing the solver.
+       */
+      void SolverKine::
+      refreshTaskTime( int time )
+      {
+	BOOST_FOREACH( TaskAbstract* task, stack )
+	  {
+	    task->taskSOUT( time );
+	  }
+      }
+
+      /** Knowing the sizes of all the stages (except the task ones),
+       * the function resizes the matrix and vector of all stages (except...).
+       */
+      void SolverKine::
+      resizeSolver( void )
+      {
+	hsolver = hcod_ptr_t(new soth::HCOD( nbDofs,stack.size() ));
+	Ctasks.resize(stack.size());
+	btasks.resize(stack.size());
+
+	int i=0;
+	BOOST_FOREACH( TaskAbstract* task, stack )
+	  {
+	    const int nx = task->taskSOUT.accessCopy().size();
+	    Ctasks[i].resize(nx,nbDofs);
+	    btasks[i].resize(nx);
+
+	    hsolver->pushBackStage( Ctasks[i],btasks[i] );
+	    hsolver->stages.back()->name = task->getName();
+	    i++;
+	  }
+
+	solution.resize( nbDofs );
+      }
+
+      /* Return true iff the solver sizes fit to the task set. */
+      bool SolverKine::
+      checkSolverSize( void )
+      {
+	sotDEBUGIN(15);
+
+	assert( nbDofs>0 );
+
+	if(! hsolver ) return false;
+	if( stack.size() != hsolver->nbStages() ) return false;
+
+	bool toBeResized=false;
+	for( int i=0;i<(int)stack.size();++i )
+	  {
+	    assert( Ctasks[i].cols() == nbDofs && Ctasks[i].rows() == btasks[i].size() );
+	    TaskAbstract & task = *stack[i];
+	    if( btasks[i].size() != (int)task.taskSOUT.accessCopy().size() )
+	      {
+		toBeResized = true;
+		break;
+	      }
+	  }
+
+	return !toBeResized;
+      }
+
+      /* --- SIGNALS ---------------------------------------------------------- */
+      /* --- SIGNALS ---------------------------------------------------------- */
+      /* --- SIGNALS ---------------------------------------------------------- */
+
+      ml::Vector& SolverKine::
+      controlSOUT_function( ml::Vector &mlcontrol, int t )
+      {
+	sotDEBUG(15) << " # In time = " << t << std::endl;
+
+	refreshTaskTime( t );
+	if(! checkSolverSize() ) resizeSolver();
+
+	using namespace soth;
+
+	if( dampingSIN ) //damp?
+	  {
+	    sotDEBUG(5) << "Using damping. " << std::endl;
+	    /* Only damp the final stage of the stack, 'cose of the solver known limitation. */
+	    hsolver->setDamping( 0 );
+	    hsolver->useDamp( true );
+	    hsolver->stages.back()->damping( dampingSIN(t) );
+	  }
+	else
+	  {
+	    sotDEBUG(5) << "Without damping. " << std::endl;
+	    hsolver->useDamp( false );
+	  }
+
+
+	/* -Tasks 1:n- */
+	/* Ctaski = [ Ji 0 0 0 0 0 ] */
+	for( int i=0;i<(int)stack.size();++i )
+	  {
+	    TaskAbstract & task = * stack[i];
+	    MatrixXd & Ctask = Ctasks[i];
+	    VectorBound & btask = btasks[i];
+
+	    EIGEN_MATRIX_FROM_SIGNAL(J,task.jacobianSOUT(t));
+	    const dg::sot::VectorMultiBound & ddx = task.taskSOUT(t);
+	    const int nx = ddx.size();
+
+	    sotDEBUG(5) << "ddx"<<i<<" = " << ddx << std::endl;
+	    sotDEBUG(25) << "J"<<i<<" = " << J << std::endl;
+
+	    assert( Ctask.rows() == nx && btask.size() == nx );
+	    assert( J.rows()==nx && J.cols()==nbDofs && (int)ddx.size()==nx );
+
+	    Ctask = J;  COPY_MB_VECTOR_TO_EIGEN(ddx,btask);
+
+	    sotDEBUG(15) << "Ctask"<<i<<" = "     << (MATLAB)Ctask << std::endl;
+	    sotDEBUG(1) << "btask"<<i<<" = "     << btask << std::endl;
+	  }
+
+
+	/* --- */
+	sotDEBUG(1) << "Initial config." << std::endl;
+	hsolver->reset();
+	hsolver->setInitialActiveSet();
+
+	sotDEBUG(1) << "Run for a solution." << std::endl;
+	hsolver->activeSearch(solution);
+	sotDEBUG(1) << "solution = " << (MATLAB)solution << std::endl;
+
+
+	if( controlFreeFloating )
+	  {
+	    EIGEN_VECTOR_FROM_VECTOR( control,mlcontrol,nbDofs );
+	    control=solution;
+	  }
+	else
+	  {
+	    EIGEN_VECTOR_FROM_VECTOR( control,mlcontrol,nbDofs-6 );
+	    control=solution.tail( nbDofs-6 );
+	  }
+
+	sotDEBUG(1) << "control = " << mlcontrol << std::endl;
+	return mlcontrol;
+      }
+
+
+      /* --- COMMANDS ---------------------------------------------------------- */
+      /* --- COMMANDS ---------------------------------------------------------- */
+      /* --- COMMANDS ---------------------------------------------------------- */
+
+      void SolverKine::
+      debugOnce( void )
+      {
+	dg::sot::DebugTrace::openFile("/tmp/sot.txt");
+	hsolver->debugOnce();
+      }
+
+      /* --- ENTITY ----------------------------------------------------------- */
+      /* --- ENTITY ----------------------------------------------------------- */
+      /* --- ENTITY ----------------------------------------------------------- */
+
+      void SolverKine::
+      display( std::ostream& os ) const
+      {
+	os << "SolverKine "<<getName() << ": " << nbDofs <<" joints." << std::endl;
+	try{
+	  os <<"control = "<<controlSOUT.accessCopy() <<std::endl << std::endl;
+	}  catch (dynamicgraph::ExceptionSignal e) {}
+	stack_t::display(os);
+      }
+
+      void SolverKine::
+      commandLine( const std::string& cmdLine,
+		   std::istringstream& cmdArgs,
+		   std::ostream& os )
+      {
+	if( cmdLine == "help" )
+	  {
+	    os << "SolverKine:\n"
+	       << "\t- debugOnce: open trace-file for next iteration of the solver." << std::endl;
+	    stackCommandLine( cmdLine,cmdArgs,os );
+	    Entity::commandLine( cmdLine,cmdArgs,os );
+	  }
+	else if( cmdLine == "debugOnce" )
+	  {
+	    debugOnce();
+	  }
+	/* TODO: add controlFreeFloating g/setter. */
+	else if( stackCommandLine( cmdLine,cmdArgs,os ) );
+	else
+	  {
+	    Entity::commandLine( cmdLine,cmdArgs,os );
+	  }
+      }
+
+    } // namespace dyninv
+  } // namespace sot
+} // namespace dynamicgraph
+
diff --git a/src/solver-kine.h b/src/solver-kine.h
new file mode 100644
index 0000000..8e2aec5
--- /dev/null
+++ b/src/solver-kine.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2011, Nicolas Mansard, LAAS-CNRS
+ *
+ * This file is part of sot-dyninv.
+ * sot-dyninv is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ * sot-dyninv is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along
+ * with sot-dyninv.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __sot_dyninv_SolverKine_H__
+#define __sot_dyninv_SolverKine_H__
+/* --------------------------------------------------------------------- */
+/* --- API ------------------------------------------------------------- */
+/* --------------------------------------------------------------------- */
+
+#if defined (WIN32)
+#  if defined (solver_kine_EXPORTS)
+#    define SOTSOLVERKINE_EXPORT __declspec(dllexport)
+#  else
+#    define SOTSOLVERKINE_EXPORT __declspec(dllimport)
+#  endif
+#else
+#  define SOTSOLVERKINE_EXPORT
+#endif
+
+/* --------------------------------------------------------------------- */
+/* --- INCLUDE --------------------------------------------------------- */
+/* --------------------------------------------------------------------- */
+
+
+/* SOT */
+#include <sot-dyninv/signal-helper.h>
+#include <sot-dyninv/entity-helper.h>
+#include <sot-dyninv/stack-template.h>
+#include <sot-dyninv/task-dyn-pd.h>
+#include <soth/HCOD.hpp>
+
+namespace dynamicgraph {
+  namespace sot {
+    namespace dyninv {
+
+      /* --------------------------------------------------------------------- */
+      /* --- CLASS ----------------------------------------------------------- */
+      /* --------------------------------------------------------------------- */
+
+      class SOTSOLVERKINE_EXPORT SolverKine
+	:public ::dynamicgraph::Entity
+	,public ::dynamicgraph::EntityHelper<SolverKine>
+	,public sot::Stack< TaskAbstract >
+	{
+
+	public: /* --- CONSTRUCTOR ---- */
+
+	  SolverKine( const std::string & name );
+
+	public: /* --- STACK INHERITANCE --- */
+
+	  typedef sot::Stack<TaskAbstract> stack_t;
+	  using stack_t::TaskDependancyList_t;
+	  using stack_t::StackIterator_t;
+	  using stack_t::StackConstIterator_t;
+	  using stack_t::stack;
+
+	  virtual TaskDependancyList_t getTaskDependancyList( const TaskAbstract& task );
+	  virtual void addDependancy( const TaskDependancyList_t& depList );
+	  virtual void removeDependancy( const TaskDependancyList_t& depList );
+	  virtual void resetReady( void );
+
+	public: /* --- ENTITY INHERITANCE --- */
+
+	  static const std::string CLASS_NAME;
+	  virtual void display( std::ostream& os ) const;
+	  virtual const std::string& getClassName( void ) const { return CLASS_NAME; }
+
+	  virtual void commandLine( const std::string& cmdLine,
+				    std::istringstream& cmdArgs,
+				    std::ostream& os );
+
+	public:  /* --- SIGNALS --- */
+
+	  DECLARE_SIGNAL_IN(damping,double);
+	  DECLARE_SIGNAL_OUT(control,ml::Vector);
+	  DECLARE_SIGNAL(velocity,OUT,ml::Vector);
+
+	public: /* --- COMMANDS --- */
+	  void debugOnce( void );
+	  bool controlFreeFloating;
+
+	private: /* --- INTERNAL COMPUTATIONS --- */
+	  void refreshTaskTime( int time );
+	  bool checkSolverSize( void );
+	  void resizeSolver( void );
+
+	private:
+	  typedef boost::shared_ptr<soth::HCOD> hcod_ptr_t;
+	  hcod_ptr_t hsolver;
+
+	  std::vector< Eigen::MatrixXd > Ctasks;
+	  std::vector< soth::VectorBound > btasks;
+
+	  Eigen::VectorXd solution;
+
+	}; // class SolverKine
+
+    } // namespace dyninv
+  } // namespace sot
+} // namespace dynamicgraph
+
+
+
+#endif // #ifndef __sot_dyninv_SolverKine_H__
-- 
GitLab