vector-space.hpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2016-2020 CNRS INRIA
3 //
4 
5 #ifndef __pinocchio_multibody_liegroup_vector_space_operation_hpp__
6 #define __pinocchio_multibody_liegroup_vector_space_operation_hpp__
7 
8 #include "pinocchio/multibody/liegroup/liegroup-base.hpp"
9 
10 #include <stdexcept>
11 #include <boost/integer/static_min_max.hpp>
12 
13 namespace pinocchio
14 {
15  template<int Dim, typename Scalar, int Options = 0> struct VectorSpaceOperationTpl;
16 
17  template<int Dim, typename _Scalar, int _Options>
18  struct traits< VectorSpaceOperationTpl<Dim,_Scalar,_Options> >
19  {
20  typedef _Scalar Scalar;
21  enum {
22  Options = _Options,
23  NQ = Dim,
24  NV = Dim
25  };
26  };
27 
28  template<int Dim, typename _Scalar, int _Options>
30  : public LieGroupBase< VectorSpaceOperationTpl<Dim,_Scalar,_Options> >
31  {
33 
37  VectorSpaceOperationTpl(int size = boost::static_signed_max<0,Dim>::value)
38  : size_(size)
39  {
40  assert(size_.value() >= 0);
41  }
42 
46  : Base(), size_(other.size_.value())
47  {
48  assert(size_.value() >= 0);
49  }
50 
51  Index nq () const
52  {
53  return size_.value();
54  }
55  Index nv () const
56  {
57  return size_.value();
58  }
59 
61  {
62  return ConfigVector_t::Zero(size_.value());
63  }
64 
65  std::string name () const
66  {
67  std::ostringstream oss; oss << "R^" << nq();
68  return oss.str ();
69  }
70 
71  template <class ConfigL_t, class ConfigR_t, class Tangent_t>
72  static void difference_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
73  const Eigen::MatrixBase<ConfigR_t> & q1,
74  const Eigen::MatrixBase<Tangent_t> & d)
75  {
76  PINOCCHIO_EIGEN_CONST_CAST(Tangent_t,d) = q1 - q0;
77  }
78 
79  template <ArgumentPosition arg, class ConfigL_t, class ConfigR_t, class JacobianOut_t>
80  void dDifference_impl (const Eigen::MatrixBase<ConfigL_t> &,
81  const Eigen::MatrixBase<ConfigR_t> &,
82  const Eigen::MatrixBase<JacobianOut_t> & J) const
83  {
84  if (arg == ARG0)
85  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J) = -JacobianMatrix_t::Identity(size_.value(),size_.value());
86  else if (arg == ARG1)
87  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J).setIdentity();
88  }
89 
90  template <ArgumentPosition arg, class ConfigL_t, class ConfigR_t, class JacobianIn_t, class JacobianOut_t>
91  void dDifference_product_impl(const ConfigL_t &,
92  const ConfigR_t &,
93  const JacobianIn_t & Jin,
94  JacobianOut_t & Jout,
95  bool,
96  const AssignmentOperatorType op) const
97  {
98  switch (op) {
99  case SETTO:
100  if (arg == ARG0) Jout = - Jin;
101  else Jout = Jin;
102  return;
103  case ADDTO:
104  if (arg == ARG0) Jout -= Jin;
105  else Jout += Jin;
106  return;
107  case RMTO:
108  if (arg == ARG0) Jout += Jin;
109  else Jout -= Jin;
110  return;
111  }
112  }
113 
114  template <class ConfigIn_t, class Velocity_t, class ConfigOut_t>
115  static void integrate_impl(const Eigen::MatrixBase<ConfigIn_t> & q,
116  const Eigen::MatrixBase<Velocity_t> & v,
117  const Eigen::MatrixBase<ConfigOut_t> & qout)
118  {
119  PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t,qout) = q + v;
120  }
121 
122  template <class Config_t, class Jacobian_t>
123  static void integrateCoeffWiseJacobian_impl(const Eigen::MatrixBase<Config_t> &,
124  const Eigen::MatrixBase<Jacobian_t> & J)
125  {
126  PINOCCHIO_EIGEN_CONST_CAST(Jacobian_t,J).setIdentity();
127  }
128 
129  template <class Config_t, class Tangent_t, class JacobianOut_t>
130  static void dIntegrate_dq_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
131  const Eigen::MatrixBase<Tangent_t> & /*v*/,
132  const Eigen::MatrixBase<JacobianOut_t> & J,
133  const AssignmentOperatorType op=SETTO)
134  {
135  Eigen::MatrixBase<JacobianOut_t>& Jout = PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J);
136  switch(op)
137  {
138  case SETTO:
139  Jout.setIdentity();
140  break;
141  case ADDTO:
142  Jout.diagonal().array() += Scalar(1);
143  break;
144  case RMTO:
145  Jout.diagonal().array() -= Scalar(1);
146  break;
147  default:
148  assert(false && "Wrong Op requesed value");
149  break;
150  }
151  }
152 
153  template <class Config_t, class Tangent_t, class JacobianOut_t>
154  static void dIntegrate_dv_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
155  const Eigen::MatrixBase<Tangent_t> & /*v*/,
156  const Eigen::MatrixBase<JacobianOut_t> & J,
157  const AssignmentOperatorType op=SETTO)
158  {
159  Eigen::MatrixBase<JacobianOut_t>& Jout = PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J);
160  switch(op)
161  {
162  case SETTO:
163  Jout.setIdentity();
164  break;
165  case ADDTO:
166  Jout.diagonal().array() += Scalar(1);
167  break;
168  case RMTO:
169  Jout.diagonal().array() -= Scalar(1);
170  break;
171  default:
172  assert(false && "Wrong Op requesed value");
173  break;
174  }
175  }
176 
177  template <class Config_t, class Tangent_t, class JacobianIn_t, class JacobianOut_t>
178  void dIntegrate_product_impl(const Config_t &,
179  const Tangent_t &,
180  const JacobianIn_t & Jin,
181  JacobianOut_t & Jout,
182  bool,
183  const ArgumentPosition,
184  const AssignmentOperatorType op) const
185  {
186  switch(op) {
187  case SETTO:
188  Jout = Jin;
189  break;
190  case ADDTO:
191  Jout += Jin;
192  break;
193  case RMTO:
194  Jout -= Jin;
195  break;
196  default:
197  assert(false && "Wrong Op requesed value");
198  break;
199  }
200  }
201 
202  template <class Config_t, class Tangent_t, class JacobianIn_t, class JacobianOut_t>
203  void dIntegrateTransport_dq_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
204  const Eigen::MatrixBase<Tangent_t> & /*v*/,
205  const Eigen::MatrixBase<JacobianIn_t> & Jin,
206  const Eigen::MatrixBase<JacobianOut_t> & Jout) const
207  {
208  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,Jout) = Jin;
209  }
210 
211  template <class Config_t, class Tangent_t, class JacobianIn_t, class JacobianOut_t>
212  void dIntegrateTransport_dv_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
213  const Eigen::MatrixBase<Tangent_t> & /*v*/,
214  const Eigen::MatrixBase<JacobianIn_t> & Jin,
215  const Eigen::MatrixBase<JacobianOut_t> & Jout) const
216  {
217  PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,Jout) = Jin;
218  }
219 
220  template <class Config_t, class Tangent_t, class Jacobian_t>
221  void dIntegrateTransport_dq_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
222  const Eigen::MatrixBase<Tangent_t> & /*v*/,
223  const Eigen::MatrixBase<Jacobian_t> & /*J*/) const {}
224 
225  template <class Config_t, class Tangent_t, class Jacobian_t>
226  void dIntegrateTransport_dv_impl(const Eigen::MatrixBase<Config_t > & /*q*/,
227  const Eigen::MatrixBase<Tangent_t> & /*v*/,
228  const Eigen::MatrixBase<Jacobian_t> & /*J*/) const {}
229 
230 
231 
232  // template <class ConfigL_t, class ConfigR_t>
233  // static double squaredDistance_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
234  // const Eigen::MatrixBase<ConfigR_t> & q1)
235 
236  template <class Config_t>
237  static void normalize_impl (const Eigen::MatrixBase<Config_t>& /*qout*/)
238  {}
239 
240  template <class Config_t>
241  static bool isNormalized_impl (const Eigen::MatrixBase<Config_t>& /*qout*/, const Scalar& /*prec*/)
242  {
243  return true;
244  }
245 
246  template <class Config_t>
247  void random_impl (const Eigen::MatrixBase<Config_t>& qout) const
248  {
249  PINOCCHIO_EIGEN_CONST_CAST(Config_t,qout).setRandom();
250  }
251 
252  template <class ConfigL_t, class ConfigR_t, class ConfigOut_t>
253  void randomConfiguration_impl
254  (const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
255  const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit,
256  const Eigen::MatrixBase<ConfigOut_t> & qout) const
257  {
258  ConfigOut_t & res = PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t,qout).derived();
259  for (int i = 0; i < nq (); ++i)
260  {
261  if(lower_pos_limit[i] == -std::numeric_limits<typename ConfigL_t::Scalar>::infinity() ||
262  upper_pos_limit[i] == std::numeric_limits<typename ConfigR_t::Scalar>::infinity() )
263  {
264  std::ostringstream error;
265  error << "non bounded limit. Cannot uniformly sample joint at rank " << i;
266  // assert(false && "non bounded limit. Cannot uniformly sample joint revolute");
267  throw std::range_error(error.str());
268  }
269  res[i] = lower_pos_limit[i] + (( upper_pos_limit[i] - lower_pos_limit[i]) * rand())/RAND_MAX;
270  }
271  }
272 
273  bool isEqual_impl (const VectorSpaceOperationTpl& other) const
274  {
275  return size_.value() == other.size_.value();
276  }
277 
278  private:
279 
280  Eigen::internal::variable_if_dynamic<Index, Dim> size_;
281  }; // struct VectorSpaceOperationTpl
282 
283 } // namespace pinocchio
284 
285 #endif // ifndef __pinocchio_multibody_liegroup_vector_space_operation_hpp__
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > const Eigen::MatrixBase< TangentVectorType > & v
int NQ
Definition: dpendulum.py:8
void dDifference_product_impl(const ConfigL_t &, const ConfigR_t &, const JacobianIn_t &Jin, JacobianOut_t &Jout, bool, const AssignmentOperatorType op) const
ArgumentPosition
Argument position. Used as template parameter to refer to an argument.
Definition: src/fwd.hpp:59
void dIntegrateTransport_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianIn_t > &Jin, const Eigen::MatrixBase< JacobianOut_t > &Jout) const
int nq(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNqVisitor to get the dimension of the joint configuration space...
ConfigVector_t neutral() const
std::size_t size(custom_string const &s)
#define PINOCCHIO_LIE_GROUP_TPL_PUBLIC_INTERFACE(Derived)
VectorSpaceOperationTpl(int size=boost::static_signed_max< 0, Dim >::value)
void random_impl(const Eigen::MatrixBase< Config_t > &qout) const
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > & q
#define PINOCCHIO_EIGEN_CONST_CAST(TYPE, OBJ)
Macro for an automatic const_cast.
SE3::Scalar Scalar
Definition: conversions.cpp:13
AssignmentOperatorType
Definition: src/fwd.hpp:68
static void normalize_impl(const Eigen::MatrixBase< Config_t > &)
static void integrateCoeffWiseJacobian_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Jacobian_t > &J)
d
Definition: ur5x4.py:45
static void integrate_impl(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Velocity_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout)
static void dIntegrate_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianOut_t > &J, const AssignmentOperatorType op=SETTO)
VectorSpaceOperationTpl(const VectorSpaceOperationTpl &other)
void dIntegrateTransport_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< Jacobian_t > &) const
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > const Eigen::MatrixBase< ConfigVectorIn2 > & q1
static void dIntegrate_dv_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianOut_t > &J, const AssignmentOperatorType op=SETTO)
static bool isNormalized_impl(const Eigen::MatrixBase< Config_t > &, const Scalar &)
Main pinocchio namespace.
Definition: timings.cpp:30
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > & q0
res
void dDifference_impl(const Eigen::MatrixBase< ConfigL_t > &, const Eigen::MatrixBase< ConfigR_t > &, const Eigen::MatrixBase< JacobianOut_t > &J) const
Common traits structure to fully define base classes for CRTP.
Definition: src/fwd.hpp:44
std::size_t Index
void dIntegrate_product_impl(const Config_t &, const Tangent_t &, const JacobianIn_t &Jin, JacobianOut_t &Jout, bool, const ArgumentPosition, const AssignmentOperatorType op) const
Eigen::internal::variable_if_dynamic< Index, Dim > size_
void dIntegrateTransport_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< JacobianIn_t > &Jin, const Eigen::MatrixBase< JacobianOut_t > &Jout) const
NV
Definition: dcrba.py:444
void dIntegrateTransport_dq_impl(const Eigen::MatrixBase< Config_t > &, const Eigen::MatrixBase< Tangent_t > &, const Eigen::MatrixBase< Jacobian_t > &) const
bool isEqual_impl(const VectorSpaceOperationTpl &other) const
int value
static void difference_impl(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< Tangent_t > &d)


pinocchio
Author(s):
autogenerated on Tue Jun 1 2021 02:45:05