pinocchio  2.1.3
vector-space.hpp
1 //
2 // Copyright (c) 2016-2018 CNRS
3 //
4 
5 #ifndef __pinocchio_vector_space_operation_hpp__
6 #define __pinocchio_vector_space_operation_hpp__
7 
8 #include <stdexcept>
9 
10 #include "pinocchio/multibody/liegroup/liegroup-base.hpp"
11 
12 #include <boost/integer/static_min_max.hpp>
13 
14 namespace pinocchio
15 {
16  template<int Dim, typename Scalar, int Options = 0> struct VectorSpaceOperationTpl;
17 
18  template<int Dim, typename _Scalar, int _Options>
19  struct traits< VectorSpaceOperationTpl<Dim,_Scalar,_Options> >
20  {
21  typedef _Scalar Scalar;
22  enum {
23  Options = _Options,
24  NQ = Dim,
25  NV = Dim
26  };
27  };
28 
29  template<int Dim, typename _Scalar, int _Options>
31  : public LieGroupBase< VectorSpaceOperationTpl<Dim,_Scalar,_Options> >
32  {
33  PINOCCHIO_LIE_GROUP_TPL_PUBLIC_INTERFACE(VectorSpaceOperationTpl);
34 
38  VectorSpaceOperationTpl(int size = boost::static_signed_max<0,Dim>::value)
39  : size_(size)
40  {
41  assert(size_.value() >= 0);
42  }
43 
47  : Base(), size_(other.size_.value())
48  {
49  assert(size_.value() >= 0);
50  }
51 
52  Index nq () const
53  {
54  return size_.value();
55  }
56  Index nv () const
57  {
58  return size_.value();
59  }
60 
61  ConfigVector_t neutral () const
62  {
63  return ConfigVector_t::Zero(size_.value());
64  }
65 
66  std::string name () const
67  {
68  std::ostringstream oss; oss << "R^" << nq();
69  return oss.str ();
70  }
71 
72  template <class ConfigL_t, class ConfigR_t, class Tangent_t>
73  static void difference_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
74  const Eigen::MatrixBase<ConfigR_t> & q1,
75  const Eigen::MatrixBase<Tangent_t> & d)
76  {
77  PINOCCHIO_EIGEN_CONST_CAST(Tangent_t,d) = q1 - q0;
78  }
79 
80  template <ArgumentPosition arg, class ConfigL_t, class ConfigR_t, class JacobianOut_t>
81  void dDifference_impl (const Eigen::MatrixBase<ConfigL_t> &,
82  const Eigen::MatrixBase<ConfigR_t> &,
83  const Eigen::MatrixBase<JacobianOut_t>& J) const
84  {
85  if (arg == ARG0)
86  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J).noalias() = - JacobianMatrix_t::Identity();
87  else if (arg == ARG1)
88  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J).setIdentity();
89  }
90 
91  template <class ConfigIn_t, class Velocity_t, class ConfigOut_t>
92  static void integrate_impl(const Eigen::MatrixBase<ConfigIn_t> & q,
93  const Eigen::MatrixBase<Velocity_t> & v,
94  const Eigen::MatrixBase<ConfigOut_t> & qout)
95  {
96  PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t,qout) = q + v;
97  }
98 
99  template <class Config_t, class Jacobian_t>
100  static void integrateCoeffWiseJacobian_impl(const Eigen::MatrixBase<Config_t> &,
101  const Eigen::MatrixBase<Jacobian_t> & J)
102  {
103  PINOCCHIO_EIGEN_CONST_CAST(Jacobian_t,J).setIdentity();
104  }
105 
106  template <class Config_t, class Tangent_t, class JacobianOut_t>
107  static void dIntegrate_dq_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
108  const Eigen::MatrixBase<Tangent_t> & /*v*/,
109  const Eigen::MatrixBase<JacobianOut_t>& J)
110  {
111  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J).setIdentity();
112  }
113 
114  template <class Config_t, class Tangent_t, class JacobianOut_t>
115  static void dIntegrate_dv_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
116  const Eigen::MatrixBase<Tangent_t> & /*v*/,
117  const Eigen::MatrixBase<JacobianOut_t>& J)
118  {
119  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J).setIdentity();
120  }
121 
122 
123  // template <class ConfigL_t, class ConfigR_t>
124  // static double squaredDistance_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
125  // const Eigen::MatrixBase<ConfigR_t> & q1)
126 
127  template <class Config_t>
128  static void normalize_impl (const Eigen::MatrixBase<Config_t>& /*qout*/)
129  {}
130 
131  template <class Config_t>
132  void random_impl (const Eigen::MatrixBase<Config_t>& qout) const
133  {
134  PINOCCHIO_EIGEN_CONST_CAST(Config_t,qout).setRandom();
135  }
136 
137  template <class ConfigL_t, class ConfigR_t, class ConfigOut_t>
138  void randomConfiguration_impl
139  (const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
140  const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit,
141  const Eigen::MatrixBase<ConfigOut_t> & qout) const
142  {
143  ConfigOut_t & res = PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t,qout).derived();
144  for (int i = 0; i < nq (); ++i)
145  {
146  if(lower_pos_limit[i] == -std::numeric_limits<typename ConfigL_t::Scalar>::infinity() ||
147  upper_pos_limit[i] == std::numeric_limits<typename ConfigR_t::Scalar>::infinity() )
148  {
149  std::ostringstream error;
150  error << "non bounded limit. Cannot uniformly sample joint at rank " << i;
151  // assert(false && "non bounded limit. Cannot uniformly sample joint revolute");
152  throw std::range_error(error.str());
153  }
154  res[i] = lower_pos_limit[i] + (( upper_pos_limit[i] - lower_pos_limit[i]) * rand())/RAND_MAX;
155  }
156  }
157 
158  private:
159 
160  Eigen::internal::variable_if_dynamic<Index, Dim> size_;
161  }; // struct VectorSpaceOperationTpl
162 
163 } // namespace pinocchio
164 
165 #endif // ifndef __pinocchio_vector_space_operation_hpp__
int nv(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNvVisitor to get the dimension of the joint tangent space...
int nq(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNqVisitor to get the dimension of the joint configuration space...
VectorSpaceOperationTpl(int size=boost::static_signed_max< 0, Dim >::value)
std::string name(const LieGroupGenericTpl< LieGroupCollection > &lg)
Visit a LieGroupVariant to get the name of it.
VectorSpaceOperationTpl(const VectorSpaceOperationTpl &other)
Main pinocchio namespace.
Definition: treeview.dox:24
void neutral(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ReturnType > &qout)
Return the neutral configuration element related to the model configuration space.
Common traits structure to fully define base classes for CRTP.
Definition: spatial/fwd.hpp:29