Skip to content
Snippets Groups Projects
joint-base.hpp 5.45 KiB
Newer Older
#ifndef __se3_joint_base_hpp__
#define __se3_joint_base_hpp__
Nicolas Mansard's avatar
Nicolas Mansard committed

#include "pinocchio/spatial/fwd.hpp"
#include "pinocchio/spatial/motion.hpp"
#include "pinocchio/multibody/constraint.hpp"
Nicolas Mansard's avatar
Nicolas Mansard committed
#include <Eigen/Geometry>
Nicolas Mansard's avatar
Nicolas Mansard committed
#include <Eigen/StdVector>
#include <boost/variant.hpp>
Nicolas Mansard's avatar
Nicolas Mansard committed

namespace se3
{
  template<class C> struct traits {};

   * *** FORWARD ***
   * SE3    = SE3 * J::SE3
   * Motion = J::Motion
   * Motion = J::Constraint*J::JointMotion + J::Bias + Motion^J::Motion
   * Force  = Inertia*Motion  + Inertia.vxiv(Motion)
   *
   * *** BACKWARD *** 
   * J::JointForce = J::Constraint::Transpose*J::Force
   */

  /* CRBA operations
   *
   * *** FORWARD ***
   * J::calc(q)
   * Inertia = Inertia
   *
   * *** BACKWARD *** 
   * Inertia += SE3::act(Inertia)
   * F = Inertia*J::Constraint
   * JointInertia.block = J::Constraint::Transpose*F
   * *** *** INNER ***
   *     F = SE3::act(f)
   *     JointInertia::block = J::Constraint::Transpose*F
   */

  /* Jacobian operations
   *
   * internal::ActionReturn<Constraint>::Type
   * Constraint::se3Action
   */
  typedef int Index;						     \
  typedef prefix traits<Joint>::JointData JointData;		     \
  typedef prefix traits<Joint>::JointModel JointModel;	     \
  typedef prefix traits<Joint>::Constraint_t Constraint_t;	     \
  typedef prefix traits<Joint>::Transformation_t Transformation_t; \
  typedef prefix traits<Joint>::Motion_t Motion_t;		     \
  typedef prefix traits<Joint>::Bias_t Bias_t;		     \
  typedef prefix traits<Joint>::F_t F_t;			     \
  enum {							     \
    NQ = traits<Joint>::NQ,					     \
    NV = traits<Joint>::NV					     \
#define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_ARG()
#define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG(typename)

#else

#define SE3_JOINT_TYPEDEF_ARG()              \
  typedef int Index;                 \
  typedef typename traits<Joint>::JointData JointData;         \
  typedef typename traits<Joint>::JointModel JointModel;       \
  typedef typename traits<Joint>::Constraint_t Constraint_t;       \
  typedef typename traits<Joint>::Transformation_t Transformation_t; \
  typedef typename traits<Joint>::Motion_t Motion_t;         \
  typedef typename traits<Joint>::Bias_t Bias_t;         \
  typedef typename traits<Joint>::F_t F_t;           \
  enum {                   \
    NQ = traits<Joint>::NQ,              \
    NV = traits<Joint>::NV               \
  }

#define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_ARG()
#define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG()

#endif

#define SE3_JOINT_USE_INDEXES \
    typedef JointModelBase<JointModel> Base; \
    using Base::idx_q; \
    using Base::idx_v

  template<typename _JointData>
Nicolas Mansard's avatar
Nicolas Mansard committed
  struct JointDataBase
  {
    typedef typename traits<_JointData>::Joint Joint;
Nicolas Mansard's avatar
Nicolas Mansard committed

Nicolas Mansard's avatar
Nicolas Mansard committed
    JointData& derived() { return *static_cast<JointData*>(this); }
Nicolas Mansard's avatar
Nicolas Mansard committed
    const JointData& derived() const { return *static_cast<const JointData*>(this); }
    const Constraint_t     & S() const  { return static_cast<const JointData*>(this)->S;   }
    const Transformation_t & M() const  { return static_cast<const JointData*>(this)->M;   }
    const Motion_t         & v() const  { return static_cast<const JointData*>(this)->v;   }
    const Bias_t           & c() const  { return static_cast<const JointData*>(this)->c;   }
    F_t& F()        { return static_cast<      JointData*>(this)->F; }
Nicolas Mansard's avatar
Nicolas Mansard committed
  };

  template<typename _JointModel>
Nicolas Mansard's avatar
Nicolas Mansard committed
  struct JointModelBase
Nicolas Mansard's avatar
Nicolas Mansard committed
  {
    typedef typename traits<_JointModel>::Joint Joint;
Nicolas Mansard's avatar
Nicolas Mansard committed

Nicolas Mansard's avatar
Nicolas Mansard committed
    JointModel& derived() { return *static_cast<JointModel*>(this); }
    const JointModel& derived() const { return *static_cast<const JointModel*>(this); }

    JointData createData() const { return static_cast<const JointModel*>(this)->createData(); }
    void calc( JointData& data, 
	       const Eigen::VectorXd & qs ) const
    { return static_cast<const JointModel*>(this)->calc(data,qs); }
Nicolas Mansard's avatar
Nicolas Mansard committed
    void calc( JointData& data, 
	       const Eigen::VectorXd & qs, 
	       const Eigen::VectorXd & vs ) const
    { return static_cast<const JointModel*>(this)->calc(data,qs,vs); }
    Index i_id; // ID of the joint in the multibody list.
    int i_q;    // Index of the joint configuration in the joint configuration vector.
    int i_v;    // Index of the joint velocity in the joint velocity vector.
          int     nv()    const { return NV; }
          int     nq()    const { return NQ; }
    const int &   idx_q() const { return i_q; }
    const int &   idx_v() const { return i_v; }
    const Index & id()    const { return i_id; }
    void setIndexes(Index id,int q,int v) { i_id = id, i_q = q; i_v = v; }
Nicolas Mansard's avatar
Nicolas Mansard committed

    typename D::template ConstFixedSegmentReturnType<NV>::Type jointMotion(const Eigen::MatrixBase<D>& a) const     { return a.template segment<NV>(i_v); }
    typename D::template FixedSegmentReturnType<NV>::Type jointMotion(Eigen::MatrixBase<D>& a) const 
    { return a.template segment<NV>(i_v); }
    typename D::template ConstFixedSegmentReturnType<NV>::Type jointForce(const Eigen::MatrixBase<D>& tau) const 
    { return tau.template segment<NV>(i_v); }
    typename D::template FixedSegmentReturnType<NV>::Type jointForce(Eigen::MatrixBase<D>& tau) const 
    { return tau.template segment<NV>(i_v); }
Nicolas Mansard's avatar
Nicolas Mansard committed
} // namespace se3

#endif // ifndef __se3_joint_base_hpp__