5 #ifndef __pinocchio_multibody_liegroup_vector_space_operation_hpp__
6 #define __pinocchio_multibody_liegroup_vector_space_operation_hpp__
8 #include "pinocchio/multibody/liegroup/liegroup-base.hpp"
11 #include <boost/integer/static_min_max.hpp>
17 template<
int Dim,
typename _Scalar,
int _Options>
20 typedef _Scalar Scalar;
28 template<
int Dim,
typename _Scalar,
int _Options>
30 :
public LieGroupBase< VectorSpaceOperationTpl<Dim,_Scalar,_Options> >
40 assert(size_.value() >= 0);
46 : Base(), size_(other.size_.value())
48 assert(size_.value() >= 0);
53 size_.setValue(other.size_.value());
54 assert(size_.value() >= 0);
67 ConfigVector_t neutral ()
const
69 return ConfigVector_t::Zero(size_.value());
72 std::string name ()
const
74 std::ostringstream oss; oss <<
"R^" << nq();
78 template <
class ConfigL_t,
class ConfigR_t,
class Tangent_t>
79 static void difference_impl(
const Eigen::MatrixBase<ConfigL_t> & q0,
80 const Eigen::MatrixBase<ConfigR_t> & q1,
81 const Eigen::MatrixBase<Tangent_t> & d)
83 PINOCCHIO_EIGEN_CONST_CAST(Tangent_t,d) = q1 - q0;
86 template <ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianOut_t>
87 void dDifference_impl (
const Eigen::MatrixBase<ConfigL_t> &,
88 const Eigen::MatrixBase<ConfigR_t> &,
89 const Eigen::MatrixBase<JacobianOut_t> & J)
const
92 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J) = -JacobianMatrix_t::Identity(size_.value(),size_.value());
94 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J).setIdentity();
97 template <ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianIn_t,
class JacobianOut_t>
98 static void dDifference_product_impl(
const ConfigL_t &,
100 const JacobianIn_t & Jin,
101 JacobianOut_t & Jout,
103 const AssignmentOperatorType op)
107 if (arg == ARG0) Jout = - Jin;
111 if (arg == ARG0) Jout -= Jin;
115 if (arg == ARG0) Jout += Jin;
121 template <
class ConfigIn_t,
class Velocity_t,
class ConfigOut_t>
122 static void integrate_impl(
const Eigen::MatrixBase<ConfigIn_t> & q,
123 const Eigen::MatrixBase<Velocity_t> & v,
124 const Eigen::MatrixBase<ConfigOut_t> & qout)
126 PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t,qout) = q + v;
129 template <
class Config_t,
class Jacobian_t>
130 static void integrateCoeffWiseJacobian_impl(
const Eigen::MatrixBase<Config_t> &,
131 const Eigen::MatrixBase<Jacobian_t> & J)
133 PINOCCHIO_EIGEN_CONST_CAST(Jacobian_t,J).setIdentity();
136 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
137 static void dIntegrate_dq_impl(
const Eigen::MatrixBase<Config_t > & ,
138 const Eigen::MatrixBase<Tangent_t> & ,
139 const Eigen::MatrixBase<JacobianOut_t> & J,
140 const AssignmentOperatorType op=SETTO)
142 Eigen::MatrixBase<JacobianOut_t>& Jout = PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J);
149 Jout.diagonal().array() += Scalar(1);
152 Jout.diagonal().array() -= Scalar(1);
155 assert(
false &&
"Wrong Op requesed value");
160 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
161 static void dIntegrate_dv_impl(
const Eigen::MatrixBase<Config_t > & ,
162 const Eigen::MatrixBase<Tangent_t> & ,
163 const Eigen::MatrixBase<JacobianOut_t> & J,
164 const AssignmentOperatorType op=SETTO)
166 Eigen::MatrixBase<JacobianOut_t>& Jout = PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,J);
173 Jout.diagonal().array() += Scalar(1);
176 Jout.diagonal().array() -= Scalar(1);
179 assert(
false &&
"Wrong Op requesed value");
184 template <
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
185 static void dIntegrate_product_impl(
const Config_t &,
187 const JacobianIn_t & Jin,
188 JacobianOut_t & Jout,
191 const AssignmentOperatorType op)
204 assert(
false &&
"Wrong Op requesed value");
209 template <
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
210 static void dIntegrateTransport_dq_impl(
const Eigen::MatrixBase<Config_t > & ,
211 const Eigen::MatrixBase<Tangent_t> & ,
212 const Eigen::MatrixBase<JacobianIn_t> & Jin,
213 const Eigen::MatrixBase<JacobianOut_t> & Jout)
215 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,Jout) = Jin;
218 template <
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
219 static void dIntegrateTransport_dv_impl(
const Eigen::MatrixBase<Config_t > & ,
220 const Eigen::MatrixBase<Tangent_t> & ,
221 const Eigen::MatrixBase<JacobianIn_t> & Jin,
222 const Eigen::MatrixBase<JacobianOut_t> & Jout)
224 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t,Jout) = Jin;
227 template <
class Config_t,
class Tangent_t,
class Jacobian_t>
228 static void dIntegrateTransport_dq_impl(
const Eigen::MatrixBase<Config_t > & ,
229 const Eigen::MatrixBase<Tangent_t> & ,
230 const Eigen::MatrixBase<Jacobian_t> & ) {}
232 template <
class Config_t,
class Tangent_t,
class Jacobian_t>
233 static void dIntegrateTransport_dv_impl(
const Eigen::MatrixBase<Config_t > & ,
234 const Eigen::MatrixBase<Tangent_t> & ,
235 const Eigen::MatrixBase<Jacobian_t> & ) {}
243 template <
class Config_t>
244 static void normalize_impl (
const Eigen::MatrixBase<Config_t>& )
247 template <
class Config_t>
248 static bool isNormalized_impl (
const Eigen::MatrixBase<Config_t>& ,
const Scalar& )
253 template <
class Config_t>
254 static void random_impl (
const Eigen::MatrixBase<Config_t>& qout)
256 PINOCCHIO_EIGEN_CONST_CAST(Config_t,qout).setRandom();
259 template <
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
260 void randomConfiguration_impl
261 (
const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
262 const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit,
263 const Eigen::MatrixBase<ConfigOut_t> & qout)
const
265 ConfigOut_t & res = PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t,qout).derived();
266 for (
int i = 0; i < nq (); ++i)
268 if(lower_pos_limit[i] == -std::numeric_limits<typename ConfigL_t::Scalar>::infinity() ||
269 upper_pos_limit[i] == std::numeric_limits<typename ConfigR_t::Scalar>::infinity() )
271 std::ostringstream error;
272 error <<
"non bounded limit. Cannot uniformly sample joint at rank " << i;
274 throw std::range_error(error.str());
276 res[i] = lower_pos_limit[i] + (( upper_pos_limit[i] - lower_pos_limit[i]) * rand())/RAND_MAX;
282 return size_.value() == other.size_.value();
287 Eigen::internal::variable_if_dynamic<Index, Dim> size_;
292 #endif // ifndef __pinocchio_multibody_liegroup_vector_space_operation_hpp__