5 #ifndef __pinocchio_multibody_liegroup_cartesian_product_operation_hpp__
6 #define __pinocchio_multibody_liegroup_cartesian_product_operation_hpp__
12 template<
int dim1,
int dim2>
39 template<
typename LieGroup1,
typename LieGroup2>
42 template<
typename LieGroup1,
typename LieGroup2>
56 template<
typename LieGroup1,
typename LieGroup2>
57 struct CartesianProductOperation
58 :
public LieGroupBase<CartesianProductOperation<LieGroup1, LieGroup2>>
73 return lg1.nq() +
lg2.nq();
79 return lg1.nv() +
lg2.nv();
93 std::ostringstream oss;
94 oss <<
lg1.name() <<
"*" <<
lg2.name();
98 template<
class ConfigL_t,
class ConfigR_t,
class Tangent_t>
100 const Eigen::MatrixBase<ConfigL_t> &
q0,
101 const Eigen::MatrixBase<ConfigR_t> &
q1,
102 const Eigen::MatrixBase<Tangent_t> &
d)
const
108 template<ArgumentPosition arg,
class ConfigL_t,
class ConfigR_t,
class JacobianOut_t>
110 const Eigen::MatrixBase<ConfigL_t> &
q0,
111 const Eigen::MatrixBase<ConfigR_t> &
q1,
112 const Eigen::MatrixBase<JacobianOut_t> &
J)
const
121 template<
class ConfigIn_t,
class Velocity_t,
class ConfigOut_t>
123 const Eigen::MatrixBase<ConfigIn_t> &
q,
124 const Eigen::MatrixBase<Velocity_t> &
v,
125 const Eigen::MatrixBase<ConfigOut_t> &
qout)
const
131 template<
class Config_t,
class Jacobian_t>
133 const Eigen::MatrixBase<Config_t> &
q,
const Eigen::MatrixBase<Jacobian_t> &
J)
const
135 assert(
J.rows() ==
nq() &&
J.cols() ==
nv() &&
"J is not of the right dimension");
137 J_.topRightCorner(
lg1.nq(),
lg2.nv()).setZero();
138 J_.bottomLeftCorner(
lg2.nq(),
lg1.nv()).setZero();
140 lg1.integrateCoeffWiseJacobian(
Q1(
q), J_.topLeftCorner(
lg1.nq(),
lg1.nv()));
141 lg2.integrateCoeffWiseJacobian(
Q2(
q), J_.bottomRightCorner(
lg2.nq(),
lg2.nv()));
144 template<
class Config_t,
class Tangent_t,
class JacobianOut_t>
146 const Eigen::MatrixBase<Config_t> &
q,
147 const Eigen::MatrixBase<Tangent_t> &
v,
148 const Eigen::MatrixBase<JacobianOut_t> &
J,
163 assert(
false &&
"Wrong Op requesed value");
168 template<
class Config_t,
class Tangent_t,
class JacobianOut_t>
170 const Eigen::MatrixBase<Config_t> &
q,
171 const Eigen::MatrixBase<Tangent_t> &
v,
172 const Eigen::MatrixBase<JacobianOut_t> &
J,
187 assert(
false &&
"Wrong Op requesed value");
192 template<
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
194 const Eigen::MatrixBase<Config_t> &
q,
195 const Eigen::MatrixBase<Tangent_t> &
v,
196 const Eigen::MatrixBase<JacobianIn_t> & J_in,
197 const Eigen::MatrixBase<JacobianOut_t> & J_out)
const
201 lg1.dIntegrateTransport_dq(
202 Q1(
q),
V1(
v), Jin.template topRows<LieGroup1::NV>(),
203 Jout.template topRows<LieGroup1::NV>());
204 lg2.dIntegrateTransport_dq(
205 Q2(
q),
V2(
v), Jin.template bottomRows<LieGroup2::NV>(),
206 Jout.template bottomRows<LieGroup2::NV>());
209 template<
class Config_t,
class Tangent_t,
class JacobianIn_t,
class JacobianOut_t>
211 const Eigen::MatrixBase<Config_t> &
q,
212 const Eigen::MatrixBase<Tangent_t> &
v,
213 const Eigen::MatrixBase<JacobianIn_t> & J_in,
214 const Eigen::MatrixBase<JacobianOut_t> & J_out)
const
218 lg1.dIntegrateTransport_dv(
219 Q1(
q),
V1(
v), Jin.template topRows<LieGroup1::NV>(),
220 Jout.template topRows<LieGroup1::NV>());
221 lg2.dIntegrateTransport_dv(
222 Q2(
q),
V2(
v), Jin.template bottomRows<LieGroup2::NV>(),
223 Jout.template bottomRows<LieGroup2::NV>());
226 template<
class Config_t,
class Tangent_t,
class Jacobian_t>
228 const Eigen::MatrixBase<Config_t> &
q,
229 const Eigen::MatrixBase<Tangent_t> &
v,
230 const Eigen::MatrixBase<Jacobian_t> & Jin)
const
233 lg1.dIntegrateTransport_dq(
Q1(
q),
V1(
v),
J.template topRows<LieGroup1::NV>());
234 lg2.dIntegrateTransport_dq(
Q2(
q),
V2(
v),
J.template bottomRows<LieGroup2::NV>());
237 template<
class Config_t,
class Tangent_t,
class Jacobian_t>
239 const Eigen::MatrixBase<Config_t> &
q,
240 const Eigen::MatrixBase<Tangent_t> &
v,
241 const Eigen::MatrixBase<Jacobian_t> & Jin)
const
244 lg1.dIntegrateTransport_dv(
Q1(
q),
V1(
v),
J.template topRows<LieGroup1::NV>());
245 lg2.dIntegrateTransport_dv(
Q2(
q),
V2(
v),
J.template bottomRows<LieGroup2::NV>());
248 template<
class ConfigL_t,
class ConfigR_t>
250 const Eigen::MatrixBase<ConfigL_t> &
q0,
const Eigen::MatrixBase<ConfigR_t> &
q1)
const
255 template<
class Config_t>
262 template<
class Config_t>
268 template<
class Config_t>
275 template<
class ConfigL_t,
class ConfigR_t,
class ConfigOut_t>
277 const Eigen::MatrixBase<ConfigL_t> & lower,
278 const Eigen::MatrixBase<ConfigR_t> & upper,
279 const Eigen::MatrixBase<ConfigOut_t> &
qout)
const
285 template<
class ConfigL_t,
class ConfigR_t>
287 const Eigen::MatrixBase<ConfigL_t> &
q0,
288 const Eigen::MatrixBase<ConfigR_t> &
q1,
289 const Scalar & prec)
const
291 return lg1.isSameConfiguration(
Q1(
q0),
Q1(
q1), prec)
297 return lg1 == other.lg1 &&
lg2 == other.lg2;
306 #if EIGEN_VERSION_AT_LEAST(3, 2, 1)
307 #define REMOVE_IF_EIGEN_TOO_LOW(x) x
309 #define REMOVE_IF_EIGEN_TOO_LOW(x)
312 template<
typename Config>
313 typename Config ::template ConstFixedSegmentReturnType<LieGroup1::NQ>::Type
314 Q1(
const Eigen::MatrixBase<Config> &
q)
const
318 template<
typename Config>
319 typename Config ::template ConstFixedSegmentReturnType<LieGroup2::NQ>::Type
320 Q2(
const Eigen::MatrixBase<Config> &
q)
const
324 template<
typename Tangent>
325 typename Tangent::template ConstFixedSegmentReturnType<LieGroup1::NV>::Type
326 V1(
const Eigen::MatrixBase<Tangent> &
v)
const
330 template<
typename Tangent>
331 typename Tangent::template ConstFixedSegmentReturnType<LieGroup2::NV>::Type
332 V2(
const Eigen::MatrixBase<Tangent> &
v)
const
337 template<
typename Config>
338 typename Config ::template FixedSegmentReturnType<LieGroup1::NQ>::Type
339 Qo1(
const Eigen::MatrixBase<Config> &
q)
const
344 template<
typename Config>
345 typename Config ::template FixedSegmentReturnType<LieGroup2::NQ>::Type
346 Qo2(
const Eigen::MatrixBase<Config> &
q)
const
351 template<
typename Tangent>
352 typename Tangent::template FixedSegmentReturnType<LieGroup1::NV>::Type
353 Vo1(
const Eigen::MatrixBase<Tangent> &
v)
const
358 template<
typename Tangent>
359 typename Tangent::template FixedSegmentReturnType<LieGroup2::NV>::Type
360 Vo2(
const Eigen::MatrixBase<Tangent> &
v)
const
366 template<
typename Jac>
367 Eigen::Block<Jac, LieGroup1::NV, LieGroup1::NV>
J11(
const Eigen::MatrixBase<Jac> &
J)
const
370 .template topLeftCorner<LieGroup1::NV, LieGroup1::NV>(
lg1.nv(),
lg1.nv());
372 template<
typename Jac>
373 Eigen::Block<Jac, LieGroup1::NV, LieGroup2::NV>
J12(
const Eigen::MatrixBase<Jac> &
J)
const
376 .template topRightCorner<LieGroup1::NV, LieGroup2::NV>(
lg1.nv(),
lg2.nv());
378 template<
typename Jac>
379 Eigen::Block<Jac, LieGroup2::NV, LieGroup1::NV>
J21(
const Eigen::MatrixBase<Jac> &
J)
const
382 .template bottomLeftCorner<LieGroup2::NV, LieGroup1::NV>(
lg2.nv(),
lg1.nv());
384 template<
typename Jac>
385 Eigen::Block<Jac, LieGroup2::NV, LieGroup2::NV>
J22(
const Eigen::MatrixBase<Jac> &
J)
const
388 .template bottomRightCorner<LieGroup2::NV, LieGroup2::NV>(
lg2.nv(),
lg2.nv());
390 #undef REMOVE_IF_EIGEN_TOO_LOW
396 #endif // ifndef __pinocchio_multibody_liegroup_cartesian_product_operation_hpp__