5 #ifndef __pinocchio_cartesian_product_variant_hpp__
6 #define __pinocchio_cartesian_product_variant_hpp__
8 #include "pinocchio/multibody/liegroup/liegroup-base.hpp"
9 #include "pinocchio/multibody/liegroup/liegroup-collection.hpp"
11 #include "pinocchio/container/aligned-vector.hpp"
16 template<
typename Scalar,
int Options = 0,
17 template<
typename,
int>
class LieGroupCollectionTpl = LieGroupCollectionDefaultTpl>
21 template<
typename _Scalar,
int _Options,
template<
typename,
int>
class LieGroupCollectionTpl>
24 typedef _Scalar Scalar;
35 template<
typename _Scalar,
int _Options,
template<
typename,
int>
class LieGroupCollectionTpl>
37 :
public LieGroupBase<CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl> >
39 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
43 typedef LieGroupCollectionTpl<Scalar, Options> LieGroupCollection;
44 typedef typename LieGroupCollection::LieGroupVariant LieGroupVariant;
50 , lg_nqs(0), lg_nvs(0)
61 , lg_nqs(0), lg_nvs(0)
76 , lg_nqs(0), lg_nvs(0)
87 void append(
const LieGroupGeneric & lg);
94 template<
typename LieGroupDerived>
133 template<
typename LieGroupDerived>
136 append<LieGroupDerived>(lg);
140 int nq()
const {
return m_nq; }
141 int nv()
const {
return m_nv; }
143 std::string name()
const {
return m_name; }
145 ConfigVector_t neutral()
const {
return m_neutral; }
147 template <
class ConfigL_t,
class ConfigR_t,
class Tangent_t>
148 void difference_impl(
const Eigen::MatrixBase<ConfigL_t> & q0,
149 const Eigen::MatrixBase<ConfigR_t> & q1,
150 const Eigen::MatrixBase<Tangent_t> & d)
const;
152 template <ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianOut_t>
153 void dDifference_impl(
const Eigen::MatrixBase<ConfigL_t> & q0,
154 const Eigen::MatrixBase<ConfigR_t> & q1,
155 const Eigen::MatrixBase<JacobianOut_t> & J)
const;
157 template <ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianIn_t,
class JacobianOut_t>
158 void dDifference_product_impl(
const ConfigL_t & q0,
159 const ConfigR_t & q1,
160 const JacobianIn_t & Jin,
161 JacobianOut_t & Jout,
162 bool dDifferenceOnTheLeft,
163 const AssignmentOperatorType op)
const;
165 template <
class ConfigIn_t,
class Velocity_t,
class ConfigOut_t>
166 void integrate_impl(
const Eigen::MatrixBase<ConfigIn_t> & q,
167 const Eigen::MatrixBase<Velocity_t> & v,
168 const Eigen::MatrixBase<ConfigOut_t> & qout)
const;
170 template <
class Config_t,
class Jacobian_t>
171 void integrateCoeffWiseJacobian_impl(
const Eigen::MatrixBase<Config_t> & q,
172 const Eigen::MatrixBase<Jacobian_t> & J)
const;
174 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
175 void dIntegrate_dq_impl(
const Eigen::MatrixBase<Config_t > & q,
176 const Eigen::MatrixBase<Tangent_t> & v,
177 const Eigen::MatrixBase<JacobianOut_t> & J,
178 const AssignmentOperatorType op=SETTO)
const;
180 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
181 void dIntegrate_dv_impl(
const Eigen::MatrixBase<Config_t > & q,
182 const Eigen::MatrixBase<Tangent_t> & v,
183 const Eigen::MatrixBase<JacobianOut_t> & J,
184 const AssignmentOperatorType op=SETTO)
const;
186 template <
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
187 void dIntegrate_product_impl(
const Config_t & q,
189 const JacobianIn_t & Jin,
190 JacobianOut_t & Jout,
191 bool dIntegrateOnTheLeft,
193 const AssignmentOperatorType op)
const;
195 template <
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
196 void dIntegrateTransport_dq_impl(
const Eigen::MatrixBase<Config_t > & q,
197 const Eigen::MatrixBase<Tangent_t> & v,
198 const Eigen::MatrixBase<JacobianIn_t> & J_in,
199 const Eigen::MatrixBase<JacobianOut_t> & J_out)
const;
201 template <
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
202 void dIntegrateTransport_dv_impl(
const Eigen::MatrixBase<Config_t > & q,
203 const Eigen::MatrixBase<Tangent_t> & v,
204 const Eigen::MatrixBase<JacobianIn_t> & J_in,
205 const Eigen::MatrixBase<JacobianOut_t> & J_out)
const;
207 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
208 void dIntegrateTransport_dq_impl(
const Eigen::MatrixBase<Config_t > & q,
209 const Eigen::MatrixBase<Tangent_t> & v,
210 const Eigen::MatrixBase<JacobianOut_t> & J)
const;
212 template <
class Config_t,
class Tangent_t,
class JacobianOut_t>
213 void dIntegrateTransport_dv_impl(
const Eigen::MatrixBase<Config_t > & q,
214 const Eigen::MatrixBase<Tangent_t> & v,
215 const Eigen::MatrixBase<JacobianOut_t> & J)
const;
217 template <
class ConfigL_t,
class ConfigR_t>
218 Scalar squaredDistance_impl(
const Eigen::MatrixBase<ConfigL_t> & q0,
219 const Eigen::MatrixBase<ConfigR_t> & q1)
const;
221 template <
class Config_t>
222 void normalize_impl (
const Eigen::MatrixBase<Config_t>& qout)
const;
224 template <
class Config_t>
225 bool isNormalized_impl (
const Eigen::MatrixBase<Config_t>& qout,
226 const Scalar& prec)
const;
228 template <
class Config_t>
229 void random_impl (
const Eigen::MatrixBase<Config_t>& qout)
const;
231 template <
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
232 void randomConfiguration_impl(
const Eigen::MatrixBase<ConfigL_t> & lower,
233 const Eigen::MatrixBase<ConfigR_t> & upper,
234 const Eigen::MatrixBase<ConfigOut_t> & qout)
const;
236 template <
class ConfigL_t,
class ConfigR_t>
237 bool isSameConfiguration_impl(
const Eigen::MatrixBase<ConfigL_t> & q0,
238 const Eigen::MatrixBase<ConfigR_t> & q1,
239 const Scalar & prec)
const;
243 template <
typename LieGroup1,
typename LieGroup2>
244 bool isEqual(
const CartesianProductOperation<LieGroup1, LieGroup2> & other)
const;
248 PINOCCHIO_ALIGNED_STD_VECTOR(LieGroupGeneric) liegroups;
250 std::vector<Index> lg_nqs, lg_nvs;
253 ConfigVector_t m_neutral;
259 #include <pinocchio/multibody/liegroup/cartesian-product-variant.hxx>
261 #endif // ifndef __pinocchio_cartesian_product_variant_hpp__